diff --git a/lib/src/embedded/compilation_dispatcher.dart b/lib/src/embedded/compilation_dispatcher.dart index e8c3764b5..8f69b2553 100644 --- a/lib/src/embedded/compilation_dispatcher.dart +++ b/lib/src/embedded/compilation_dispatcher.dart @@ -64,8 +64,12 @@ final class CompilationDispatcher { /// Listens for incoming `CompileRequests` and runs their compilations. void listen() { do { - var packet = _mailbox.take(); - if (packet.isEmpty) break; + Uint8List packet; + try { + packet = _mailbox.take(); + } on StateError catch (_) { + break; + } try { var (compilationId, messageBuffer) = parsePacket(packet); @@ -322,12 +326,14 @@ final class CompilationDispatcher { message.id = _outboundRequestId; _send(message); - var packet = _mailbox.take(); - if (packet.isEmpty) { + Uint8List packet; + try { + packet = _mailbox.take(); + } on StateError catch (_) { // Compiler is shutting down, throw without calling `_handleError` as we // don't want to report this as an actual error. _requestError = true; - throw StateError('Compiler is shutting down.'); + rethrow; } try { diff --git a/lib/src/embedded/reusable_isolate.dart b/lib/src/embedded/reusable_isolate.dart index 0ed9eec8c..5cdd6bbd8 100644 --- a/lib/src/embedded/reusable_isolate.dart +++ b/lib/src/embedded/reusable_isolate.dart @@ -122,10 +122,8 @@ class ReusableIsolate { _receivePort.close(); // If the isolate is blocking on [Mailbox.take], it won't even process a - // kill event, so we send an empty message to make sure it wakes up. - try { - _mailbox.put(Uint8List(0)); - } on StateError catch (_) {} + // kill event, so we closed the mailbox to nofity and wake it up. + _mailbox.close(); } } diff --git a/pubspec.yaml b/pubspec.yaml index 1c78769ae..d0b4550e2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: http: "^1.1.0" js: ^0.6.3 meta: ^1.3.0 - native_synchronization: ^0.2.0 + native_synchronization: ^0.3.0 node_interop: ^2.1.0 package_config: ^2.0.0 path: ^1.8.0