diff options
author | 2023-09-15 01:39:42 -0700 | |
---|---|---|
committer | 2023-09-15 01:39:42 -0700 | |
commit | d26addeca147e076d7a5e2c7fe14febdd658393f (patch) | |
tree | 65e9669db623ea9201b0dc5176a18925fad6c08b /src/bun.js/base.zig | |
parent | f84fbd6e3eafe298be4a88685a5edbc1724753fd (diff) | |
download | bun-d26addeca147e076d7a5e2c7fe14febdd658393f.tar.gz bun-d26addeca147e076d7a5e2c7fe14febdd658393f.tar.zst bun-d26addeca147e076d7a5e2c7fe14febdd658393f.zip |
dup and close file descriptors (#5341)
* track one shot fds
* dup fd
* skip for rearm on mac
* dup if fd
* cleanup
* force unregister on close
* deinitForceUnregister
* test
* add prompts
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Diffstat (limited to 'src/bun.js/base.zig')
-rw-r--r-- | src/bun.js/base.zig | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/bun.js/base.zig b/src/bun.js/base.zig index a6df36c4f..26d5d74c3 100644 --- a/src/bun.js/base.zig +++ b/src/bun.js/base.zig @@ -1787,12 +1787,19 @@ pub const FilePoll = struct { pub fn deinit(this: *FilePoll) void { var vm = JSC.VirtualMachine.get(); - this.deinitWithVM(vm); + var loop = vm.event_loop_handle.?; + this.deinitPossiblyDefer(vm, loop, vm.rareData().filePolls(vm), false); + } + + pub fn deinitForceUnregister(this: *FilePoll) void { + var vm = JSC.VirtualMachine.get(); + var loop = vm.event_loop_handle.?; + this.deinitPossiblyDefer(vm, loop, vm.rareData().filePolls(vm), true); } - fn deinitPossiblyDefer(this: *FilePoll, vm: *JSC.VirtualMachine, loop: *uws.Loop, polls: *JSC.FilePoll.Store) void { + fn deinitPossiblyDefer(this: *FilePoll, vm: *JSC.VirtualMachine, loop: *uws.Loop, polls: *JSC.FilePoll.Store, force_unregister: bool) void { if (this.isRegistered()) { - _ = this.unregister(loop); + _ = this.unregister(loop, force_unregister); } this.owner = Deactivated.owner; @@ -1804,7 +1811,7 @@ pub const FilePoll = struct { pub fn deinitWithVM(this: *FilePoll, vm: *JSC.VirtualMachine) void { var loop = vm.event_loop_handle.?; - this.deinitPossiblyDefer(vm, loop, vm.rareData().filePolls(vm)); + this.deinitPossiblyDefer(vm, loop, vm.rareData().filePolls(vm), false); } pub fn isRegistered(this: *const FilePoll) bool { @@ -2168,10 +2175,12 @@ pub const FilePoll = struct { var event = linux.epoll_event{ .events = flags, .data = .{ .u64 = @intFromPtr(Pollable.init(this).ptr()) } }; + var op: u32 = if (this.isRegistered() or this.flags.contains(.needs_rearm)) linux.EPOLL.CTL_MOD else linux.EPOLL.CTL_ADD; + const ctl = linux.epoll_ctl( watcher_fd, - if (this.isRegistered() or this.flags.contains(.needs_rearm)) linux.EPOLL.CTL_MOD else linux.EPOLL.CTL_ADD, - @as(std.os.fd_t, @intCast(fd)), + op, + @intCast(fd), &event, ); this.flags.insert(.was_ever_registered); @@ -2285,11 +2294,11 @@ pub const FilePoll = struct { const invalid_fd = bun.invalid_fd; - pub fn unregister(this: *FilePoll, loop: *uws.Loop) JSC.Maybe(void) { - return this.unregisterWithFd(loop, this.fd); + pub fn unregister(this: *FilePoll, loop: *uws.Loop, force_unregister: bool) JSC.Maybe(void) { + return this.unregisterWithFd(loop, this.fd, force_unregister); } - pub fn unregisterWithFd(this: *FilePoll, loop: *uws.Loop, fd: bun.UFileDescriptor) JSC.Maybe(void) { + pub fn unregisterWithFd(this: *FilePoll, loop: *uws.Loop, fd: bun.UFileDescriptor, force_unregister: bool) JSC.Maybe(void) { if (!(this.flags.contains(.poll_readable) or this.flags.contains(.poll_writable) or this.flags.contains(.poll_process) or this.flags.contains(.poll_machport))) { // no-op return JSC.Maybe(void).success; @@ -2310,7 +2319,7 @@ pub const FilePoll = struct { return JSC.Maybe(void).success; }; - if (this.flags.contains(.needs_rearm)) { + if (this.flags.contains(.needs_rearm) and !force_unregister) { log("unregister: {s} ({d}) skipped due to needs_rearm", .{ @tagName(flag), fd }); this.flags.remove(.poll_process); this.flags.remove(.poll_readable); @@ -2325,7 +2334,7 @@ pub const FilePoll = struct { const ctl = linux.epoll_ctl( watcher_fd, linux.EPOLL.CTL_DEL, - @as(std.os.fd_t, @intCast(fd)), + @intCast(fd), null, ); |