aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-07-28 20:34:57 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-07-28 20:34:57 -0700
commit53cc4df191aa823c3a5c5a2a377701439a2d3f89 (patch)
treef5e75067ed4a065072974c844f68d4ac20fc7236
parent05716ff39b5db10f2ef8b7b212e77ac3d50e2d16 (diff)
downloadbun-53cc4df191aa823c3a5c5a2a377701439a2d3f89.tar.gz
bun-53cc4df191aa823c3a5c5a2a377701439a2d3f89.tar.zst
bun-53cc4df191aa823c3a5c5a2a377701439a2d3f89.zip
Defer task destructionbun-v0.7.1
-rw-r--r--src/bun.js/event_loop.zig18
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;
}