This repository was archived by the owner on Sep 27, 2021. It is now read-only.
File tree 2 files changed +20
-5
lines changed
2 files changed +20
-5
lines changed Original file line number Diff line number Diff line change @@ -32,6 +32,11 @@ class IsolateRunner implements Runner {
32
32
/// Future returned by [onExit] . Set when [onExit] is first read.
33
33
Future <void >? _onExitFuture;
34
34
35
+ /// Future returned by [close] .
36
+ ///
37
+ /// Avoids hanging if calling [close] twice.
38
+ Future <void >? _closeFuture;
39
+
35
40
/// Create an [IsolateRunner] wrapper for [isolate]
36
41
///
37
42
/// The preferred way to create an `IsolateRunner` is to use [spawn]
@@ -78,9 +83,11 @@ class IsolateRunner implements Runner {
78
83
/// life cycle.
79
84
@override
80
85
Future <void > close () {
86
+ var closeFuture = _closeFuture;
87
+ if (closeFuture != null ) return closeFuture;
81
88
var channel = SingleResponseChannel ();
82
89
_commandPort.send (list2 (_shutdown, channel.port));
83
- return channel.result.then (ignore);
90
+ return _closeFuture = channel.result.then (ignore);
84
91
}
85
92
86
93
/// Kills the isolate.
Original file line number Diff line number Diff line change @@ -10,15 +10,23 @@ import 'package:test/test.dart';
10
10
const _ms = Duration (milliseconds: 1 );
11
11
12
12
void main () {
13
- test ('create-close' , testCreateClose);
13
+ group ('create-close' , testCreateClose);
14
14
test ('create-run-close' , testCreateRunClose);
15
15
test ('separate-isolates' , testSeparateIsolates);
16
16
group ('isolate functions' , testIsolateFunctions);
17
17
}
18
18
19
- Future testCreateClose () {
20
- return IsolateRunner .spawn ().then ((IsolateRunner runner) {
21
- return runner.close ();
19
+ void testCreateClose () {
20
+ test ('simple' , () {
21
+ return IsolateRunner .spawn ().then ((IsolateRunner runner) {
22
+ return runner.close ();
23
+ });
24
+ });
25
+ test ('close twice' , () async {
26
+ var runner = await IsolateRunner .spawn ();
27
+ await runner.close ();
28
+ // Shouldn't hang!
29
+ await runner.close ();
22
30
});
23
31
}
24
32
You can’t perform that action at this time.
0 commit comments