mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-09 07:08:59 +00:00
Use linux types directly since IoUring is only supported on linux
Use explicit array types were possible Signed-off-by: Bernard Assan <mega.alpha100@gmail.com>
This commit is contained in:
parent
f2543ad731
commit
f17c49390d
1 changed files with 150 additions and 141 deletions
|
|
@ -11,7 +11,7 @@ const testing = std.testing;
|
||||||
const is_linux = builtin.os.tag == .linux;
|
const is_linux = builtin.os.tag == .linux;
|
||||||
const page_size_min = std.heap.page_size_min;
|
const page_size_min = std.heap.page_size_min;
|
||||||
|
|
||||||
fd: posix.fd_t = -1,
|
fd: linux.fd_t = -1,
|
||||||
sq: Sq,
|
sq: Sq,
|
||||||
cq: Cq,
|
cq: Cq,
|
||||||
flags: uflags.Setup,
|
flags: uflags.Setup,
|
||||||
|
|
@ -420,9 +420,9 @@ pub fn enter_flags(self: *IoUring) uflags.Enter {
|
||||||
pub fn splice(
|
pub fn splice(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd_in: posix.fd_t,
|
fd_in: linux.fd_t,
|
||||||
off_in: u64,
|
off_in: u64,
|
||||||
fd_out: posix.fd_t,
|
fd_out: linux.fd_t,
|
||||||
off_out: u64,
|
off_out: u64,
|
||||||
len: usize,
|
len: usize,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
|
|
@ -437,8 +437,8 @@ pub fn splice(
|
||||||
pub fn tee(
|
pub fn tee(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd_in: posix.fd_t,
|
fd_in: linux.fd_t,
|
||||||
fd_out: posix.fd_t,
|
fd_out: linux.fd_t,
|
||||||
len: usize,
|
len: usize,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
|
|
@ -459,7 +459,7 @@ pub fn tee(
|
||||||
pub fn read(
|
pub fn read(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
buffer: ReadBuffer,
|
buffer: ReadBuffer,
|
||||||
offset: u64,
|
offset: u64,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
|
|
@ -565,8 +565,8 @@ pub fn write_fixed(
|
||||||
pub fn recvmsg(
|
pub fn recvmsg(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
msg: *posix.msghdr,
|
msg: *linux.msghdr,
|
||||||
flags: linux.Msg,
|
flags: linux.Msg,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
|
|
@ -580,8 +580,8 @@ pub fn recvmsg(
|
||||||
pub fn recvmsg_multishot(
|
pub fn recvmsg_multishot(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
msg: *posix.msghdr,
|
msg: *linux.msghdr,
|
||||||
flags: linux.Msg,
|
flags: linux.Msg,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
|
|
@ -596,8 +596,8 @@ pub fn recvmsg_multishot(
|
||||||
pub fn sendmsg(
|
pub fn sendmsg(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
msg: *const posix.msghdr_const,
|
msg: *const linux.msghdr_const,
|
||||||
flags: linux.Msg,
|
flags: linux.Msg,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
|
|
@ -611,7 +611,7 @@ pub fn sendmsg(
|
||||||
pub fn poll_add(
|
pub fn poll_add(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
poll_mask: linux.Epoll,
|
poll_mask: linux.Epoll,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
|
|
@ -625,7 +625,7 @@ pub fn poll_add(
|
||||||
pub fn poll_multishot(
|
pub fn poll_multishot(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
poll_mask: linux.Epoll,
|
poll_mask: linux.Epoll,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.poll_add(user_data, fd, poll_mask);
|
const sqe = try self.poll_add(user_data, fd, poll_mask);
|
||||||
|
|
@ -675,7 +675,7 @@ pub fn poll_update(
|
||||||
/// You should preferably use `link_with_next_sqe()` on a write's SQE to link
|
/// You should preferably use `link_with_next_sqe()` on a write's SQE to link
|
||||||
/// it with an fsync, or else insert a full write barrier using
|
/// it with an fsync, or else insert a full write barrier using
|
||||||
/// `drain_previous_sqes()` when queueing an fsync.
|
/// `drain_previous_sqes()` when queueing an fsync.
|
||||||
pub fn fsync(self: *IoUring, user_data: u64, fd: posix.fd_t, flags: uflags.Fsync) !*Sqe {
|
pub fn fsync(self: *IoUring, user_data: u64, fd: linux.fd_t, flags: uflags.Fsync) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
sqe.prep_fsync(fd, flags);
|
sqe.prep_fsync(fd, flags);
|
||||||
sqe.user_data = user_data;
|
sqe.user_data = user_data;
|
||||||
|
|
@ -765,8 +765,8 @@ pub fn accept(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: linux.fd_t,
|
fd: linux.fd_t,
|
||||||
addr: ?*posix.sockaddr,
|
addr: ?*linux.sockaddr,
|
||||||
addrlen: ?*posix.socklen_t,
|
addrlen: ?*linux.socklen_t,
|
||||||
flags: linux.Sock,
|
flags: linux.Sock,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
|
|
@ -790,8 +790,8 @@ pub fn accept_direct(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: linux.fd_t,
|
fd: linux.fd_t,
|
||||||
addr: ?*posix.sockaddr,
|
addr: ?*linux.sockaddr,
|
||||||
addrlen: ?*posix.socklen_t,
|
addrlen: ?*linux.socklen_t,
|
||||||
flags: linux.Sock,
|
flags: linux.Sock,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
|
|
@ -811,9 +811,9 @@ pub fn accept_direct(
|
||||||
pub fn accept_multishot(
|
pub fn accept_multishot(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
addr: ?*posix.sockaddr,
|
addr: ?*linux.sockaddr,
|
||||||
addrlen: ?*posix.socklen_t,
|
addrlen: ?*linux.socklen_t,
|
||||||
flags: linux.Sock,
|
flags: linux.Sock,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
|
|
@ -828,8 +828,8 @@ pub fn accept_multishot_direct(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: linux.fd_t,
|
fd: linux.fd_t,
|
||||||
addr: ?*posix.sockaddr,
|
addr: ?*linux.sockaddr,
|
||||||
addrlen: ?*posix.socklen_t,
|
addrlen: ?*linux.socklen_t,
|
||||||
flags: linux.Sock,
|
flags: linux.Sock,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
|
|
@ -904,8 +904,8 @@ pub fn connect(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: linux.fd_t,
|
fd: linux.fd_t,
|
||||||
addr: *const posix.sockaddr,
|
addr: *const linux.sockaddr,
|
||||||
addrlen: posix.socklen_t,
|
addrlen: linux.socklen_t,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
sqe.prep_connect(fd, addr, addrlen);
|
sqe.prep_connect(fd, addr, addrlen);
|
||||||
|
|
@ -919,9 +919,9 @@ pub fn connect(
|
||||||
pub fn bind(
|
pub fn bind(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
addr: *const posix.sockaddr,
|
addr: *const linux.sockaddr,
|
||||||
addrlen: posix.socklen_t,
|
addrlen: linux.socklen_t,
|
||||||
// liburing doesn't have this flag, hence 0 should be passed
|
// liburing doesn't have this flag, hence 0 should be passed
|
||||||
// TODO: consider removing this and all flags like this
|
// TODO: consider removing this and all flags like this
|
||||||
flags: u32,
|
flags: u32,
|
||||||
|
|
@ -938,7 +938,7 @@ pub fn bind(
|
||||||
pub fn listen(
|
pub fn listen(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
backlog: usize,
|
backlog: usize,
|
||||||
// liburing doesn't have this flag, hence 0 should be passed
|
// liburing doesn't have this flag, hence 0 should be passed
|
||||||
// TODO: consider removing this and all flags like this
|
// TODO: consider removing this and all flags like this
|
||||||
|
|
@ -955,7 +955,7 @@ pub fn listen(
|
||||||
pub fn epoll_wait(
|
pub fn epoll_wait(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
events: ?*linux.epoll_event,
|
events: ?*linux.epoll_event,
|
||||||
max_events: u32,
|
max_events: u32,
|
||||||
flags: linux.Epoll,
|
flags: linux.Epoll,
|
||||||
|
|
@ -999,7 +999,7 @@ pub fn files_update(
|
||||||
pub fn fallocate(
|
pub fn fallocate(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
mode: i32,
|
mode: i32,
|
||||||
offset: u64,
|
offset: u64,
|
||||||
len: u64,
|
len: u64,
|
||||||
|
|
@ -1016,10 +1016,10 @@ pub fn fallocate(
|
||||||
pub fn openat(
|
pub fn openat(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
path: [*:0]const u8,
|
path: [*:0]const u8,
|
||||||
flags: linux.O,
|
flags: linux.O,
|
||||||
mode: posix.mode_t,
|
mode: linux.mode_t,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
sqe.prep_openat(fd, path, flags, mode);
|
sqe.prep_openat(fd, path, flags, mode);
|
||||||
|
|
@ -1042,10 +1042,10 @@ pub fn openat(
|
||||||
pub fn openat_direct(
|
pub fn openat_direct(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
path: [*:0]const u8,
|
path: [*:0]const u8,
|
||||||
flags: linux.O,
|
flags: linux.O,
|
||||||
mode: posix.mode_t,
|
mode: linux.mode_t,
|
||||||
file_index: u32,
|
file_index: u32,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
|
|
@ -1061,7 +1061,7 @@ pub fn open(
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
path: [*:0]const u8,
|
path: [*:0]const u8,
|
||||||
flags: linux.O,
|
flags: linux.O,
|
||||||
mode: posix.mode_t,
|
mode: linux.mode_t,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
sqe.prep_openat(linux.At.fdcwd, path, flags, mode);
|
sqe.prep_openat(linux.At.fdcwd, path, flags, mode);
|
||||||
|
|
@ -1083,7 +1083,7 @@ pub fn open_direct(
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
path: [*:0]const u8,
|
path: [*:0]const u8,
|
||||||
flags: linux.O,
|
flags: linux.O,
|
||||||
mode: posix.mode_t,
|
mode: linux.mode_t,
|
||||||
file_index: u32,
|
file_index: u32,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
|
|
@ -1095,7 +1095,7 @@ pub fn open_direct(
|
||||||
/// Queues (but does not submit) an SQE to perform a `close(2)`.
|
/// Queues (but does not submit) an SQE to perform a `close(2)`.
|
||||||
/// Returns a pointer to the SQE.
|
/// Returns a pointer to the SQE.
|
||||||
/// Available since 5.6.
|
/// Available since 5.6.
|
||||||
pub fn close(self: *IoUring, user_data: u64, fd: posix.fd_t) !*Sqe {
|
pub fn close(self: *IoUring, user_data: u64, fd: linux.fd_t) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
sqe.prep_close(fd);
|
sqe.prep_close(fd);
|
||||||
sqe.user_data = user_data;
|
sqe.user_data = user_data;
|
||||||
|
|
@ -1116,7 +1116,7 @@ pub fn close_direct(self: *IoUring, user_data: u64, file_index: u32) !*Sqe {
|
||||||
pub fn statx(
|
pub fn statx(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
path: [:0]const u8,
|
path: [:0]const u8,
|
||||||
flags: linux.At,
|
flags: linux.At,
|
||||||
mask: linux.Statx.Mask,
|
mask: linux.Statx.Mask,
|
||||||
|
|
@ -1134,7 +1134,7 @@ pub fn statx(
|
||||||
pub fn fadvice(
|
pub fn fadvice(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
offset: u64,
|
offset: u64,
|
||||||
len: u32,
|
len: u32,
|
||||||
advice: linux.Fadvice,
|
advice: linux.Fadvice,
|
||||||
|
|
@ -1165,7 +1165,7 @@ pub fn madvice(
|
||||||
pub fn send(
|
pub fn send(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
sockfd: posix.fd_t,
|
sockfd: linux.fd_t,
|
||||||
buffer: []const u8,
|
buffer: []const u8,
|
||||||
flags: linux.Msg,
|
flags: linux.Msg,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
|
|
@ -1180,7 +1180,7 @@ pub fn send(
|
||||||
pub fn send_bundle(
|
pub fn send_bundle(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
sockfd: posix.fd_t,
|
sockfd: linux.fd_t,
|
||||||
len: u64,
|
len: u64,
|
||||||
flags: linux.Msg,
|
flags: linux.Msg,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
|
|
@ -1195,7 +1195,7 @@ pub fn send_bundle(
|
||||||
pub fn send_to(
|
pub fn send_to(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
sockfd: posix.fd_t,
|
sockfd: linux.fd_t,
|
||||||
buffer: []const u8,
|
buffer: []const u8,
|
||||||
flags: linux.Msg,
|
flags: linux.Msg,
|
||||||
addr: *const linux.sockaddr,
|
addr: *const linux.sockaddr,
|
||||||
|
|
@ -1225,7 +1225,7 @@ pub fn send_to(
|
||||||
pub fn send_zc(
|
pub fn send_zc(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
sockfd: posix.fd_t,
|
sockfd: linux.fd_t,
|
||||||
buffer: []const u8,
|
buffer: []const u8,
|
||||||
send_flags: linux.Msg,
|
send_flags: linux.Msg,
|
||||||
zc_flags: Sqe.SendRecv,
|
zc_flags: Sqe.SendRecv,
|
||||||
|
|
@ -1242,7 +1242,7 @@ pub fn send_zc(
|
||||||
pub fn send_zc_fixed(
|
pub fn send_zc_fixed(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
sockfd: posix.fd_t,
|
sockfd: linux.fd_t,
|
||||||
buffer: []const u8,
|
buffer: []const u8,
|
||||||
send_flags: linux.Msg,
|
send_flags: linux.Msg,
|
||||||
zc_flags: Sqe.SendRecv,
|
zc_flags: Sqe.SendRecv,
|
||||||
|
|
@ -1260,8 +1260,8 @@ pub fn send_zc_fixed(
|
||||||
pub fn sendmsg_zc(
|
pub fn sendmsg_zc(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
msg: *const posix.msghdr_const,
|
msg: *const linux.msghdr_const,
|
||||||
flags: linux.Msg,
|
flags: linux.Msg,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
|
|
@ -1275,8 +1275,8 @@ pub fn sendmsg_zc(
|
||||||
pub fn sendmsg_zc_fixed(
|
pub fn sendmsg_zc_fixed(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
msg: *const posix.msghdr_const,
|
msg: *const linux.msghdr_const,
|
||||||
flags: linux.Msg,
|
flags: linux.Msg,
|
||||||
buf_index: u16,
|
buf_index: u16,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
|
|
@ -1377,7 +1377,7 @@ pub fn remove_buffers(
|
||||||
pub fn shutdown(
|
pub fn shutdown(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
sockfd: posix.socket_t,
|
sockfd: linux.socket_t,
|
||||||
how: linux.Shut,
|
how: linux.Shut,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
|
|
@ -1391,7 +1391,7 @@ pub fn shutdown(
|
||||||
pub fn unlinkat(
|
pub fn unlinkat(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
dir_fd: posix.fd_t,
|
dir_fd: linux.fd_t,
|
||||||
path: [*:0]const u8,
|
path: [*:0]const u8,
|
||||||
flags: linux.At,
|
flags: linux.At,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
|
|
@ -1417,9 +1417,9 @@ pub fn unlink(
|
||||||
pub fn renameat(
|
pub fn renameat(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
old_dir_fd: posix.fd_t,
|
old_dir_fd: linux.fd_t,
|
||||||
old_path: [*:0]const u8,
|
old_path: [*:0]const u8,
|
||||||
new_dir_fd: posix.fd_t,
|
new_dir_fd: linux.fd_t,
|
||||||
new_path: [*:0]const u8,
|
new_path: [*:0]const u8,
|
||||||
flags: linux.Rename,
|
flags: linux.Rename,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
|
|
@ -1446,7 +1446,7 @@ pub fn rename(
|
||||||
pub fn sync_file_range(
|
pub fn sync_file_range(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
len: u32,
|
len: u32,
|
||||||
offset: u64,
|
offset: u64,
|
||||||
flags: linux.SyncFileRange, // TODO: add flags
|
flags: linux.SyncFileRange, // TODO: add flags
|
||||||
|
|
@ -1462,9 +1462,9 @@ pub fn sync_file_range(
|
||||||
pub fn mkdirat(
|
pub fn mkdirat(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
dir_fd: posix.fd_t,
|
dir_fd: linux.fd_t,
|
||||||
path: [*:0]const u8,
|
path: [*:0]const u8,
|
||||||
mode: posix.mode_t,
|
mode: linux.mode_t,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
sqe.prep_mkdirat(dir_fd, path, mode);
|
sqe.prep_mkdirat(dir_fd, path, mode);
|
||||||
|
|
@ -1478,7 +1478,7 @@ pub fn mkdir(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
path: [*:0]const u8,
|
path: [*:0]const u8,
|
||||||
mode: posix.mode_t,
|
mode: linux.mode_t,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
return try self.mkdirat(user_data, linux.At.fdcwd, path, mode);
|
return try self.mkdirat(user_data, linux.At.fdcwd, path, mode);
|
||||||
}
|
}
|
||||||
|
|
@ -1489,7 +1489,7 @@ pub fn symlinkat(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
target: [*:0]const u8,
|
target: [*:0]const u8,
|
||||||
new_dir_fd: posix.fd_t,
|
new_dir_fd: linux.fd_t,
|
||||||
link_path: [*:0]const u8,
|
link_path: [*:0]const u8,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
|
|
@ -1514,9 +1514,9 @@ pub fn symlink(
|
||||||
pub fn linkat(
|
pub fn linkat(
|
||||||
self: *IoUring,
|
self: *IoUring,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
old_dir_fd: posix.fd_t,
|
old_dir_fd: linux.fd_t,
|
||||||
old_path: [*:0]const u8,
|
old_path: [*:0]const u8,
|
||||||
new_dir_fd: posix.fd_t,
|
new_dir_fd: linux.fd_t,
|
||||||
new_path: [*:0]const u8,
|
new_path: [*:0]const u8,
|
||||||
flags: linux.At,
|
flags: linux.At,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
|
|
@ -1924,7 +1924,7 @@ pub fn unregister_buffers(self: *IoUring) !void {
|
||||||
/// * replacing an existing entry with a new fd
|
/// * replacing an existing entry with a new fd
|
||||||
///
|
///
|
||||||
/// Adding new file descriptors must be done with `register_files`.
|
/// Adding new file descriptors must be done with `register_files`.
|
||||||
pub fn register_files_update(self: *IoUring, offset: u32, fds: []const posix.fd_t) !void {
|
pub fn register_files_update(self: *IoUring, offset: u32, fds: []const linux.fd_t) !void {
|
||||||
assert(self.fd >= 0);
|
assert(self.fd >= 0);
|
||||||
|
|
||||||
var update = mem.zeroInit(RsrcUpdate, .{
|
var update = mem.zeroInit(RsrcUpdate, .{
|
||||||
|
|
@ -2539,7 +2539,7 @@ pub const Sqe = extern struct {
|
||||||
pub fn prep_writev(
|
pub fn prep_writev(
|
||||||
sqe: *Sqe,
|
sqe: *Sqe,
|
||||||
fd: linux.fd_t,
|
fd: linux.fd_t,
|
||||||
iovecs: []const std.posix.iovec_const,
|
iovecs: []const posix.iovec_const,
|
||||||
offset: u64,
|
offset: u64,
|
||||||
) void {
|
) void {
|
||||||
sqe.prep_rw(.writev, fd, @intFromPtr(iovecs.ptr), iovecs.len, offset);
|
sqe.prep_rw(.writev, fd, @intFromPtr(iovecs.ptr), iovecs.len, offset);
|
||||||
|
|
@ -2574,7 +2574,7 @@ pub const Sqe = extern struct {
|
||||||
pub fn prep_readv(
|
pub fn prep_readv(
|
||||||
sqe: *Sqe,
|
sqe: *Sqe,
|
||||||
fd: linux.fd_t,
|
fd: linux.fd_t,
|
||||||
iovecs: []const std.posix.iovec,
|
iovecs: []const posix.iovec,
|
||||||
offset: u64,
|
offset: u64,
|
||||||
) void {
|
) void {
|
||||||
sqe.prep_rw(.readv, fd, @intFromPtr(iovecs.ptr), iovecs.len, offset);
|
sqe.prep_rw(.readv, fd, @intFromPtr(iovecs.ptr), iovecs.len, offset);
|
||||||
|
|
@ -2594,7 +2594,7 @@ pub const Sqe = extern struct {
|
||||||
pub fn prep_readv_fixed(
|
pub fn prep_readv_fixed(
|
||||||
sqe: *Sqe,
|
sqe: *Sqe,
|
||||||
fd: linux.fd_t,
|
fd: linux.fd_t,
|
||||||
iovecs: []const std.posix.iovec,
|
iovecs: []const posix.iovec,
|
||||||
offset: u64,
|
offset: u64,
|
||||||
buffer_index: u16,
|
buffer_index: u16,
|
||||||
) void {
|
) void {
|
||||||
|
|
@ -3044,7 +3044,7 @@ pub const Sqe = extern struct {
|
||||||
|
|
||||||
pub fn prep_sync_file_range(
|
pub fn prep_sync_file_range(
|
||||||
sqe: *Sqe,
|
sqe: *Sqe,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
len: u32,
|
len: u32,
|
||||||
offset: u64,
|
offset: u64,
|
||||||
flags: linux.SyncFileRange, // TODO: add flags
|
flags: linux.SyncFileRange, // TODO: add flags
|
||||||
|
|
@ -3548,7 +3548,7 @@ pub const Sq = struct {
|
||||||
_: u29 = 0,
|
_: u29 = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn init(fd: posix.fd_t, p: Params) !Sq {
|
pub fn init(fd: linux.fd_t, p: Params) !Sq {
|
||||||
assert(fd >= 0);
|
assert(fd >= 0);
|
||||||
assert(p.features.single_mmap);
|
assert(p.features.single_mmap);
|
||||||
const size = @max(
|
const size = @max(
|
||||||
|
|
@ -3620,7 +3620,7 @@ pub const Cq = struct {
|
||||||
_: u31 = 0,
|
_: u31 = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn init(fd: posix.fd_t, p: Params, sq: Sq) !Cq {
|
pub fn init(fd: linux.fd_t, p: Params, sq: Sq) !Cq {
|
||||||
assert(fd >= 0);
|
assert(fd >= 0);
|
||||||
assert(p.features.single_mmap);
|
assert(p.features.single_mmap);
|
||||||
const mmap = sq.mmap;
|
const mmap = sq.mmap;
|
||||||
|
|
@ -3724,7 +3724,7 @@ pub const BufferGroup = struct {
|
||||||
pub fn read_multishot(
|
pub fn read_multishot(
|
||||||
self: *BufferGroup,
|
self: *BufferGroup,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
nbytes: u32,
|
nbytes: u32,
|
||||||
offset: u64,
|
offset: u64,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
|
|
@ -3740,7 +3740,7 @@ pub const BufferGroup = struct {
|
||||||
pub fn recv(
|
pub fn recv(
|
||||||
self: *BufferGroup,
|
self: *BufferGroup,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
flags: linux.Msg,
|
flags: linux.Msg,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
var sqe = try self.ring.get_sqe();
|
var sqe = try self.ring.get_sqe();
|
||||||
|
|
@ -3757,7 +3757,7 @@ pub const BufferGroup = struct {
|
||||||
pub fn recv_multishot(
|
pub fn recv_multishot(
|
||||||
self: *BufferGroup,
|
self: *BufferGroup,
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: posix.fd_t,
|
fd: linux.fd_t,
|
||||||
flags: linux.Msg,
|
flags: linux.Msg,
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
var sqe = try self.recv(user_data, fd, flags);
|
var sqe = try self.recv(user_data, fd, flags);
|
||||||
|
|
@ -4867,13 +4867,15 @@ test "readv" {
|
||||||
// https://github.com/torvalds/linux/blob/v5.4/fs/io_uring.c#L3119-L3124 vs
|
// https://github.com/torvalds/linux/blob/v5.4/fs/io_uring.c#L3119-L3124 vs
|
||||||
// https://github.com/torvalds/linux/blob/v5.8/fs/io_uring.c#L6687-L6691
|
// https://github.com/torvalds/linux/blob/v5.8/fs/io_uring.c#L6687-L6691
|
||||||
// We therefore avoid stressing sparse fd sets here:
|
// We therefore avoid stressing sparse fd sets here:
|
||||||
var registered_fds = [_]linux.fd_t{0} ** 1;
|
var registered_fds: [1]linux.fd_t = @splat(0);
|
||||||
const fd_index = 0;
|
const fd_index = 0;
|
||||||
registered_fds[fd_index] = fd;
|
registered_fds[fd_index] = fd;
|
||||||
try ring.register_files(registered_fds[0..]);
|
try ring.register_files(registered_fds[0..]);
|
||||||
|
|
||||||
var buffer = [_]u8{42} ** 128;
|
var buffer: [128]u8 = @splat(42);
|
||||||
var iovecs = [_]posix.iovec{posix.iovec{ .base = &buffer, .len = buffer.len }};
|
var iovecs: [1]posix.iovec = .{
|
||||||
|
.{ .base = &buffer, .len = buffer.len },
|
||||||
|
};
|
||||||
const sqe = try ring.read(0xcccccccc, fd_index, .{ .iovecs = iovecs[0..] }, 0);
|
const sqe = try ring.read(0xcccccccc, fd_index, .{ .iovecs = iovecs[0..] }, 0);
|
||||||
try testing.expectEqual(Op.readv, sqe.opcode);
|
try testing.expectEqual(Op.readv, sqe.opcode);
|
||||||
sqe.flags.fixed_file = true;
|
sqe.flags.fixed_file = true;
|
||||||
|
|
@ -4885,7 +4887,8 @@ test "readv" {
|
||||||
.res = buffer.len,
|
.res = buffer.len,
|
||||||
.flags = .{},
|
.flags = .{},
|
||||||
}, try ring.copy_cqe());
|
}, try ring.copy_cqe());
|
||||||
try testing.expectEqualSlices(u8, &([_]u8{0} ** buffer.len), buffer[0..]);
|
const empty: [buffer.len]u8 = @splat(0);
|
||||||
|
try testing.expectEqualSlices(u8, empty[0..], buffer[0..]);
|
||||||
|
|
||||||
try ring.unregister_files();
|
try ring.unregister_files();
|
||||||
}
|
}
|
||||||
|
|
@ -4908,13 +4911,14 @@ test "writev/fsync/readv" {
|
||||||
defer file.close();
|
defer file.close();
|
||||||
const fd = file.handle;
|
const fd = file.handle;
|
||||||
|
|
||||||
const buffer_write = [_]u8{42} ** 128;
|
const buffer_write: [128]u8 = @splat(42);
|
||||||
const iovecs_write = [_]posix.iovec_const{
|
const iovecs_write: [1]posix.iovec_const = .{
|
||||||
posix.iovec_const{ .base = &buffer_write, .len = buffer_write.len },
|
.{ .base = &buffer_write, .len = buffer_write.len },
|
||||||
};
|
};
|
||||||
var buffer_read = [_]u8{0} ** 128;
|
|
||||||
var iovecs_read = [_]posix.iovec{
|
var buffer_read: [128]u8 = @splat(0);
|
||||||
posix.iovec{ .base = &buffer_read, .len = buffer_read.len },
|
var iovecs_read: [1]posix.iovec = .{
|
||||||
|
.{ .base = &buffer_read, .len = buffer_read.len },
|
||||||
};
|
};
|
||||||
|
|
||||||
const sqe_writev = try ring.write(0xdddddddd, fd, .{ .iovecs = iovecs_write[0..] }, 17);
|
const sqe_writev = try ring.write(0xdddddddd, fd, .{ .iovecs = iovecs_write[0..] }, 17);
|
||||||
|
|
@ -4977,8 +4981,8 @@ test "write/read" {
|
||||||
defer file.close();
|
defer file.close();
|
||||||
const fd = file.handle;
|
const fd = file.handle;
|
||||||
|
|
||||||
const buffer_write = [_]u8{97} ** 20;
|
const buffer_write: [20]u8 = @splat(97);
|
||||||
var buffer_read = [_]u8{98} ** 20;
|
var buffer_read: [20]u8 = @splat(98);
|
||||||
const sqe_write = try ring.write(0x11111111, fd, .{ .buffer = buffer_write[0..] }, 10);
|
const sqe_write = try ring.write(0x11111111, fd, .{ .buffer = buffer_write[0..] }, 10);
|
||||||
try testing.expectEqual(Op.write, sqe_write.opcode);
|
try testing.expectEqual(Op.write, sqe_write.opcode);
|
||||||
try testing.expectEqual(10, sqe_write.off);
|
try testing.expectEqual(10, sqe_write.off);
|
||||||
|
|
@ -5028,8 +5032,8 @@ test "splice/read" {
|
||||||
defer file_dst.close();
|
defer file_dst.close();
|
||||||
const fd_dst = file_dst.handle;
|
const fd_dst = file_dst.handle;
|
||||||
|
|
||||||
const buffer_write = [_]u8{97} ** 20;
|
const buffer_write: [20]u8 = @splat(97);
|
||||||
var buffer_read = [_]u8{98} ** 20;
|
var buffer_read: [20]u8 = @splat(98);
|
||||||
_ = try file_src.write(&buffer_write);
|
_ = try file_src.write(&buffer_write);
|
||||||
|
|
||||||
const fds = try posix.pipe();
|
const fds = try posix.pipe();
|
||||||
|
|
@ -5101,7 +5105,7 @@ test "write_fixed/read_fixed" {
|
||||||
@memset(&raw_buffers[0], 'z');
|
@memset(&raw_buffers[0], 'z');
|
||||||
raw_buffers[0][0.."foobar".len].* = "foobar".*;
|
raw_buffers[0][0.."foobar".len].* = "foobar".*;
|
||||||
|
|
||||||
var buffers = [2]posix.iovec{
|
var buffers: [2]posix.iovec = .{
|
||||||
.{ .base = &raw_buffers[0], .len = raw_buffers[0].len },
|
.{ .base = &raw_buffers[0], .len = raw_buffers[0].len },
|
||||||
.{ .base = &raw_buffers[1], .len = raw_buffers[1].len },
|
.{ .base = &raw_buffers[1], .len = raw_buffers[1].len },
|
||||||
};
|
};
|
||||||
|
|
@ -5166,7 +5170,7 @@ test "openat" {
|
||||||
} else @intFromPtr(path);
|
} else @intFromPtr(path);
|
||||||
|
|
||||||
const flags: linux.O = .{ .CLOEXEC = true, .ACCMODE = .RDWR, .CREAT = true };
|
const flags: linux.O = .{ .CLOEXEC = true, .ACCMODE = .RDWR, .CREAT = true };
|
||||||
const mode: posix.mode_t = 0o666;
|
const mode: linux.mode_t = 0o666;
|
||||||
const sqe_openat = try ring.openat(0x33333333, tmp.dir.fd, path, flags, mode);
|
const sqe_openat = try ring.openat(0x33333333, tmp.dir.fd, path, flags, mode);
|
||||||
try testing.expectEqual(Sqe{
|
try testing.expectEqual(Sqe{
|
||||||
.opcode = .openat,
|
.opcode = .openat,
|
||||||
|
|
@ -5299,9 +5303,9 @@ test "sendmsg/recvmsg" {
|
||||||
const client = try posix.socket(address_server.family, posix.SOCK.DGRAM, 0);
|
const client = try posix.socket(address_server.family, posix.SOCK.DGRAM, 0);
|
||||||
defer posix.close(client);
|
defer posix.close(client);
|
||||||
|
|
||||||
const buffer_send = [_]u8{42} ** 128;
|
const buffer_send: [128]u8 = @splat(42);
|
||||||
const iovecs_send = [_]posix.iovec_const{
|
const iovecs_send: [1]posix.iovec_const = .{
|
||||||
posix.iovec_const{ .base = &buffer_send, .len = buffer_send.len },
|
.{ .base = &buffer_send, .len = buffer_send.len },
|
||||||
};
|
};
|
||||||
const msg_send: linux.msghdr_const = .{
|
const msg_send: linux.msghdr_const = .{
|
||||||
.name = addrAny(&address_server),
|
.name = addrAny(&address_server),
|
||||||
|
|
@ -5317,9 +5321,9 @@ test "sendmsg/recvmsg" {
|
||||||
try testing.expectEqual(Op.sendmsg, sqe_sendmsg.opcode);
|
try testing.expectEqual(Op.sendmsg, sqe_sendmsg.opcode);
|
||||||
try testing.expectEqual(client, sqe_sendmsg.fd);
|
try testing.expectEqual(client, sqe_sendmsg.fd);
|
||||||
|
|
||||||
var buffer_recv = [_]u8{0} ** 128;
|
var buffer_recv: [128]u8 = @splat(0);
|
||||||
var iovecs_recv = [_]posix.iovec{
|
var iovecs_recv: [1]posix.iovec = .{
|
||||||
posix.iovec{ .base = &buffer_recv, .len = buffer_recv.len },
|
.{ .base = &buffer_recv, .len = buffer_recv.len },
|
||||||
};
|
};
|
||||||
var address_recv: linux.sockaddr.in = .{
|
var address_recv: linux.sockaddr.in = .{
|
||||||
.port = 0,
|
.port = 0,
|
||||||
|
|
@ -5704,7 +5708,7 @@ test "register_files_update" {
|
||||||
const fd = try posix.openZ("/dev/zero", .{ .ACCMODE = .RDONLY, .CLOEXEC = true }, 0);
|
const fd = try posix.openZ("/dev/zero", .{ .ACCMODE = .RDONLY, .CLOEXEC = true }, 0);
|
||||||
defer posix.close(fd);
|
defer posix.close(fd);
|
||||||
|
|
||||||
var registered_fds = [_]linux.fd_t{0} ** 2;
|
var registered_fds: [2]linux.fd_t = @splat(0);
|
||||||
const fd_index = 0;
|
const fd_index = 0;
|
||||||
const fd_index2 = 1;
|
const fd_index2 = 1;
|
||||||
registered_fds[fd_index] = fd;
|
registered_fds[fd_index] = fd;
|
||||||
|
|
@ -5726,7 +5730,7 @@ test "register_files_update" {
|
||||||
registered_fds[fd_index2] = -1;
|
registered_fds[fd_index2] = -1;
|
||||||
try ring.register_files_update(0, registered_fds[0..]);
|
try ring.register_files_update(0, registered_fds[0..]);
|
||||||
|
|
||||||
var buffer = [_]u8{42} ** 128;
|
var buffer: [128]u8 = @splat(42);
|
||||||
{
|
{
|
||||||
const sqe = try ring.read(0xcccccccc, fd_index, .{ .buffer = &buffer }, 0);
|
const sqe = try ring.read(0xcccccccc, fd_index, .{ .buffer = &buffer }, 0);
|
||||||
try testing.expectEqual(Op.read, sqe.opcode);
|
try testing.expectEqual(Op.read, sqe.opcode);
|
||||||
|
|
@ -5738,7 +5742,8 @@ test "register_files_update" {
|
||||||
.res = buffer.len,
|
.res = buffer.len,
|
||||||
.flags = .{},
|
.flags = .{},
|
||||||
}, try ring.copy_cqe());
|
}, try ring.copy_cqe());
|
||||||
try testing.expectEqualSlices(u8, &([_]u8{0} ** buffer.len), buffer[0..]);
|
const empty: [buffer.len]u8 = @splat(0);
|
||||||
|
try testing.expectEqualSlices(u8, empty[0..], buffer[0..]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test with a non-zero offset
|
// Test with a non-zero offset
|
||||||
|
|
@ -5759,7 +5764,9 @@ test "register_files_update" {
|
||||||
.res = buffer.len,
|
.res = buffer.len,
|
||||||
.flags = .{},
|
.flags = .{},
|
||||||
}, try ring.copy_cqe());
|
}, try ring.copy_cqe());
|
||||||
try testing.expectEqualSlices(u8, &([_]u8{0} ** buffer.len), buffer[0..]);
|
const empty: [buffer.len]u8 = @splat(0);
|
||||||
|
|
||||||
|
try testing.expectEqualSlices(u8, empty[0..], buffer[0..]);
|
||||||
}
|
}
|
||||||
|
|
||||||
try ring.register_files_update(0, registered_fds[0..]);
|
try ring.register_files_update(0, registered_fds[0..]);
|
||||||
|
|
@ -6373,7 +6380,8 @@ test "provide_buffers: accept/connect/send/recv" {
|
||||||
{
|
{
|
||||||
var i: usize = 0;
|
var i: usize = 0;
|
||||||
while (i < buffers.len) : (i += 1) {
|
while (i < buffers.len) : (i += 1) {
|
||||||
_ = try ring.send(0xdeaddead, socket_test_harness.server, &([_]u8{'z'} ** buffer_len), .{});
|
const zz_buffer: [buffer_len]u8 = @splat('z');
|
||||||
|
_ = try ring.send(0xdeaddead, socket_test_harness.server, zz_buffer[0..], .{});
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -6455,7 +6463,8 @@ test "provide_buffers: accept/connect/send/recv" {
|
||||||
// Redo 1 send on the server socket
|
// Redo 1 send on the server socket
|
||||||
|
|
||||||
{
|
{
|
||||||
_ = try ring.send(0xdeaddead, socket_test_harness.server, &([_]u8{'w'} ** buffer_len), .{});
|
const ww_buffer: [buffer_len]u8 = @splat('w');
|
||||||
|
_ = try ring.send(0xdeaddead, socket_test_harness.server, ww_buffer[0..], .{});
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
|
|
||||||
_ = try ring.copy_cqe();
|
_ = try ring.copy_cqe();
|
||||||
|
|
@ -6515,8 +6524,8 @@ fn createSocketTestHarness(ring: *IoUring) !SocketTestHarness {
|
||||||
errdefer posix.close(listener_socket);
|
errdefer posix.close(listener_socket);
|
||||||
|
|
||||||
// Submit 1 accept
|
// Submit 1 accept
|
||||||
var accept_addr: posix.sockaddr = undefined;
|
var accept_addr: linux.sockaddr = undefined;
|
||||||
var accept_addr_len: posix.socklen_t = @sizeOf(@TypeOf(accept_addr));
|
var accept_addr_len: linux.socklen_t = @sizeOf(@TypeOf(accept_addr));
|
||||||
_ = try ring.accept(0xaaaaaaaa, listener_socket, &accept_addr, &accept_addr_len, .{});
|
_ = try ring.accept(0xaaaaaaaa, listener_socket, &accept_addr, &accept_addr_len, .{});
|
||||||
|
|
||||||
// Create a TCP client socket
|
// Create a TCP client socket
|
||||||
|
|
@ -6592,8 +6601,8 @@ test "accept multishot" {
|
||||||
defer posix.close(listener_socket);
|
defer posix.close(listener_socket);
|
||||||
|
|
||||||
// submit multishot accept operation
|
// submit multishot accept operation
|
||||||
var addr: posix.sockaddr = undefined;
|
var addr: linux.sockaddr = undefined;
|
||||||
var addr_len: posix.socklen_t = @sizeOf(@TypeOf(addr));
|
var addr_len: linux.socklen_t = @sizeOf(@TypeOf(addr));
|
||||||
const userdata: u64 = 0xaaaaaaaa;
|
const userdata: u64 = 0xaaaaaaaa;
|
||||||
_ = try ring.accept_multishot(userdata, listener_socket, &addr, &addr_len, .{});
|
_ = try ring.accept_multishot(userdata, listener_socket, &addr, &addr_len, .{});
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
|
|
@ -6629,8 +6638,8 @@ test "accept/connect/send_zc/recv" {
|
||||||
const socket_test_harness = try createSocketTestHarness(&ring);
|
const socket_test_harness = try createSocketTestHarness(&ring);
|
||||||
defer socket_test_harness.close();
|
defer socket_test_harness.close();
|
||||||
|
|
||||||
const buffer_send = [_]u8{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe };
|
const buffer_send: [15]u8 = .{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe };
|
||||||
var buffer_recv = [_]u8{0} ** 10;
|
var buffer_recv: [10]u8 = @splat(0);
|
||||||
|
|
||||||
// zero-copy send
|
// zero-copy send
|
||||||
const sqe_send = try ring.send_zc(0xeeeeeeee, socket_test_harness.client, buffer_send[0..], .{}, .{});
|
const sqe_send = try ring.send_zc(0xeeeeeeee, socket_test_harness.client, buffer_send[0..], .{}, .{});
|
||||||
|
|
@ -6687,7 +6696,7 @@ test "accept_direct" {
|
||||||
};
|
};
|
||||||
|
|
||||||
// register direct file descriptors
|
// register direct file descriptors
|
||||||
var registered_fds = [_]linux.fd_t{-1} ** 2;
|
var registered_fds: [2]linux.fd_t = @splat(-1);
|
||||||
try ring.register_files(registered_fds[0..]);
|
try ring.register_files(registered_fds[0..]);
|
||||||
|
|
||||||
const listener_socket = try createListenerSocket(&address);
|
const listener_socket = try createListenerSocket(&address);
|
||||||
|
|
@ -6713,7 +6722,7 @@ test "accept_direct" {
|
||||||
|
|
||||||
// accept completion
|
// accept completion
|
||||||
const cqe_accept = try ring.copy_cqe();
|
const cqe_accept = try ring.copy_cqe();
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe_accept.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe_accept.err());
|
||||||
const fd_index = cqe_accept.res;
|
const fd_index = cqe_accept.res;
|
||||||
try testing.expect(fd_index < registered_fds.len);
|
try testing.expect(fd_index < registered_fds.len);
|
||||||
try testing.expect(cqe_accept.user_data == accept_userdata);
|
try testing.expect(cqe_accept.user_data == accept_userdata);
|
||||||
|
|
@ -6748,7 +6757,7 @@ test "accept_direct" {
|
||||||
// completion with error
|
// completion with error
|
||||||
const cqe_accept = try ring.copy_cqe();
|
const cqe_accept = try ring.copy_cqe();
|
||||||
try testing.expect(cqe_accept.user_data == accept_userdata);
|
try testing.expect(cqe_accept.user_data == accept_userdata);
|
||||||
try testing.expectEqual(posix.E.NFILE, cqe_accept.err());
|
try testing.expectEqual(linux.E.NFILE, cqe_accept.err());
|
||||||
}
|
}
|
||||||
// return file descriptors to kernel
|
// return file descriptors to kernel
|
||||||
try ring.register_files_update(0, registered_fds[0..]);
|
try ring.register_files_update(0, registered_fds[0..]);
|
||||||
|
|
@ -6776,7 +6785,7 @@ test "accept_multishot_direct" {
|
||||||
.addr = @bitCast([4]u8{ 127, 0, 0, 1 }),
|
.addr = @bitCast([4]u8{ 127, 0, 0, 1 }),
|
||||||
};
|
};
|
||||||
|
|
||||||
var registered_fds = [_]linux.fd_t{-1} ** 2;
|
var registered_fds: [2]linux.fd_t = @splat(-1);
|
||||||
try ring.register_files(registered_fds[0..]);
|
try ring.register_files(registered_fds[0..]);
|
||||||
|
|
||||||
const listener_socket = try createListenerSocket(&address);
|
const listener_socket = try createListenerSocket(&address);
|
||||||
|
|
@ -6813,7 +6822,7 @@ test "accept_multishot_direct" {
|
||||||
// completion with error
|
// completion with error
|
||||||
const cqe_accept = try ring.copy_cqe();
|
const cqe_accept = try ring.copy_cqe();
|
||||||
try testing.expect(cqe_accept.user_data == accept_userdata);
|
try testing.expect(cqe_accept.user_data == accept_userdata);
|
||||||
try testing.expectEqual(posix.E.NFILE, cqe_accept.err());
|
try testing.expectEqual(linux.E.NFILE, cqe_accept.err());
|
||||||
try testing.expect(!cqe_accept.flags.f_more); // has more is not set
|
try testing.expect(!cqe_accept.flags.f_more); // has more is not set
|
||||||
}
|
}
|
||||||
// return file descriptors to kernel
|
// return file descriptors to kernel
|
||||||
|
|
@ -6838,7 +6847,7 @@ test "socket" {
|
||||||
|
|
||||||
// test completion
|
// test completion
|
||||||
var cqe = try ring.copy_cqe();
|
var cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
const fd: linux.fd_t = @intCast(cqe.res);
|
const fd: linux.fd_t = @intCast(cqe.res);
|
||||||
try testing.expect(fd > 2);
|
try testing.expect(fd > 2);
|
||||||
|
|
||||||
|
|
@ -6855,21 +6864,21 @@ test "socket_direct/socket_direct_alloc/close_direct" {
|
||||||
};
|
};
|
||||||
defer ring.deinit();
|
defer ring.deinit();
|
||||||
|
|
||||||
var registered_fds = [_]linux.fd_t{-1} ** 3;
|
var registered_fds: [3]linux.fd_t = @splat(-1);
|
||||||
try ring.register_files(registered_fds[0..]);
|
try ring.register_files(registered_fds[0..]);
|
||||||
|
|
||||||
// create socket in registered file descriptor at index 0 (last param)
|
// create socket in registered file descriptor at index 0 (last param)
|
||||||
_ = try ring.socket_direct(0, .inet, .{ .type = .stream }, .default, 0, 0);
|
_ = try ring.socket_direct(0, .inet, .{ .type = .stream }, .default, 0, 0);
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
var cqe_socket = try ring.copy_cqe();
|
var cqe_socket = try ring.copy_cqe();
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe_socket.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe_socket.err());
|
||||||
try testing.expect(cqe_socket.res == 0);
|
try testing.expect(cqe_socket.res == 0);
|
||||||
|
|
||||||
// create socket in registered file descriptor at index 1 (last param)
|
// create socket in registered file descriptor at index 1 (last param)
|
||||||
_ = try ring.socket_direct(0, .inet, .{ .type = .stream }, .default, 0, 1);
|
_ = try ring.socket_direct(0, .inet, .{ .type = .stream }, .default, 0, 1);
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
cqe_socket = try ring.copy_cqe();
|
cqe_socket = try ring.copy_cqe();
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe_socket.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe_socket.err());
|
||||||
try testing.expect(cqe_socket.res == 0); // res is 0 when index is specified
|
try testing.expect(cqe_socket.res == 0); // res is 0 when index is specified
|
||||||
|
|
||||||
// create socket in kernel chosen file descriptor index (_alloc version)
|
// create socket in kernel chosen file descriptor index (_alloc version)
|
||||||
|
|
@ -6877,7 +6886,7 @@ test "socket_direct/socket_direct_alloc/close_direct" {
|
||||||
_ = try ring.socket_direct_alloc(0, .inet, .{ .type = .stream }, .default, 0);
|
_ = try ring.socket_direct_alloc(0, .inet, .{ .type = .stream }, .default, 0);
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
cqe_socket = try ring.copy_cqe();
|
cqe_socket = try ring.copy_cqe();
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe_socket.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe_socket.err());
|
||||||
try testing.expect(cqe_socket.res == 2); // returns registered file index
|
try testing.expect(cqe_socket.res == 2); // returns registered file index
|
||||||
|
|
||||||
// use sockets from registered_fds in connect operation
|
// use sockets from registered_fds in connect operation
|
||||||
|
|
@ -6911,17 +6920,17 @@ test "socket_direct/socket_direct_alloc/close_direct" {
|
||||||
}
|
}
|
||||||
// test connect completion
|
// test connect completion
|
||||||
try testing.expect(cqe_connect.user_data == connect_userdata);
|
try testing.expect(cqe_connect.user_data == connect_userdata);
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe_connect.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe_connect.err());
|
||||||
// test accept completion
|
// test accept completion
|
||||||
try testing.expect(cqe_accept.user_data == accept_userdata);
|
try testing.expect(cqe_accept.user_data == accept_userdata);
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe_accept.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe_accept.err());
|
||||||
|
|
||||||
// submit and test close_direct
|
// submit and test close_direct
|
||||||
_ = try ring.close_direct(close_userdata, @intCast(fd_index));
|
_ = try ring.close_direct(close_userdata, @intCast(fd_index));
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
var cqe_close = try ring.copy_cqe();
|
var cqe_close = try ring.copy_cqe();
|
||||||
try testing.expect(cqe_close.user_data == close_userdata);
|
try testing.expect(cqe_close.user_data == close_userdata);
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe_close.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe_close.err());
|
||||||
}
|
}
|
||||||
|
|
||||||
try ring.unregister_files();
|
try ring.unregister_files();
|
||||||
|
|
@ -6937,35 +6946,35 @@ test "openat_direct/close_direct" {
|
||||||
};
|
};
|
||||||
defer ring.deinit();
|
defer ring.deinit();
|
||||||
|
|
||||||
var registered_fds = [_]linux.fd_t{-1} ** 3;
|
var registered_fds: [3]linux.fd_t = @splat(-1);
|
||||||
try ring.register_files(registered_fds[0..]);
|
try ring.register_files(registered_fds[0..]);
|
||||||
|
|
||||||
var tmp = std.testing.tmpDir(.{});
|
var tmp = std.testing.tmpDir(.{});
|
||||||
defer tmp.cleanup();
|
defer tmp.cleanup();
|
||||||
const path = "test_io_uring_close_direct";
|
const path = "test_io_uring_close_direct";
|
||||||
const flags: linux.O = .{ .ACCMODE = .RDWR, .CREAT = true };
|
const flags: linux.O = .{ .ACCMODE = .RDWR, .CREAT = true };
|
||||||
const mode: posix.mode_t = 0o666;
|
const mode: linux.mode_t = 0o666;
|
||||||
const user_data: u64 = 0;
|
const user_data: u64 = 0;
|
||||||
|
|
||||||
// use registered file at index 0 (last param)
|
// use registered file at index 0 (last param)
|
||||||
_ = try ring.openat_direct(user_data, tmp.dir.fd, path, flags, mode, 0);
|
_ = try ring.openat_direct(user_data, tmp.dir.fd, path, flags, mode, 0);
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
var cqe = try ring.copy_cqe();
|
var cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
try testing.expect(cqe.res == 0);
|
try testing.expect(cqe.res == 0);
|
||||||
|
|
||||||
// use registered file at index 1
|
// use registered file at index 1
|
||||||
_ = try ring.openat_direct(user_data, tmp.dir.fd, path, flags, mode, 1);
|
_ = try ring.openat_direct(user_data, tmp.dir.fd, path, flags, mode, 1);
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
cqe = try ring.copy_cqe();
|
cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
try testing.expect(cqe.res == 0); // res is 0 when we specify index
|
try testing.expect(cqe.res == 0); // res is 0 when we specify index
|
||||||
|
|
||||||
// let kernel choose registered file index
|
// let kernel choose registered file index
|
||||||
_ = try ring.openat_direct(user_data, tmp.dir.fd, path, flags, mode, constants.FILE_INDEX_ALLOC);
|
_ = try ring.openat_direct(user_data, tmp.dir.fd, path, flags, mode, constants.FILE_INDEX_ALLOC);
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
cqe = try ring.copy_cqe();
|
cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
try testing.expect(cqe.res == 2); // chosen index is in res
|
try testing.expect(cqe.res == 2); // chosen index is in res
|
||||||
|
|
||||||
// close all open file descriptors
|
// close all open file descriptors
|
||||||
|
|
@ -6973,7 +6982,7 @@ test "openat_direct/close_direct" {
|
||||||
_ = try ring.close_direct(user_data, @intCast(fd_index));
|
_ = try ring.close_direct(user_data, @intCast(fd_index));
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
var cqe_close = try ring.copy_cqe();
|
var cqe_close = try ring.copy_cqe();
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe_close.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe_close.err());
|
||||||
}
|
}
|
||||||
try ring.unregister_files();
|
try ring.unregister_files();
|
||||||
}
|
}
|
||||||
|
|
@ -6993,7 +7002,7 @@ test "waitid" {
|
||||||
posix.exit(7);
|
posix.exit(7);
|
||||||
}
|
}
|
||||||
|
|
||||||
var siginfo: posix.siginfo_t = undefined;
|
var siginfo: linux.siginfo_t = undefined;
|
||||||
_ = try ring.waitid(0, .PID, pid, &siginfo, .{ .exited = true }, 0);
|
_ = try ring.waitid(0, .PID, pid, &siginfo, .{ .exited = true }, 0);
|
||||||
|
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
|
|
@ -7093,7 +7102,7 @@ test BufferGroup {
|
||||||
const cqe = try ring.copy_cqe();
|
const cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(2, cqe.user_data); // matches submitted user_data
|
try testing.expectEqual(2, cqe.user_data); // matches submitted user_data
|
||||||
try testing.expect(cqe.res >= 0); // success
|
try testing.expect(cqe.res >= 0); // success
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
try testing.expectEqual(@as(i32, data.len), cqe.res); // cqe.res holds received data len
|
try testing.expectEqual(@as(i32, data.len), cqe.res); // cqe.res holds received data len
|
||||||
|
|
||||||
// Get buffer from pool
|
// Get buffer from pool
|
||||||
|
|
@ -7173,7 +7182,7 @@ test "ring mapped buffers recv" {
|
||||||
const cqe = try ring.copy_cqe();
|
const cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(user_data, cqe.user_data);
|
try testing.expectEqual(user_data, cqe.user_data);
|
||||||
try testing.expect(cqe.res < 0); // fail
|
try testing.expect(cqe.res < 0); // fail
|
||||||
try testing.expectEqual(posix.E.NOBUFS, cqe.err());
|
try testing.expectEqual(linux.E.NOBUFS, cqe.err());
|
||||||
try testing.expect(!cqe.flags.f_buffer); // IORING_CQE_F_BUFFER flags is set on success only
|
try testing.expect(!cqe.flags.f_buffer); // IORING_CQE_F_BUFFER flags is set on success only
|
||||||
try testing.expectError(error.NoBufferSelected, cqe.buffer_id());
|
try testing.expectError(error.NoBufferSelected, cqe.buffer_id());
|
||||||
}
|
}
|
||||||
|
|
@ -7263,7 +7272,7 @@ test "ring mapped buffers multishot recv" {
|
||||||
const cqe = try ring.copy_cqe();
|
const cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(recv_user_data, cqe.user_data);
|
try testing.expectEqual(recv_user_data, cqe.user_data);
|
||||||
try testing.expect(cqe.res < 0); // fail
|
try testing.expect(cqe.res < 0); // fail
|
||||||
try testing.expectEqual(posix.E.NOBUFS, cqe.err());
|
try testing.expectEqual(linux.E.NOBUFS, cqe.err());
|
||||||
// IORING_CQE_F_BUFFER flags is set on success only
|
// IORING_CQE_F_BUFFER flags is set on success only
|
||||||
try testing.expect(!cqe.flags.f_buffer);
|
try testing.expect(!cqe.flags.f_buffer);
|
||||||
// has more is not set
|
// has more is not set
|
||||||
|
|
@ -7349,7 +7358,7 @@ fn buf_grp_recv_submit_get_cqe(
|
||||||
const cqe = try ring.copy_cqe();
|
const cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(user_data, cqe.user_data);
|
try testing.expectEqual(user_data, cqe.user_data);
|
||||||
try testing.expect(cqe.res >= 0); // success
|
try testing.expect(cqe.res >= 0); // success
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
try testing.expect(cqe.flags.f_buffer); // IORING_CQE_F_BUFFER flag is set
|
try testing.expect(cqe.flags.f_buffer); // IORING_CQE_F_BUFFER flag is set
|
||||||
|
|
||||||
return cqe;
|
return cqe;
|
||||||
|
|
@ -7367,7 +7376,7 @@ fn expect_buf_grp_cqe(
|
||||||
try testing.expect(cqe.res >= 0); // success
|
try testing.expect(cqe.res >= 0); // success
|
||||||
try testing.expect(cqe.flags.f_buffer); // IORING_CQE_F_BUFFER flag is set
|
try testing.expect(cqe.flags.f_buffer); // IORING_CQE_F_BUFFER flag is set
|
||||||
try testing.expectEqual(@as(i32, @intCast(expected.len)), cqe.res);
|
try testing.expectEqual(@as(i32, @intCast(expected.len)), cqe.res);
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
|
|
||||||
// get buffer from pool
|
// get buffer from pool
|
||||||
const buffer_id = try cqe.buffer_id();
|
const buffer_id = try cqe.buffer_id();
|
||||||
|
|
@ -7456,7 +7465,7 @@ test "bind/listen/connect" {
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
var cqe = try ring.copy_cqe();
|
var cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(1, cqe.user_data);
|
try testing.expectEqual(1, cqe.user_data);
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
const listen_fd: linux.fd_t = @intCast(cqe.res);
|
const listen_fd: linux.fd_t = @intCast(cqe.res);
|
||||||
try testing.expect(listen_fd > 2);
|
try testing.expect(listen_fd > 2);
|
||||||
|
|
||||||
|
|
@ -7472,7 +7481,7 @@ test "bind/listen/connect" {
|
||||||
for (2..6) |user_data| {
|
for (2..6) |user_data| {
|
||||||
cqe = try ring.copy_cqe();
|
cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(user_data, cqe.user_data);
|
try testing.expectEqual(user_data, cqe.user_data);
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check that socket option is set
|
// Check that socket option is set
|
||||||
|
|
@ -7481,7 +7490,7 @@ test "bind/listen/connect" {
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
cqe = try ring.copy_cqe();
|
cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(5, cqe.user_data);
|
try testing.expectEqual(5, cqe.user_data);
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
try testing.expectEqual(1, optval);
|
try testing.expectEqual(1, optval);
|
||||||
|
|
||||||
// Read system assigned port into addr
|
// Read system assigned port into addr
|
||||||
|
|
@ -7497,7 +7506,7 @@ test "bind/listen/connect" {
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
const cqe = try ring.copy_cqe();
|
const cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(6, cqe.user_data);
|
try testing.expectEqual(6, cqe.user_data);
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
// Get connect socket fd
|
// Get connect socket fd
|
||||||
const connect_fd: linux.fd_t = @intCast(cqe.res);
|
const connect_fd: linux.fd_t = @intCast(cqe.res);
|
||||||
try testing.expect(connect_fd > 2 and connect_fd != listen_fd);
|
try testing.expect(connect_fd > 2 and connect_fd != listen_fd);
|
||||||
|
|
@ -7509,10 +7518,10 @@ test "bind/listen/connect" {
|
||||||
_ = try ring.connect(8, connect_fd, addrAny(&addr), @sizeOf(linux.sockaddr.in));
|
_ = try ring.connect(8, connect_fd, addrAny(&addr), @sizeOf(linux.sockaddr.in));
|
||||||
try testing.expectEqual(2, try ring.submit());
|
try testing.expectEqual(2, try ring.submit());
|
||||||
// Get listener accepted socket
|
// Get listener accepted socket
|
||||||
var accept_fd: posix.socket_t = 0;
|
var accept_fd: linux.socket_t = 0;
|
||||||
for (0..2) |_| {
|
for (0..2) |_| {
|
||||||
const cqe = try ring.copy_cqe();
|
const cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
if (cqe.user_data == 7) {
|
if (cqe.user_data == 7) {
|
||||||
accept_fd = @intCast(cqe.res);
|
accept_fd = @intCast(cqe.res);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -7526,19 +7535,19 @@ test "bind/listen/connect" {
|
||||||
try testSendRecv(&ring, accept_fd, connect_fd);
|
try testSendRecv(&ring, accept_fd, connect_fd);
|
||||||
|
|
||||||
// Shutdown and close all sockets
|
// Shutdown and close all sockets
|
||||||
for ([_]posix.socket_t{ connect_fd, accept_fd, listen_fd }) |fd| {
|
for ([_]linux.socket_t{ connect_fd, accept_fd, listen_fd }) |fd| {
|
||||||
(try ring.shutdown(9, fd, .rdwr)).link_next();
|
(try ring.shutdown(9, fd, .rdwr)).link_next();
|
||||||
_ = try ring.close(10, fd);
|
_ = try ring.close(10, fd);
|
||||||
try testing.expectEqual(2, try ring.submit());
|
try testing.expectEqual(2, try ring.submit());
|
||||||
for (0..2) |i| {
|
for (0..2) |i| {
|
||||||
const cqe = try ring.copy_cqe();
|
const cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
try testing.expectEqual(9 + i, cqe.user_data);
|
try testing.expectEqual(9 + i, cqe.user_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn testSendRecv(ring: *IoUring, send_fd: posix.socket_t, recv_fd: posix.socket_t) !void {
|
fn testSendRecv(ring: *IoUring, send_fd: linux.socket_t, recv_fd: linux.socket_t) !void {
|
||||||
const buffer_send = "0123456789abcdf" ** 10;
|
const buffer_send = "0123456789abcdf" ** 10;
|
||||||
var buffer_recv: [buffer_send.len * 2]u8 = undefined;
|
var buffer_recv: [buffer_send.len * 2]u8 = undefined;
|
||||||
|
|
||||||
|
|
@ -7549,7 +7558,7 @@ fn testSendRecv(ring: *IoUring, send_fd: posix.socket_t, recv_fd: posix.socket_t
|
||||||
for (0..2) |i| {
|
for (0..2) |i| {
|
||||||
const cqe = try ring.copy_cqe();
|
const cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(1 + i, cqe.user_data);
|
try testing.expectEqual(1 + i, cqe.user_data);
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
try testing.expectEqual(@as(i32, buffer_send.len), cqe.res);
|
try testing.expectEqual(@as(i32, buffer_send.len), cqe.res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7560,7 +7569,7 @@ fn testSendRecv(ring: *IoUring, send_fd: posix.socket_t, recv_fd: posix.socket_t
|
||||||
try testing.expectEqual(1, try ring.submit());
|
try testing.expectEqual(1, try ring.submit());
|
||||||
const cqe = try ring.copy_cqe();
|
const cqe = try ring.copy_cqe();
|
||||||
try testing.expectEqual(3, cqe.user_data);
|
try testing.expectEqual(3, cqe.user_data);
|
||||||
try testing.expectEqual(posix.E.SUCCESS, cqe.err());
|
try testing.expectEqual(linux.E.SUCCESS, cqe.err());
|
||||||
recv_len += @intCast(cqe.res);
|
recv_len += @intCast(cqe.res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue