tangled
alpha
login
or
join now
rockorager.dev
/
ourio
6
fork
atom
An asynchronous IO runtime
6
fork
atom
overview
issues
pulls
pipelines
mock: track open file descriptors
rockorager.dev
10 months ago
658cb01c
e00f6a02
verified
This commit was signed with the committer's
known signature
.
rockorager.dev
SSH Key Fingerprint:
SHA256:qn/Fjy7CpbcogGEPB14Y53hLnQleZNFY9lkQnuudFLs=
+24
1 changed file
expand all
collapse all
unified
split
src
ourio
Mock.zig
+24
src/ourio/Mock.zig
···
10
10
const posix = std.posix;
11
11
12
12
completions: Queue(io.Task, .complete) = .{},
13
13
+
open_fds: i64 = 0,
13
14
14
15
accept_cb: ?*const fn (*io.Task) io.Result = null,
15
16
cancel_cb: ?*const fn (*io.Task) io.Result = null,
···
39
40
}
40
41
41
42
pub fn deinit(self: *Mock, _: Allocator) void {
43
43
+
if (self.open_fds > 0) {
44
44
+
@panic("file descriptor leak");
45
45
+
}
46
46
+
if (self.open_fds < 0) {
47
47
+
@panic("unbalanced file descriptor close");
48
48
+
}
42
49
self.* = undefined;
43
50
}
44
51
···
79
86
.socket => if (self.socket_cb) |cb| cb(task) else return error.NoMockCallback,
80
87
.statx => if (self.statx_cb) |cb| cb(task) else return error.NoMockCallback,
81
88
.timer => if (self.timer_cb) |cb| cb(task) else return error.NoMockCallback,
89
89
+
.userbytes => if (self.userbytes_cb) |cb| cb(task) else return error.NoMockCallback,
82
90
.userfd => if (self.userfd_cb) |cb| cb(task) else return error.NoMockCallback,
83
91
.usermsg => if (self.usermsg_cb) |cb| cb(task) else return error.NoMockCallback,
84
92
.userptr => if (self.userptr_cb) |cb| cb(task) else return error.NoMockCallback,
85
93
.write => if (self.write_cb) |cb| cb(task) else return error.NoMockCallback,
86
94
.writev => if (self.writev_cb) |cb| cb(task) else return error.NoMockCallback,
87
95
};
96
96
+
97
97
+
switch (task.result.?) {
98
98
+
.accept => |accept| {
99
99
+
if (accept) |_| self.open_fds += 1 else |_| {}
100
100
+
},
101
101
+
.open => |open| {
102
102
+
if (open) |_| self.open_fds += 1 else |_| {}
103
103
+
},
104
104
+
.socket => |socket| {
105
105
+
if (socket) |_| self.open_fds += 1 else |_| {}
106
106
+
},
107
107
+
.close => |close| {
108
108
+
if (close) |_| self.open_fds -= 1 else |_| {}
109
109
+
},
110
110
+
else => {},
111
111
+
}
88
112
self.completions.push(task);
89
113
}
90
114
}