diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/node_messaging.cc | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/node_messaging.cc b/src/node_messaging.cc index 5aec784f60..19065fdb7d 100644 --- a/src/node_messaging.cc +++ b/src/node_messaging.cc @@ -604,11 +604,30 @@ void MessagePort::OnMessage() { HandleScope handle_scope(env()->isolate()); Local<Context> context = object(env()->isolate())->CreationContext(); + size_t processing_limit; + { + Mutex::ScopedLock(data_->mutex_); + processing_limit = std::max(data_->incoming_messages_.size(), + static_cast<size_t>(1000)); + } + // data_ can only ever be modified by the owner thread, so no need to lock. // However, the message port may be transferred while it is processing // messages, so we need to check that this handle still owns its `data_` field // on every iteration. while (data_) { + if (processing_limit-- == 0) { + // Prevent event loop starvation by only processing those messages without + // interruption that were already present when the OnMessage() call was + // first triggered, but at least 1000 messages because otherwise the + // overhead of repeatedly triggering the uv_async_t instance becomes + // noticable, at least on Windows. + // (That might require more investigation by somebody more familiar with + // Windows.) + TriggerAsync(); + return; + } + HandleScope handle_scope(env()->isolate()); Context::Scope context_scope(context); |