aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/javascript/jsc/javascript.zig15
-rw-r--r--src/javascript/jsc/webcore/response.zig1
2 files changed, 11 insertions, 5 deletions
diff --git a/src/javascript/jsc/javascript.zig b/src/javascript/jsc/javascript.zig
index f185a720c..9807c8436 100644
--- a/src/javascript/jsc/javascript.zig
+++ b/src/javascript/jsc/javascript.zig
@@ -779,8 +779,13 @@ pub const VirtualMachine = struct {
}
pub fn tick(this: *VirtualMachine) void {
- this.global.vm().drainMicrotasks();
- _ = this.eventLoopTick();
+ while (this.eventLoopTick() > 0) {}
+ }
+
+ pub fn waitForTasks(this: *VirtualMachine) void {
+ while (this.pending_tasks_count.load(.Monotonic) > 0 or this.ready_tasks_count.load(.Monotonic) > 0) {
+ while (this.eventLoopTick() > 0) {}
+ }
}
// 👶👶👶 event loop 👶👶👶
@@ -793,6 +798,7 @@ pub const VirtualMachine = struct {
.Microtask => {
var micro: *Microtask = task.get(Microtask).?;
_ = this.microtasks_queue.swapRemove(i);
+ _ = this.pending_tasks_count.fetchSub(1, .Monotonic);
micro.run(this.global);
finished += 1;
@@ -802,6 +808,7 @@ pub const VirtualMachine = struct {
var fetch_task: *Fetch.FetchTasklet = task.get(Fetch.FetchTasklet).?;
if (fetch_task.status == .done) {
_ = this.ready_tasks_count.fetchSub(1, .Monotonic);
+ _ = this.pending_tasks_count.fetchSub(1, .Monotonic);
_ = this.microtasks_queue.swapRemove(i);
fetch_task.onDone();
finished += 1;
@@ -1951,7 +1958,7 @@ pub const EventListenerMixin = struct {
var result = js.JSObjectCallAsFunctionReturnValue(vm.global.ref(), listener_ref, null, 1, &fetch_args);
var promise = JSPromise.resolvedPromise(vm.global, result);
- vm.tick();
+ vm.waitForTasks();
if (fetch_event.rejected) return;
@@ -1962,7 +1969,7 @@ pub const EventListenerMixin = struct {
_ = promise.result(vm.global.vm());
}
- vm.tick();
+ vm.waitForTasks();
if (fetch_event.request_context.has_called_done) {
break;
diff --git a/src/javascript/jsc/webcore/response.zig b/src/javascript/jsc/webcore/response.zig
index dfb994492..065ab9884 100644
--- a/src/javascript/jsc/webcore/response.zig
+++ b/src/javascript/jsc/webcore/response.zig
@@ -611,7 +611,6 @@ pub const Fetch = struct {
var task: *FetchTasklet = @fieldParentPtr(FetchTasklet, "http", http_);
@atomicStore(Status, &task.status, Status.done, .Monotonic);
_ = task.javascript_vm.ready_tasks_count.fetchAdd(1, .Monotonic);
- _ = task.javascript_vm.pending_tasks_count.fetchSub(1, .Monotonic);
sender.release();
}
};