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: #25847
Fixes: #25702
Fixes: #24005
Fixes: #23873

PR-URL: #25907
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Richard Lau <riclau@uk.ibm.com>
Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
addaleax committed Feb 5, 2019
1 parent 9bbe29d commit 63ab542
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 63ab542

Please sign in to comment.