From cf73be13ab7b1a458c7d37d06a664dc9ae0f6793 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 30 Mar 2020 10:35:16 +0200 Subject: [PATCH] src: clean up worker thread creation code Instead of setting and then in the case of error un-setting properties, only set them when no error occurs. Refs: https://github.com/nodejs/node/pull/32344 PR-URL: https://github.com/nodejs/node/pull/32562 Reviewed-By: Colin Ihrig Reviewed-By: Denys Otrishko Reviewed-By: James M Snell --- src/node_worker.cc | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/node_worker.cc b/src/node_worker.cc index f81daf284dd588..ade29cd60edd69 100644 --- a/src/node_worker.cc +++ b/src/node_worker.cc @@ -592,16 +592,7 @@ void Worker::StartThread(const FunctionCallbackInfo& args) { ASSIGN_OR_RETURN_UNWRAP(&w, args.This()); Mutex::ScopedLock lock(w->mutex_); - // The object now owns the created thread and should not be garbage collected - // until that finishes. - w->ClearWeak(); - - w->env()->add_sub_worker_context(w); w->stopped_ = false; - w->thread_joined_ = false; - - if (w->has_ref_) - w->env()->add_refs(1); uv_thread_options_t thread_options; thread_options.flags = UV_THREAD_HAS_STACK_SIZE; @@ -628,21 +619,27 @@ void Worker::StartThread(const FunctionCallbackInfo& args) { // implicitly delete w }); }, static_cast(w)); - if (ret != 0) { + + if (ret == 0) { + // The object now owns the created thread and should not be garbage + // collected until that finishes. + w->ClearWeak(); + w->thread_joined_ = false; + + if (w->has_ref_) + w->env()->add_refs(1); + + w->env()->add_sub_worker_context(w); + } else { + w->stopped_ = true; + char err_buf[128]; uv_err_name_r(ret, err_buf, sizeof(err_buf)); - w->custom_error_ = "ERR_WORKER_INIT_FAILED"; - w->custom_error_str_ = err_buf; - w->loop_init_failed_ = true; - w->thread_joined_ = true; - w->stopped_ = true; - w->env()->remove_sub_worker_context(w); { Isolate* isolate = w->env()->isolate(); HandleScope handle_scope(isolate); THROW_ERR_WORKER_INIT_FAILED(isolate, err_buf); } - w->MakeWeak(); } }