@@ -53,26 +53,33 @@ abstract class BuildRunnerCommandBase extends Command<int> {
53
53
stderr.writeln (new Trace .parse (trace).terse);
54
54
if (exitCode == 0 ) exitCode = 1 ;
55
55
});
56
- await Isolate .spawnUri (buildRunnerScript, arguments, messagePort.sendPort,
57
- onExit: exitPort.sendPort,
58
- onError: errorPort.sendPort,
59
- automaticPackageResolution: true );
60
- StreamSubscription exitCodeListener;
61
- exitCodeListener = messagePort.listen ((isolateExitCode) {
62
- if (isolateExitCode is ! int ) {
63
- throw new StateError (
64
- 'Bad response from isolate, expected an exit code but got '
65
- '$isolateExitCode ' );
66
- }
67
- exitCode = isolateExitCode as int ;
68
- exitCodeListener.cancel ();
69
- exitCodeListener = null ;
70
- });
71
- await exitPort.first;
72
- await errorListener.cancel ();
73
- await exitCodeListener? .cancel ();
74
56
75
- return exitCode;
57
+ try {
58
+ await Isolate .spawnUri (buildRunnerScript, arguments, messagePort.sendPort,
59
+ onExit: exitPort.sendPort,
60
+ onError: errorPort.sendPort,
61
+ automaticPackageResolution: true );
62
+ StreamSubscription exitCodeListener;
63
+ exitCodeListener = messagePort.listen ((isolateExitCode) {
64
+ if (isolateExitCode is ! int ) {
65
+ throw new StateError (
66
+ 'Bad response from isolate, expected an exit code but got '
67
+ '$isolateExitCode ' );
68
+ }
69
+ exitCode = isolateExitCode as int ;
70
+ exitCodeListener.cancel ();
71
+ exitCodeListener = null ;
72
+ });
73
+ await exitPort.first;
74
+ await errorListener.cancel ();
75
+ await exitCodeListener? .cancel ();
76
+
77
+ return exitCode;
78
+ } finally {
79
+ exitPort.close ();
80
+ errorPort.close ();
81
+ messagePort.close ();
82
+ }
76
83
}
77
84
}
78
85
@@ -90,37 +97,43 @@ Future<Uri> _buildRunnerScript() async {
90
97
var exitPort = new ReceivePort ();
91
98
var errorPort = new ReceivePort ();
92
99
93
- await Isolate .spawnUri (dataUri, [], messagePort.sendPort,
94
- onExit: exitPort.sendPort,
95
- onError: errorPort.sendPort,
96
- errorsAreFatal: true ,
97
- packageConfig: new Uri .file (_packagesFileName));
98
-
99
- var allErrorsFuture = errorPort.forEach ((error) {
100
- var errorList = error as List ;
101
- var message = errorList[0 ] as String ;
102
- var stack = new StackTrace .fromString (errorList[1 ] as String );
103
-
104
- stderr.writeln (message);
105
- stderr.writeln (stack);
106
- });
107
-
108
- var items = await Future .wait ([
109
- messagePort.toList (),
110
- allErrorsFuture,
111
- exitPort.first.whenComplete (() {
112
- messagePort.close ();
113
- errorPort.close ();
114
- })
115
- ]);
100
+ try {
101
+ await Isolate .spawnUri (dataUri, [], messagePort.sendPort,
102
+ onExit: exitPort.sendPort,
103
+ onError: errorPort.sendPort,
104
+ errorsAreFatal: true ,
105
+ packageConfig: new Uri .file (_packagesFileName));
116
106
117
- var messages = items[ 0 ] as List ;
118
- if (messages.isEmpty) {
119
- throw new StateError ( 'An error occurred while bootstrapping.' ) ;
120
- }
107
+ var allErrorsFuture = errorPort. forEach ((error) {
108
+ var errorList = error as List ;
109
+ var message = errorList[ 0 ] as String ;
110
+ var stack = new StackTrace . fromString (errorList[ 1 ] as String );
121
111
122
- assert (messages.length == 1 );
123
- return new Uri .file (messages.single as String );
112
+ stderr.writeln (message);
113
+ stderr.writeln (stack);
114
+ });
115
+
116
+ var items = await Future .wait ([
117
+ messagePort.toList (),
118
+ allErrorsFuture,
119
+ exitPort.first.whenComplete (() {
120
+ messagePort.close ();
121
+ errorPort.close ();
122
+ })
123
+ ]);
124
+
125
+ var messages = items[0 ] as List ;
126
+ if (messages.isEmpty) {
127
+ throw new StateError ('An error occurred while bootstrapping.' );
128
+ }
129
+
130
+ assert (messages.length == 1 );
131
+ return new Uri .file (messages.single as String );
132
+ } finally {
133
+ messagePort.close ();
134
+ exitPort.close ();
135
+ errorPort.close ();
136
+ }
124
137
}
125
138
126
139
const _bootstrapScript = r'''
0 commit comments