diff options
Diffstat (limited to 'src/io/io_linux.zig')
-rw-r--r-- | src/io/io_linux.zig | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/io/io_linux.zig b/src/io/io_linux.zig index f69f70c5b..b22dc92a5 100644 --- a/src/io/io_linux.zig +++ b/src/io/io_linux.zig @@ -62,8 +62,24 @@ unqueued: FIFO(Completion) = .{}, /// Completions that are ready to have their callbacks run. completed: FIFO(Completion) = .{}, -pub fn init(entries: u12, flags: u32) !IO { - return IO{ .ring = try IO_Uring.init(entries, flags) }; +pub fn init(entries_: u12, flags: u32) !IO { + var ring: IO_Uring = undefined; + var entries = entries_; + while (true) { + ring = IO_Uring.init(entries, flags) catch |err| { + if (err == error.SystemResources) { + if (entries < 4) return error.SystemResources; + entries /= 2; + continue; + } + + return err; + }; + break; + } + + + return IO{ .ring = ring }; } pub fn deinit(self: *IO) void { |