worker: refactor thread life cycle management
The current mechanism uses two async handles, one owned by the creator of the worker thread to terminate a running worker, and another one employed by the worker to interrupt its creator on its natural termination. The force termination piggybacks on the message- passing mechanism to inform the worker to quiesce.
Also there are few flags that represent the other thread's state / request state because certain code path is shared by multiple control flows, and there are certain code path where the async handles may not have come to life.
Refactor into a LoopStopper abstraction that exposes routines to install a handle as well as to save a state.
Refs: https://github.com/nodejs/node/pull/21283
The approach can be re-used for stopping the main Node application thread in-flight.
cc @addaleax @nodejs/workers
Checklist
-
make -j4 test
(UNIX), orvcbuild test
(Windows) passes -
tests and/or benchmarks are included -
documentation is changed or added -
commit message follows commit guidelines