mirror of
https://github.com/nodejs/node.git
synced 2026-11-09 15:11:11 -05:00
n-api: detect deadlocks in thread-safe function
We introduce status `napi_would_deadlock` to be used as a return status by `napi_call_threadsafe_function` if the call is made with `napi_tsfn_blocking` on the main thread and the queue is full. PR-URL: https://github.com/nodejs/node/pull/32689 Fixes: https://github.com/nodejs/node/issues/32615 Signed-off-by: Gabriel Schulhof <gabriel.schulhof@intel.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: David Carlier <devnexen@gmail.com> Reviewed-By: Chengzhong Wu <legendecas@gmail.com> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
This commit is contained in:
1 parent
b82d72c199
commit
aeb7084fe6
7 files changed
+100
-10
No files matched your search
@@ -129,6 +129,7 @@ class ThreadSafeFunction : public node::AsyncResource {
|
||||
is_closing(false),
|
||||
context(context_),
|
||||
max_queue_size(max_queue_size_),
|
||||
main_thread(uv_thread_self()),
|
||||
env(env_),
|
||||
finalize_data(finalize_data_),
|
||||
finalize_cb(finalize_cb_),
|
||||
@@ -148,12 +149,15 @@ class ThreadSafeFunction : public node::AsyncResource {
|
||||
|
||||
napi_status Push(void* data, napi_threadsafe_function_call_mode mode) {
|
||||
node::Mutex::ScopedLock lock(this->mutex);
|
||||
uv_thread_t current_thread = uv_thread_self();
|
||||
|
||||
while (queue.size() >= max_queue_size &&
|
||||
max_queue_size > 0 &&
|
||||
!is_closing) {
|
||||
if (mode == napi_tsfn_nonblocking) {
|
||||
return napi_queue_full;
|
||||
} else if (uv_thread_equal(¤t_thread, &main_thread)) {
|
||||
return napi_would_deadlock;
|
||||
}
|
||||
cond->Wait(lock);
|
||||
}
|
||||
@@ -434,6 +438,7 @@ class ThreadSafeFunction : public node::AsyncResource {
|
||||
// means we don't need the mutex to read them.
|
||||
void* context;
|
||||
size_t max_queue_size;
|
||||
uv_thread_t main_thread;
|
||||
|
||||
// These are variables accessed only from the loop thread.
|
||||
v8impl::Persistent<v8::Function> ref;
|
||||
|
||||
Reference in new issue
Block a user