diff options
author | Anna Henningsen <anna@addaleax.net> | 2022-01-14 19:56:15 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-14 19:56:15 +0300 |
commit | c22177f4de6b6198bcb251049c5a293851c3b420 (patch) | |
tree | 6eed706cde9f57efa238dcb84b88cf353fcc02ab /src/node_worker.cc | |
parent | cd075f488aedbbe712a2672e82ca2d1aea3ba5d0 (diff) |
src: use `std::optional` for Worker thread id
Refs: https://github.com/nodejs/node/pull/41421
PR-URL: https://github.com/nodejs/node/pull/41453
Reviewed-By: Tobias Nießen <tniessen@tnie.de>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Michael Dawson <midawson@redhat.com>
Reviewed-By: Darshan Sen <raisinten@gmail.com>
Diffstat (limited to 'src/node_worker.cc')
-rw-r--r-- | src/node_worker.cc | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/node_worker.cc b/src/node_worker.cc index 6e0475511d5..c9743fcf583 100644 --- a/src/node_worker.cc +++ b/src/node_worker.cc @@ -376,10 +376,10 @@ bool Worker::CreateEnvMessagePort(Environment* env) { } void Worker::JoinThread() { - if (thread_joined_) + if (!tid_.has_value()) return; - CHECK_EQ(uv_thread_join(&tid_), 0); - thread_joined_ = true; + CHECK_EQ(uv_thread_join(&tid_.value()), 0); + tid_.reset(); env()->remove_sub_worker_context(this); @@ -406,7 +406,7 @@ void Worker::JoinThread() { MakeCallback(env()->onexit_string(), arraysize(args), args); } - // If we get here, the !thread_joined_ condition at the top of the function + // If we get here, the tid_.has_value() condition at the top of the function // implies that the thread was running. In that case, its final action will // be to schedule a callback on the parent thread which will delete this // object, so there's nothing more to do here. @@ -417,7 +417,7 @@ Worker::~Worker() { CHECK(stopped_); CHECK_NULL(env_); - CHECK(thread_joined_); + CHECK(!tid_.has_value()); Debug(this, "Worker %llu destroyed", thread_id_.id); } @@ -600,7 +600,9 @@ void Worker::StartThread(const FunctionCallbackInfo<Value>& args) { uv_thread_options_t thread_options; thread_options.flags = UV_THREAD_HAS_STACK_SIZE; thread_options.stack_size = w->stack_size_; - int ret = uv_thread_create_ex(&w->tid_, &thread_options, [](void* arg) { + + uv_thread_t* tid = &w->tid_.emplace(); // Create uv_thread_t instance + int ret = uv_thread_create_ex(tid, &thread_options, [](void* arg) { // XXX: This could become a std::unique_ptr, but that makes at least // gcc 6.3 detect undefined behaviour when there shouldn't be any. // gcc 7+ handles this well. @@ -627,7 +629,6 @@ void Worker::StartThread(const FunctionCallbackInfo<Value>& args) { // 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); @@ -635,6 +636,7 @@ void Worker::StartThread(const FunctionCallbackInfo<Value>& args) { w->env()->add_sub_worker_context(w); } else { w->stopped_ = true; + w->tid_.reset(); char err_buf[128]; uv_err_name_r(ret, err_buf, sizeof(err_buf)); @@ -657,7 +659,7 @@ void Worker::StopThread(const FunctionCallbackInfo<Value>& args) { void Worker::Ref(const FunctionCallbackInfo<Value>& args) { Worker* w; ASSIGN_OR_RETURN_UNWRAP(&w, args.This()); - if (!w->has_ref_ && !w->thread_joined_) { + if (!w->has_ref_ && w->tid_.has_value()) { w->has_ref_ = true; w->env()->add_refs(1); } @@ -666,7 +668,7 @@ void Worker::Ref(const FunctionCallbackInfo<Value>& args) { void Worker::Unref(const FunctionCallbackInfo<Value>& args) { Worker* w; ASSIGN_OR_RETURN_UNWRAP(&w, args.This()); - if (w->has_ref_ && !w->thread_joined_) { + if (w->has_ref_ && w->tid_.has_value()) { w->has_ref_ = false; w->env()->add_refs(-1); } |