mirror of
https://github.com/ziglang/zig.git
synced 2026-02-21 16:54:52 +00:00
Make enter(), flush_sq(), sq_ring_needs_enter(), cq_ring_needs_flush() public
These will also be needed by any custom helpers
This commit is contained in:
parent
40293a0643
commit
e51728a1b4
@ -18,7 +18,7 @@ comptime {
|
||||
assert(@sizeOf(io_uring_params) == 120);
|
||||
assert(@sizeOf(io_uring_sqe) == 64);
|
||||
assert(@sizeOf(io_uring_cqe) == 16);
|
||||
|
||||
|
||||
assert(linux.IORING_OFF_SQ_RING == 0);
|
||||
assert(linux.IORING_OFF_CQ_RING == 0x8000000);
|
||||
assert(linux.IORING_OFF_SQES == 0x10000000);
|
||||
@ -192,9 +192,9 @@ pub const IO_Uring = struct {
|
||||
return submitted;
|
||||
}
|
||||
|
||||
// Tell the kernel we have submitted SQEs and/or want to wait for CQEs.
|
||||
// Returns the number of SQEs submitted.
|
||||
fn enter(self: *IO_Uring, to_submit: u32, min_complete: u32, flags: u32) !u32 {
|
||||
/// Tell the kernel we have submitted SQEs and/or want to wait for CQEs.
|
||||
/// Returns the number of SQEs submitted.
|
||||
pub fn enter(self: *IO_Uring, to_submit: u32, min_complete: u32, flags: u32) !u32 {
|
||||
assert(self.fd >= 0);
|
||||
const res = linux.io_uring_enter(self.fd, to_submit, min_complete, flags, null);
|
||||
switch (linux.getErrno(res)) {
|
||||
@ -225,12 +225,12 @@ pub const IO_Uring = struct {
|
||||
return @truncate(u32, res);
|
||||
}
|
||||
|
||||
// Sync internal state with kernel ring state on the SQ side.
|
||||
// Returns the number of all pending events in the SQ ring, for the shared ring.
|
||||
// This return value includes previously flushed SQEs, as per liburing.
|
||||
// The reasoning for this is to suggest that an io_uring_enter() call is needed rather than not.
|
||||
// Matches the implementation of __io_uring_flush_sq() in liburing.
|
||||
fn flush_sq(self: *IO_Uring) u32 {
|
||||
/// Sync internal state with kernel ring state on the SQ side.
|
||||
/// Returns the number of all pending events in the SQ ring, for the shared ring.
|
||||
/// This return value includes previously flushed SQEs, as per liburing.
|
||||
/// The rationale is to suggest that an io_uring_enter() call is needed rather than not.
|
||||
/// Matches the implementation of __io_uring_flush_sq() in liburing.
|
||||
pub fn flush_sq(self: *IO_Uring) u32 {
|
||||
if (self.sq.sqe_head != self.sq.sqe_tail) {
|
||||
// Fill in SQEs that we have queued up, adding them to the kernel ring.
|
||||
const to_submit = self.sq.sqe_tail -% self.sq.sqe_head;
|
||||
@ -252,7 +252,7 @@ pub const IO_Uring = struct {
|
||||
/// or if IORING_SQ_NEED_WAKEUP is set and the SQ thread must be explicitly awakened.
|
||||
/// For the latter case, we set the SQ thread wakeup flag.
|
||||
/// Matches the implementation of sq_ring_needs_enter() in liburing.
|
||||
fn sq_ring_needs_enter(self: *IO_Uring, submitted: u32, flags: *u32) bool {
|
||||
pub fn sq_ring_needs_enter(self: *IO_Uring, submitted: u32, flags: *u32) bool {
|
||||
assert(flags.* == 0);
|
||||
if ((self.flags & linux.IORING_SETUP_SQPOLL) == 0 and submitted > 0) return true;
|
||||
if ((@atomicLoad(u32, self.sq.flags, .Unordered) & linux.IORING_SQ_NEED_WAKEUP) != 0) {
|
||||
@ -326,8 +326,8 @@ pub const IO_Uring = struct {
|
||||
return cqes[0];
|
||||
}
|
||||
|
||||
// Matches the implementation of cq_ring_needs_flush() in liburing.
|
||||
fn cq_ring_needs_flush(self: *IO_Uring) bool {
|
||||
/// Matches the implementation of cq_ring_needs_flush() in liburing.
|
||||
pub fn cq_ring_needs_flush(self: *IO_Uring) bool {
|
||||
return (@atomicLoad(u32, self.sq.flags, .Unordered) & linux.IORING_SQ_CQ_OVERFLOW) != 0;
|
||||
}
|
||||
|
||||
@ -567,7 +567,6 @@ pub const IO_Uring = struct {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
pub const SubmissionQueue = struct {
|
||||
head: *u32,
|
||||
tail: *u32,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user