Get evented io code paths to build on macOS (#5233)
* Get evented io code paths to build on macOS * Use mode_t instead of usize where appropriatemaster
parent
33705d06bb
commit
8ebcca6734
|
@ -502,18 +502,43 @@ pub const Loop = struct {
|
|||
}
|
||||
|
||||
pub fn waitUntilFdReadable(self: *Loop, fd: os.fd_t) void {
|
||||
return self.linuxWaitFd(fd, os.EPOLLET | os.EPOLLONESHOT | os.EPOLLIN);
|
||||
switch (builtin.os.tag) {
|
||||
.linux => {
|
||||
self.linuxWaitFd(fd, os.EPOLLET | os.EPOLLONESHOT | os.EPOLLIN);
|
||||
},
|
||||
.macosx, .freebsd, .netbsd, .dragonfly => {
|
||||
self.bsdWaitKev(@intCast(usize, fd), os.EVFILT_READ, os.EV_ONESHOT);
|
||||
},
|
||||
else => @compileError("Unsupported OS"),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn waitUntilFdWritable(self: *Loop, fd: os.fd_t) void {
|
||||
return self.linuxWaitFd(fd, os.EPOLLET | os.EPOLLONESHOT | os.EPOLLOUT);
|
||||
switch (builtin.os.tag) {
|
||||
.linux => {
|
||||
self.linuxWaitFd(fd, os.EPOLLET | os.EPOLLONESHOT | os.EPOLLOUT);
|
||||
},
|
||||
.macosx, .freebsd, .netbsd, .dragonfly => {
|
||||
self.bsdWaitKev(@intCast(usize, fd), os.EVFILT_WRITE, os.EV_ONESHOT);
|
||||
},
|
||||
else => @compileError("Unsupported OS"),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn waitUntilFdWritableOrReadable(self: *Loop, fd: os.fd_t) void {
|
||||
return self.linuxWaitFd(fd, os.EPOLLET | os.EPOLLONESHOT | os.EPOLLOUT | os.EPOLLIN);
|
||||
switch (builtin.os.tag) {
|
||||
.linux => {
|
||||
self.linuxWaitFd(@intCast(usize, fd), os.EPOLLET | os.EPOLLONESHOT | os.EPOLLOUT | os.EPOLLIN);
|
||||
},
|
||||
.macosx, .freebsd, .netbsd, .dragonfly => {
|
||||
self.bsdWaitKev(@intCast(usize, fd), os.EVFILT_READ, os.EV_ONESHOT);
|
||||
self.bsdWaitKev(@intCast(usize, fd), os.EVFILT_WRITE, os.EV_ONESHOT);
|
||||
},
|
||||
else => @compileError("Unsupported OS"),
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn bsdWaitKev(self: *Loop, ident: usize, filter: i16, fflags: u32) !os.Kevent {
|
||||
pub async fn bsdWaitKev(self: *Loop, ident: usize, filter: i16, fflags: u32) void {
|
||||
var resume_node = ResumeNode.Basic{
|
||||
.base = ResumeNode{
|
||||
.id = ResumeNode.Id.Basic,
|
||||
|
@ -524,40 +549,37 @@ pub const Loop = struct {
|
|||
};
|
||||
defer self.bsdRemoveKev(ident, filter);
|
||||
suspend {
|
||||
try self.bsdAddKev(&resume_node, ident, filter, fflags);
|
||||
self.bsdAddKev(&resume_node, ident, filter, fflags) catch unreachable;
|
||||
}
|
||||
return resume_node.kev;
|
||||
}
|
||||
|
||||
/// resume_node must live longer than the anyframe that it holds a reference to.
|
||||
pub fn bsdAddKev(self: *Loop, resume_node: *ResumeNode.Basic, ident: usize, filter: i16, fflags: u32) !void {
|
||||
self.beginOneEvent();
|
||||
errdefer self.finishOneEvent();
|
||||
var kev = os.Kevent{
|
||||
var kev = [1]os.Kevent{os.Kevent{
|
||||
.ident = ident,
|
||||
.filter = filter,
|
||||
.flags = os.EV_ADD | os.EV_ENABLE | os.EV_CLEAR,
|
||||
.fflags = fflags,
|
||||
.data = 0,
|
||||
.udata = @ptrToInt(&resume_node.base),
|
||||
};
|
||||
const kevent_array = (*const [1]os.Kevent)(&kev);
|
||||
const empty_kevs = ([*]os.Kevent)(undefined)[0..0];
|
||||
_ = try os.kevent(self.os_data.kqfd, kevent_array, empty_kevs, null);
|
||||
}};
|
||||
const empty_kevs = &[0]os.Kevent{};
|
||||
_ = try os.kevent(self.os_data.kqfd, &kev, empty_kevs, null);
|
||||
}
|
||||
|
||||
pub fn bsdRemoveKev(self: *Loop, ident: usize, filter: i16) void {
|
||||
var kev = os.Kevent{
|
||||
var kev = [1]os.Kevent{os.Kevent{
|
||||
.ident = ident,
|
||||
.filter = filter,
|
||||
.flags = os.EV_DELETE,
|
||||
.fflags = 0,
|
||||
.data = 0,
|
||||
.udata = 0,
|
||||
};
|
||||
const kevent_array = (*const [1]os.Kevent)(&kev);
|
||||
const empty_kevs = ([*]os.Kevent)(undefined)[0..0];
|
||||
_ = os.kevent(self.os_data.kqfd, kevent_array, empty_kevs, null) catch undefined;
|
||||
}};
|
||||
const empty_kevs = &[0]os.Kevent{};
|
||||
_ = os.kevent(self.os_data.kqfd, &kev, empty_kevs, null) catch undefined;
|
||||
self.finishOneEvent();
|
||||
}
|
||||
|
||||
|
@ -712,7 +734,7 @@ pub const Loop = struct {
|
|||
}
|
||||
|
||||
/// Performs an async `os.open` using a separate thread.
|
||||
pub fn openZ(self: *Loop, file_path: [*:0]const u8, flags: u32, mode: usize) os.OpenError!os.fd_t {
|
||||
pub fn openZ(self: *Loop, file_path: [*:0]const u8, flags: u32, mode: os.mode_t) os.OpenError!os.fd_t {
|
||||
var req_node = Request.Node{
|
||||
.data = .{
|
||||
.msg = .{
|
||||
|
@ -733,7 +755,7 @@ pub const Loop = struct {
|
|||
}
|
||||
|
||||
/// Performs an async `os.opent` using a separate thread.
|
||||
pub fn openatZ(self: *Loop, fd: os.fd_t, file_path: [*:0]const u8, flags: u32, mode: usize) os.OpenError!os.fd_t {
|
||||
pub fn openatZ(self: *Loop, fd: os.fd_t, file_path: [*:0]const u8, flags: u32, mode: os.mode_t) os.OpenError!os.fd_t {
|
||||
var req_node = Request.Node{
|
||||
.data = .{
|
||||
.msg = .{
|
||||
|
|
|
@ -374,7 +374,7 @@ pub fn readv(fd: fd_t, iov: []const iovec) ReadError!usize {
|
|||
const first = iov[0];
|
||||
return read(fd, first.iov_base[0..first.iov_len]);
|
||||
}
|
||||
|
||||
|
||||
const iov_count = math.cast(u31, iov.len) catch math.maxInt(u31);
|
||||
while (true) {
|
||||
// TODO handle the case when iov_len is too large and get rid of this @intCast
|
||||
|
@ -859,7 +859,7 @@ pub const OpenError = error{
|
|||
/// Open and possibly create a file. Keeps trying if it gets interrupted.
|
||||
/// See also `openC`.
|
||||
/// TODO support windows
|
||||
pub fn open(file_path: []const u8, flags: u32, perm: usize) OpenError!fd_t {
|
||||
pub fn open(file_path: []const u8, flags: u32, perm: mode_t) OpenError!fd_t {
|
||||
const file_path_c = try toPosixPath(file_path);
|
||||
return openZ(&file_path_c, flags, perm);
|
||||
}
|
||||
|
@ -869,7 +869,7 @@ pub const openC = @compileError("deprecated: renamed to openZ");
|
|||
/// Open and possibly create a file. Keeps trying if it gets interrupted.
|
||||
/// See also `open`.
|
||||
/// TODO support windows
|
||||
pub fn openZ(file_path: [*:0]const u8, flags: u32, perm: usize) OpenError!fd_t {
|
||||
pub fn openZ(file_path: [*:0]const u8, flags: u32, perm: mode_t) OpenError!fd_t {
|
||||
while (true) {
|
||||
const rc = system.open(file_path, flags, perm);
|
||||
switch (errno(rc)) {
|
||||
|
|
|
@ -492,7 +492,7 @@ pub fn renameat2(oldfd: i32, oldpath: [*:0]const u8, newfd: i32, newpath: [*:0]c
|
|||
);
|
||||
}
|
||||
|
||||
pub fn open(path: [*:0]const u8, flags: u32, perm: usize) usize {
|
||||
pub fn open(path: [*:0]const u8, flags: u32, perm: mode_t) usize {
|
||||
if (@hasField(SYS, "open")) {
|
||||
return syscall3(.open, @ptrToInt(path), flags, perm);
|
||||
} else {
|
||||
|
@ -506,11 +506,11 @@ pub fn open(path: [*:0]const u8, flags: u32, perm: usize) usize {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn create(path: [*:0]const u8, perm: usize) usize {
|
||||
pub fn create(path: [*:0]const u8, perm: mode_t) usize {
|
||||
return syscall2(.creat, @ptrToInt(path), perm);
|
||||
}
|
||||
|
||||
pub fn openat(dirfd: i32, path: [*:0]const u8, flags: u32, mode: usize) usize {
|
||||
pub fn openat(dirfd: i32, path: [*:0]const u8, flags: u32, mode: mode_t) usize {
|
||||
// dirfd could be negative, for example AT_FDCWD is -100
|
||||
return syscall4(.openat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), flags, mode);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue