Skip to content

worker: fix interaction of terminate() with messaging port

When a Worker is terminated, its own handle and the public MessagePort are .ref()’ed, so that all relevant events, including the 'exit' events, end up being received.

However, this is problematic if messages end up being queued from the Worker between the beginning of the .terminate() call and its completion, and there are no 'message' event handlers present at that time. In that situation, currently the messages would not end up being processed, and since the MessagePort is still .ref()’ed, it would keep the event loop alive indefinitely.

To fix this:

  • Make sure that all messages end up being received by drainMessagePort(), including cases in which the port had been stopped (i.e. there are no 'message' listeners) and cases in which we exceed the limit for messages being processed in one batch.
  • Unref the Worker’s internal ports manually after the Worker has exited.

Either of these solutions should be solving this on its own, but I think it makes sense to make sure that both of them happen during cleanup.

@nodejs/workers

Merge request reports

Loading