diff options
author | Anna Henningsen <anna@addaleax.net> | 2020-01-15 19:48:37 +0100 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2020-01-21 23:51:34 +0100 |
commit | 79a45e2cc3b048c3c1ffcc714e13dbf5f3b13b75 (patch) | |
tree | 66f90f1e62a1f493e019558239c5da67f0f0930c /src/env-inl.h | |
parent | 29693b56031b5886989cff820c10967fff6351ba (diff) | |
download | node-new-79a45e2cc3b048c3c1ffcc714e13dbf5f3b13b75.tar.gz |
src: add a threadsafe variant of SetImmediate()
Add a variant of `SetImmediate()` that can be called from any thread.
This allows removing the `AsyncRequest` abstraction and replaces it
with a more generic mechanism.
PR-URL: https://github.com/nodejs/node/pull/31386
Refs: https://github.com/openjs-foundation/summit/pull/240
Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'src/env-inl.h')
-rw-r--r-- | src/env-inl.h | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/env-inl.h b/src/env-inl.h index cf6de689c4..ae4c02b6b2 100644 --- a/src/env-inl.h +++ b/src/env-inl.h @@ -748,6 +748,7 @@ Environment::NativeImmediateQueue::Shift() { if (!head_) tail_ = nullptr; // The queue is now empty. } + size_--; return ret; } @@ -755,6 +756,7 @@ void Environment::NativeImmediateQueue::Push( std::unique_ptr<Environment::NativeImmediateCallback> cb) { NativeImmediateCallback* prev_tail = tail_; + size_++; tail_ = cb.get(); if (prev_tail != nullptr) prev_tail->set_next(std::move(cb)); @@ -774,6 +776,10 @@ void Environment::NativeImmediateQueue::ConcatMove( other.size_ = 0; } +size_t Environment::NativeImmediateQueue::size() const { + return size_.load(); +} + template <typename Fn> void Environment::CreateImmediate(Fn&& cb, bool ref) { auto callback = std::make_unique<NativeImmediateCallbackImpl<Fn>>( @@ -795,6 +801,17 @@ void Environment::SetUnrefImmediate(Fn&& cb) { CreateImmediate(std::move(cb), false); } +template <typename Fn> +void Environment::SetImmediateThreadsafe(Fn&& cb) { + auto callback = std::make_unique<NativeImmediateCallbackImpl<Fn>>( + std::move(cb), false); + { + Mutex::ScopedLock lock(native_immediates_threadsafe_mutex_); + native_immediates_threadsafe_.Push(std::move(callback)); + } + uv_async_send(&task_queues_async_); +} + Environment::NativeImmediateCallback::NativeImmediateCallback(bool refed) : refed_(refed) {} @@ -1164,7 +1181,7 @@ void Environment::RemoveCleanupHook(void (*fn)(void*), void* arg) { inline void Environment::RegisterFinalizationGroupForCleanup( v8::Local<v8::FinalizationGroup> group) { cleanup_finalization_groups_.emplace_back(isolate(), group); - uv_async_send(&cleanup_finalization_groups_async_); + uv_async_send(&task_queues_async_); } size_t CleanupHookCallback::Hash::operator()( |