Skip to content

Commit

Permalink
worker,etw: only enable ETW on the main thread
Browse files Browse the repository at this point in the history
The Windows ETW code is not written to be compatible with multi-threading,
and in particular it relies on global state like a single static
`uv_async_t`. Adding that to multiple threads would corrupt the
corresponding loops' handle queues.

This addresses the flakiness of at least `test-worker-exit-code` and
very likely other flaky tests that relate to Worker threads on Windows as well.

Fixes: nodejs#25847
Fixes: nodejs#25702
Fixes: nodejs#24005
Fixes: nodejs#23873
  • Loading branch information
addaleax committed Feb 3, 2019
1 parent d0bce9a commit b8624ab
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion src/node_dtrace.cc
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,11 @@ void InitDTrace(Environment* env, Local<Object> target) {
}

#ifdef HAVE_ETW
init_etw();
// ETW is neither thread-safe nor does it clean up resources on exit,
// so we can use it only on the main thread.
if (env->is_main_thread()) {
init_etw();
}
#endif

#if defined HAVE_DTRACE || defined HAVE_ETW
Expand Down

0 comments on commit b8624ab

Please sign in to comment.