aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc/javascript.zig
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-03-08 18:14:26 -0800
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-03-08 18:14:26 -0800
commit33950c0ae7f19c57bdbbb49ddcdd7b055ca0e5e0 (patch)
tree6c61ed243094070357bbe3bfd6ff1faf8065e0b0 /src/javascript/jsc/javascript.zig
parent99ebef0b2f6ee6f8257214b06148f2e2b72def74 (diff)
downloadbun-33950c0ae7f19c57bdbbb49ddcdd7b055ca0e5e0.tar.gz
bun-33950c0ae7f19c57bdbbb49ddcdd7b055ca0e5e0.tar.zst
bun-33950c0ae7f19c57bdbbb49ddcdd7b055ca0e5e0.zip
Fix https://github.com/Jarred-Sumner/bun/issues/122
Diffstat (limited to '')
-rw-r--r--src/javascript/jsc/javascript.zig14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/javascript/jsc/javascript.zig b/src/javascript/jsc/javascript.zig
index 852c53562..00473d1a2 100644
--- a/src/javascript/jsc/javascript.zig
+++ b/src/javascript/jsc/javascript.zig
@@ -1264,6 +1264,7 @@ pub const Bun = struct {
}
VirtualMachine.vm.allocator.destroy(this);
VirtualMachine.vm.timer.active -|= 1;
+ VirtualMachine.vm.active_tasks -|= 1;
}
};
@@ -1281,6 +1282,7 @@ pub const Bun = struct {
var task = try Timeout.TimeoutTask.createOnJSThread(VirtualMachine.vm.allocator, globalThis, timeout);
VirtualMachine.vm.timer.timeouts.put(VirtualMachine.vm.allocator, id, timeout) catch unreachable;
VirtualMachine.vm.timer.active +|= 1;
+ VirtualMachine.vm.active_tasks +|= 1;
task.schedule();
}
@@ -1606,6 +1608,7 @@ pub fn ConcurrentPromiseTask(comptime Context: type) type {
.globalThis = globalThis,
};
js.JSValueProtect(globalThis.ref(), this.promise.asObjectRef());
+ VirtualMachine.vm.active_tasks +|= 1;
return this;
}
@@ -1804,6 +1807,7 @@ pub const VirtualMachine = struct {
argv: []const []const u8 = &[_][]const u8{"bun"},
origin_timer: std.time.Timer = undefined,
+ active_tasks: usize = 0,
macro_event_loop: EventLoop = EventLoop{},
regular_event_loop: EventLoop = EventLoop{},
@@ -1823,11 +1827,13 @@ pub const VirtualMachine = struct {
concurrent_tasks: Queue = undefined,
concurrent_lock: Lock = Lock.init(),
global: *JSGlobalObject = undefined,
+ virtual_machine: *VirtualMachine = undefined,
pub const Queue = std.fifo.LinearFifo(Task, .Dynamic);
pub fn tickWithCount(this: *EventLoop) u32 {
var finished: u32 = 0;
var global = this.global;
+ var vm_ = this.virtual_machine;
while (this.tasks.readItem()) |task| {
switch (task.tag()) {
.Microtask => {
@@ -1839,12 +1845,14 @@ pub const VirtualMachine = struct {
var fetch_task: *Fetch.FetchTasklet = task.get(Fetch.FetchTasklet).?;
fetch_task.onDone();
finished += 1;
+ vm_.active_tasks -|= 1;
},
@field(Task.Tag, @typeName(AsyncTransformTask)) => {
var transform_task: *AsyncTransformTask = task.get(AsyncTransformTask).?;
transform_task.*.runFromJS();
transform_task.deinit();
finished += 1;
+ vm_.active_tasks -|= 1;
},
@field(Task.Tag, @typeName(BunTimerTimeoutTask)) => {
var transform_task: *BunTimerTimeoutTask = task.get(BunTimerTimeoutTask).?;
@@ -1937,6 +1945,7 @@ pub const VirtualMachine = struct {
this.has_enabled_macro_mode = true;
this.macro_event_loop.tasks = EventLoop.Queue.init(default_allocator);
this.macro_event_loop.global = this.global;
+ this.macro_event_loop.virtual_machine = this;
this.macro_event_loop.concurrent_tasks = EventLoop.Queue.init(default_allocator);
}
@@ -2009,7 +2018,9 @@ pub const VirtualMachine = struct {
.origin_timer = std.time.Timer.start() catch @panic("Please don't mess with timers."),
};
- VirtualMachine.vm.regular_event_loop.tasks = EventLoop.Queue.init(default_allocator);
+ VirtualMachine.vm.regular_event_loop.tasks = EventLoop.Queue.init(
+ default_allocator,
+ );
VirtualMachine.vm.regular_event_loop.concurrent_tasks = EventLoop.Queue.init(default_allocator);
VirtualMachine.vm.event_loop = &VirtualMachine.vm.regular_event_loop;
@@ -2034,6 +2045,7 @@ pub const VirtualMachine = struct {
vm.console,
);
VirtualMachine.vm.regular_event_loop.global = VirtualMachine.vm.global;
+ VirtualMachine.vm.regular_event_loop.virtual_machine = VirtualMachine.vm;
VirtualMachine.vm_loaded = true;
if (source_code_printer == null) {