From 8a8a23c5d64129a3cefebbbb43974d408f91fd13 Mon Sep 17 00:00:00 2001 From: Alistair Smith Date: Fri, 30 May 2025 13:42:32 -0700 Subject: [PATCH] xchanges --- src/bun.js/bindings/webcore/MessagePort.cpp | 13 +++++++------ src/bun.js/event_loop.zig | 6 ++++++ src/bun.js/virtual_machine_exports.zig | 3 +-- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/bun.js/bindings/webcore/MessagePort.cpp b/src/bun.js/bindings/webcore/MessagePort.cpp index 5b14ea776a..6cd0c90d76 100644 --- a/src/bun.js/bindings/webcore/MessagePort.cpp +++ b/src/bun.js/bindings/webcore/MessagePort.cpp @@ -244,7 +244,7 @@ void MessagePort::close() removeAllEventListeners(); } -// Helper function to process a batch of messages and recursively post tasks for remaining messages +// at MOST 1000 messages per event loop tick so we dont starve the event loop void MessagePort::processMessageBatch(ScriptExecutionContext& context, Vector&& messages, Function&& completionCallback) { constexpr size_t maxMessagesPerTick = 1000; size_t messageCount = messages.size(); @@ -267,9 +267,9 @@ void MessagePort::processMessageBatch(ScriptExecutionContext& context, VectordrainMicrotasks(); - } + // } } if (messageCount > maxMessagesPerTick) { @@ -279,10 +279,11 @@ void MessagePort::processMessageBatch(ScriptExecutionContext& context, VectorprocessMessageBatch(ctx, WTFMove(remaining), WTFMove(completionCallback)); - }); + } + ); } else { completionCallback(); } diff --git a/src/bun.js/event_loop.zig b/src/bun.js/event_loop.zig index 58b149db96..47b5a3a078 100644 --- a/src/bun.js/event_loop.zig +++ b/src/bun.js/event_loop.zig @@ -532,6 +532,12 @@ pub fn enqueueImmediateTask(this: *EventLoop, task: *Timer.ImmediateObject) void bun.handleOom(this.immediate_tasks.append(bun.default_allocator, task)); } +pub fn enqueueImmediateCppTask(this: *EventLoop, task: *jsc.CppTask) void { + // For now, just enqueue as a regular task + // TODO: implement proper immediate C++ task handling + this.enqueueTask(jsc.Task.init(task)); +} + pub fn ensureWaker(this: *EventLoop) void { jsc.markBinding(@src()); if (this.virtual_machine.event_loop_handle == null) { diff --git a/src/bun.js/virtual_machine_exports.zig b/src/bun.js/virtual_machine_exports.zig index 87e5b3d4d8..363607c83c 100644 --- a/src/bun.js/virtual_machine_exports.zig +++ b/src/bun.js/virtual_machine_exports.zig @@ -81,8 +81,7 @@ pub export fn Bun__queueTask(global: *JSGlobalObject, task: *jsc.CppTask) void { pub export fn Bun__queueImmediateCppTask(global: *JSGlobalObject, task: *jsc.CppTask) void { jsc.markBinding(@src()); - // TODO: implement enqueueImmediateCppTask - global.bunVM().eventLoop().enqueueTask(jsc.Task.init(task)); + global.bunVM().eventLoop().enqueueImmediateCppTask(task); } pub export fn Bun__queueTaskWithTimeout(global: *JSGlobalObject, task: *jsc.CppTask, milliseconds: i32) void {