summaryrefslogtreecommitdiff
path: root/src/env-inl.h
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2020-01-15 19:48:37 +0100
committerAnna Henningsen <anna@addaleax.net>2020-01-21 23:51:34 +0100
commit79a45e2cc3b048c3c1ffcc714e13dbf5f3b13b75 (patch)
tree66f90f1e62a1f493e019558239c5da67f0f0930c /src/env-inl.h
parent29693b56031b5886989cff820c10967fff6351ba (diff)
downloadnode-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.h19
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()(