@@ -376,10 +376,10 @@ bool Worker::CreateEnvMessagePort(Environment* env) {
376376}
377377
378378void Worker::JoinThread () {
379- if (thread_joined_ )
379+ if (!tid_. has_value () )
380380 return ;
381- CHECK_EQ (uv_thread_join (&tid_), 0 );
382- thread_joined_ = true ;
381+ CHECK_EQ (uv_thread_join (&tid_. value () ), 0 );
382+ tid_. reset () ;
383383
384384 env ()->remove_sub_worker_context (this );
385385
@@ -406,7 +406,7 @@ void Worker::JoinThread() {
406406 MakeCallback (env ()->onexit_string (), arraysize (args), args);
407407 }
408408
409- // If we get here, the !thread_joined_ condition at the top of the function
409+ // If we get here, the tid_.has_value() condition at the top of the function
410410 // implies that the thread was running. In that case, its final action will
411411 // be to schedule a callback on the parent thread which will delete this
412412 // object, so there's nothing more to do here.
@@ -417,7 +417,7 @@ Worker::~Worker() {
417417
418418 CHECK (stopped_);
419419 CHECK_NULL (env_);
420- CHECK (thread_joined_ );
420+ CHECK (!tid_. has_value () );
421421
422422 Debug (this , " Worker %llu destroyed" , thread_id_.id );
423423}
@@ -598,7 +598,9 @@ void Worker::StartThread(const FunctionCallbackInfo<Value>& args) {
598598 uv_thread_options_t thread_options;
599599 thread_options.flags = UV_THREAD_HAS_STACK_SIZE;
600600 thread_options.stack_size = w->stack_size_ ;
601- int ret = uv_thread_create_ex (&w->tid_ , &thread_options, [](void * arg) {
601+
602+ uv_thread_t * tid = &w->tid_ .emplace (); // Create uv_thread_t instance
603+ int ret = uv_thread_create_ex (tid, &thread_options, [](void * arg) {
602604 // XXX: This could become a std::unique_ptr, but that makes at least
603605 // gcc 6.3 detect undefined behaviour when there shouldn't be any.
604606 // gcc 7+ handles this well.
@@ -625,14 +627,14 @@ void Worker::StartThread(const FunctionCallbackInfo<Value>& args) {
625627 // The object now owns the created thread and should not be garbage
626628 // collected until that finishes.
627629 w->ClearWeak ();
628- w->thread_joined_ = false ;
629630
630631 if (w->has_ref_ )
631632 w->env ()->add_refs (1 );
632633
633634 w->env ()->add_sub_worker_context (w);
634635 } else {
635636 w->stopped_ = true ;
637+ w->tid_ .reset ();
636638
637639 char err_buf[128 ];
638640 uv_err_name_r (ret, err_buf, sizeof (err_buf));
@@ -655,7 +657,7 @@ void Worker::StopThread(const FunctionCallbackInfo<Value>& args) {
655657void Worker::Ref (const FunctionCallbackInfo<Value>& args) {
656658 Worker* w;
657659 ASSIGN_OR_RETURN_UNWRAP (&w, args.This ());
658- if (!w->has_ref_ && ! w->thread_joined_ ) {
660+ if (!w->has_ref_ && w->tid_ . has_value () ) {
659661 w->has_ref_ = true ;
660662 w->env ()->add_refs (1 );
661663 }
@@ -664,7 +666,7 @@ void Worker::Ref(const FunctionCallbackInfo<Value>& args) {
664666void Worker::Unref (const FunctionCallbackInfo<Value>& args) {
665667 Worker* w;
666668 ASSIGN_OR_RETURN_UNWRAP (&w, args.This ());
667- if (w->has_ref_ && ! w->thread_joined_ ) {
669+ if (w->has_ref_ && w->tid_ . has_value () ) {
668670 w->has_ref_ = false ;
669671 w->env ()->add_refs (-1 );
670672 }
0 commit comments