Chromium Code Reviews

Unified Diff: lib/src/runner/browser/compiler_pool.dart

Issue 1056733002: Run test tearDowns and clean up temporary directories when a signal is caught. (Closed) Base URL: git@github.com:dart-lang/test@master
Patch Set: Code review changes Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
« no previous file with comments | « lib/src/frontend/expect.dart ('k') | lib/src/runner/browser/iframe_listener.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/runner/browser/compiler_pool.dart
diff --git a/lib/src/runner/browser/compiler_pool.dart b/lib/src/runner/browser/compiler_pool.dart
index e5ba0565fe9e48b7124973a2fe34974ebbef4b6c..a424151af93fda56f221f1d07a48e93a325f7f07 100644
--- a/lib/src/runner/browser/compiler_pool.dart
+++ b/lib/src/runner/browser/compiler_pool.dart
@@ -35,6 +35,12 @@ class CompilerPool {
/// emitted once they become visible.
final _compilers = new Queue<_Compiler>();
+ /// Whether [close] has been called.
+ bool get _closed => _closeCompleter != null;
+
+ /// The completer for the [Future] returned by [close].
+ Completer _closeCompleter;
+
/// Creates a compiler pool that runs up to [parallel] instances of `dart2js`
/// at once.
///
@@ -55,6 +61,8 @@ class CompilerPool {
/// *and* all its output has been printed to the command line.
Future compile(String dartPath, String jsPath, {String packageRoot}) {
return _pool.withResource(() {
+ if (_closed) return null;
+
return withTempDir((dir) {
var wrapperPath = p.join(dir, "runInBrowser.dart");
new File(wrapperPath).writeAsStringSync('''
@@ -103,12 +111,18 @@ void main(_) {
compiler.process.stdout.listen(stdout.add).asFuture(),
compiler.process.stderr.listen(stderr.add).asFuture(),
compiler.process.exitCode.then((exitCode) {
- if (exitCode == 0) return;
+ if (exitCode == 0 || _closed) return;
throw new LoadException(compiler.path, "dart2js failed.");
})
- ]).then(compiler.onDoneCompleter.complete)
- .catchError(compiler.onDoneCompleter.completeError)
- .then((_) {
+ ]).then((_) {
+ if (_closed) return;
+ compiler.onDoneCompleter.complete();
+ }).catchError((error, stackTrace) {
+ if (_closed) return;
+ compiler.onDoneCompleter.completeError(error, stackTrace);
+ }).then((_) {
+ if (_closed) return;
+
_compilers.removeFirst();
if (_compilers.isEmpty) return;
@@ -119,6 +133,24 @@ void main(_) {
Timer.run(() => _showProcess(next));
});
}
+
+ /// Closes the compiler pool.
+ ///
+ /// This kills all currently-running compilers and ensures that no more will
+ /// be started. It returns a [Future] that completes once all the compilers
+ /// have been killed and all resources released.
+ Future close() {
+ if (_closed) return _closeCompleter.future;
+ _closeCompleter = new Completer();
+
+ return Future.wait(_compilers.map((compiler) {
+ compiler.process.kill();
+ return compiler.process.exitCode.then(compiler.onDoneCompleter.complete);
+ })).then((_) {
+ _compilers.clear();
+ _closeCompleter.complete();
+ }).catchError(_closeCompleter.completeError);
+ }
}
/// A running instance of `dart2js`.
« no previous file with comments | « lib/src/frontend/expect.dart ('k') | lib/src/runner/browser/iframe_listener.dart » ('j') | no next file with comments »

Powered by Google App Engine