Skip to content

Commit

Permalink
Fix dart vm lockup during shutdown with pending requests
Browse files Browse the repository at this point in the history
  • Loading branch information
ntkme committed Jul 12, 2024
1 parent be9c3ac commit 4a9a951
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 9 deletions.
16 changes: 11 additions & 5 deletions lib/src/embedded/compilation_dispatcher.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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 {
Expand Down
6 changes: 2 additions & 4 deletions lib/src/embedded/reusable_isolate.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}

Expand Down

0 comments on commit 4a9a951

Please sign in to comment.