Skip to content

Commit d618064

Browse files
committed
Better isolates
1 parent d76b861 commit d618064

File tree

4 files changed

+38
-13
lines changed

4 files changed

+38
-13
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 3.8.2
2+
3+
- Updated Isolate spawn logic to close gracefully
4+
15
## 3.8.1
26

37
- Updated binaries to v1.10.3

lib/bridge/binding.dart

+28-12
Original file line numberDiff line numberDiff line change
@@ -27,24 +27,40 @@ class Binding {
2727
_library = openLib();
2828
}
2929

30-
static callBridge(IsolateArguments args) async {
30+
static void callBridge(IsolateArguments args) async {
3131
var result = await Binding().call(args.name, args.payload);
3232
args.port.send(result);
3333
}
3434

3535
Future<Uint8List> callAsync(String name, Uint8List payload) async {
36-
final port = ReceivePort();
36+
final port = ReceivePort('${_libraryName}_port');
3737
final args = IsolateArguments(name, payload, port.sendPort);
38+
final completer = new Completer<Uint8List>();
39+
40+
final isolate = await Isolate.spawn(
41+
callBridge,
42+
args,
43+
errorsAreFatal: false,
44+
debugName: '${_libraryName}_isolate',
45+
onError: port.sendPort,
46+
);
47+
48+
port.listen(
49+
(message) async {
50+
if (message is Uint8List) {
51+
completer.complete(message);
52+
} else if (message is List) {
53+
completer.completeError(message.firstOrNull ?? "internal error");
54+
} else {
55+
completer.completeError(message ?? "spawn error");
56+
}
57+
port.close();
58+
},
59+
onDone: () {
60+
isolate.kill(priority: Isolate.beforeNextEvent);
61+
},
62+
);
3863

39-
final isolate = await Isolate.spawn(callBridge, args);
40-
41-
Completer<Uint8List> completer = new Completer();
42-
43-
port.listen((message) async {
44-
completer.complete(message);
45-
port.close();
46-
isolate.kill();
47-
});
4864
return completer.future;
4965
}
5066

@@ -66,7 +82,7 @@ class Binding {
6682
final result = callable(namePointer, payloadPointer, payload.length);
6783

6884
malloc.free(namePointer);
69-
malloc.free(payloadPointer);
85+
malloc.free(pointer);
7086

7187
handleError(result.ref.error, result);
7288

lib/openpgp.dart

+5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ class OpenPGPException implements Exception {
1010
String cause;
1111

1212
OpenPGPException(this.cause);
13+
14+
@override
15+
String toString() {
16+
return 'OpenPGPException: $cause';
17+
}
1318
}
1419

1520
enum Hash { SHA256, SHA224, SHA384, SHA512 }

pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: openpgp
22
description: library for use OpenPGP with support for android and ios, macOS, linux, windows and web
3-
version: 3.8.1
3+
version: 3.8.2
44
homepage: https://github.com/jerson/flutter-openpgp
55

66
environment:

0 commit comments

Comments
 (0)