diff options
author | 2023-07-28 20:34:57 -0700 | |
---|---|---|
committer | 2023-07-28 20:34:57 -0700 | |
commit | 53cc4df191aa823c3a5c5a2a377701439a2d3f89 (patch) | |
tree | f5e75067ed4a065072974c844f68d4ac20fc7236 /src/bun.js/event_loop.zig | |
parent | 05716ff39b5db10f2ef8b7b212e77ac3d50e2d16 (diff) | |
download | bun-53cc4df191aa823c3a5c5a2a377701439a2d3f89.tar.gz bun-53cc4df191aa823c3a5c5a2a377701439a2d3f89.tar.zst bun-53cc4df191aa823c3a5c5a2a377701439a2d3f89.zip |
Defer task destructionbun-v0.7.1
Diffstat (limited to '')
-rw-r--r-- | src/bun.js/event_loop.zig | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/bun.js/event_loop.zig b/src/bun.js/event_loop.zig index 82f26261d..a59deb19d 100644 --- a/src/bun.js/event_loop.zig +++ b/src/bun.js/event_loop.zig @@ -619,14 +619,30 @@ pub const EventLoop = struct { this.tasks.ensureUnusedCapacity(count) catch unreachable; var writable = this.tasks.writableSlice(0); + + // Defer destruction of the ConcurrentTask to avoid issues with pointer aliasing + var to_destroy: ?*ConcurrentTask = null; + while (iter.next()) |task| { + if (to_destroy) |dest| { + bun.default_allocator.destroy(dest); + to_destroy = null; + } + + if (task.auto_delete) { + to_destroy = task; + } + writable[0] = task.task; writable = writable[1..]; this.tasks.count += 1; - if (task.auto_delete) bun.default_allocator.destroy(task); if (writable.len == 0) break; } + if (to_destroy) |dest| { + bun.default_allocator.destroy(dest); + } + return this.tasks.count - start_count; } |