@@ -376,10 +376,10 @@ bool Worker::CreateEnvMessagePort(Environment* env) {
376
376
}
377
377
378
378
void Worker::JoinThread () {
379
- if (thread_joined_ )
379
+ if (!tid_. has_value () )
380
380
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 () ;
383
383
384
384
env ()->remove_sub_worker_context (this );
385
385
@@ -406,7 +406,7 @@ void Worker::JoinThread() {
406
406
MakeCallback (env ()->onexit_string (), arraysize (args), args);
407
407
}
408
408
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
410
410
// implies that the thread was running. In that case, its final action will
411
411
// be to schedule a callback on the parent thread which will delete this
412
412
// object, so there's nothing more to do here.
@@ -417,7 +417,7 @@ Worker::~Worker() {
417
417
418
418
CHECK (stopped_);
419
419
CHECK_NULL (env_);
420
- CHECK (thread_joined_ );
420
+ CHECK (!tid_. has_value () );
421
421
422
422
Debug (this , " Worker %llu destroyed" , thread_id_.id );
423
423
}
@@ -600,7 +600,9 @@ void Worker::StartThread(const FunctionCallbackInfo<Value>& args) {
600
600
uv_thread_options_t thread_options;
601
601
thread_options.flags = UV_THREAD_HAS_STACK_SIZE;
602
602
thread_options.stack_size = w->stack_size_ ;
603
- int ret = uv_thread_create_ex (&w->tid_ , &thread_options, [](void * arg) {
603
+
604
+ uv_thread_t * tid = &w->tid_ .emplace (); // Create uv_thread_t instance
605
+ int ret = uv_thread_create_ex (tid, &thread_options, [](void * arg) {
604
606
// XXX: This could become a std::unique_ptr, but that makes at least
605
607
// gcc 6.3 detect undefined behaviour when there shouldn't be any.
606
608
// gcc 7+ handles this well.
@@ -627,14 +629,14 @@ void Worker::StartThread(const FunctionCallbackInfo<Value>& args) {
627
629
// The object now owns the created thread and should not be garbage
628
630
// collected until that finishes.
629
631
w->ClearWeak ();
630
- w->thread_joined_ = false ;
631
632
632
633
if (w->has_ref_ )
633
634
w->env ()->add_refs (1 );
634
635
635
636
w->env ()->add_sub_worker_context (w);
636
637
} else {
637
638
w->stopped_ = true ;
639
+ w->tid_ .reset ();
638
640
639
641
char err_buf[128 ];
640
642
uv_err_name_r (ret, err_buf, sizeof (err_buf));
@@ -657,7 +659,7 @@ void Worker::StopThread(const FunctionCallbackInfo<Value>& args) {
657
659
void Worker::Ref (const FunctionCallbackInfo<Value>& args) {
658
660
Worker* w;
659
661
ASSIGN_OR_RETURN_UNWRAP (&w, args.This ());
660
- if (!w->has_ref_ && ! w->thread_joined_ ) {
662
+ if (!w->has_ref_ && w->tid_ . has_value () ) {
661
663
w->has_ref_ = true ;
662
664
w->env ()->add_refs (1 );
663
665
}
@@ -666,7 +668,7 @@ void Worker::Ref(const FunctionCallbackInfo<Value>& args) {
666
668
void Worker::Unref (const FunctionCallbackInfo<Value>& args) {
667
669
Worker* w;
668
670
ASSIGN_OR_RETURN_UNWRAP (&w, args.This ());
669
- if (w->has_ref_ && ! w->thread_joined_ ) {
671
+ if (w->has_ref_ && w->tid_ . has_value () ) {
670
672
w->has_ref_ = false ;
671
673
w->env ()->add_refs (-1 );
672
674
}
0 commit comments