aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/base.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js/base.zig')
-rw-r--r--src/bun.js/base.zig31
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,
);