Commit 66b0f7e92b
lib/std/Thread/Pool.zig
@@ -315,6 +315,11 @@ pub fn io(pool: *Pool) std.Io {
.vtable = &.{
.@"async" = @"async",
.@"await" = @"await",
+ .createFile = createFile,
+ .openFile = openFile,
+ .closeFile = closeFile,
+ .read = read,
+ .write = write,
},
};
}
@@ -399,3 +404,28 @@ pub fn @"await"(userdata: ?*anyopaque, any_future: *std.Io.AnyFuture, result: []
@memcpy(result, closure.resultPointer()[0..result.len]);
thread_pool.allocator.free(base[0 .. closure.result_offset + result.len]);
}
+
+pub fn createFile(userdata: ?*anyopaque, dir: std.fs.Dir, sub_path: []const u8, flags: std.fs.File.CreateFlags) std.fs.File.OpenError!std.fs.File {
+ _ = userdata;
+ return dir.createFile(sub_path, flags);
+}
+
+pub fn openFile(userdata: ?*anyopaque, dir: std.fs.Dir, sub_path: []const u8, flags: std.fs.File.OpenFlags) std.fs.File.OpenError!std.fs.File {
+ _ = userdata;
+ return dir.openFile(sub_path, flags);
+}
+
+pub fn closeFile(userdata: ?*anyopaque, file: std.fs.File) void {
+ _ = userdata;
+ return file.close();
+}
+
+pub fn read(userdata: ?*anyopaque, file: std.fs.File, buffer: []u8) std.fs.File.ReadError!usize {
+ _ = userdata;
+ return file.read(buffer);
+}
+
+pub fn write(userdata: ?*anyopaque, file: std.fs.File, buffer: []const u8) std.fs.File.WriteError!usize {
+ _ = userdata;
+ return file.write(buffer);
+}
lib/std/Io.zig
@@ -555,6 +555,7 @@ test {
}
const Io = @This();
+const fs = std.fs;
pub const EventLoop = @import("Io/EventLoop.zig");
@@ -588,6 +589,12 @@ pub const VTable = struct {
/// The length is equal to size in bytes of result type.
result: []u8,
) void,
+
+ createFile: *const fn (?*anyopaque, dir: fs.Dir, sub_path: []const u8, flags: fs.File.CreateFlags) fs.File.OpenError!fs.File,
+ openFile: *const fn (?*anyopaque, dir: fs.Dir, sub_path: []const u8, flags: fs.File.OpenFlags) fs.File.OpenError!fs.File,
+ closeFile: *const fn (?*anyopaque, fs.File) void,
+ read: *const fn (?*anyopaque, file: fs.File, buffer: []u8) fs.File.ReadError!usize,
+ write: *const fn (?*anyopaque, file: fs.File, buffer: []const u8) fs.File.WriteError!usize,
};
pub const AnyFuture = opaque {};
@@ -633,3 +640,40 @@ pub fn async(io: Io, S: type, s: S) Future(@typeInfo(@TypeOf(S.start)).@"fn".ret
);
return future;
}
+
+pub fn openFile(io: Io, dir: fs.Dir, sub_path: []const u8, flags: fs.File.OpenFlags) fs.File.OpenError!fs.File {
+ return io.vtable.openFile(io.userdata, dir, sub_path, flags);
+}
+
+pub fn createFile(io: Io, dir: fs.Dir, sub_path: []const u8, flags: fs.File.CreateFlags) fs.File.OpenError!fs.File {
+ return io.vtable.createFile(io.userdata, dir, sub_path, flags);
+}
+
+pub fn closeFile(io: Io, file: fs.File) void {
+ return io.vtable.closeFile(io.userdata, file);
+}
+
+pub fn read(io: Io, file: fs.File, buffer: []u8) fs.File.ReadError!usize {
+ return io.vtable.read(io.userdata, file, buffer);
+}
+
+pub fn write(io: Io, file: fs.File, buffer: []const u8) fs.File.WriteError!usize {
+ return io.vtable.write(io.userdata, file, buffer);
+}
+
+pub fn writeAll(io: Io, file: fs.File, bytes: []const u8) fs.File.WriteError!void {
+ var index: usize = 0;
+ while (index < bytes.len) {
+ index += try io.write(file, bytes[index..]);
+ }
+}
+
+pub fn readAll(io: Io, file: fs.File, buffer: []u8) fs.File.ReadError!usize {
+ var index: usize = 0;
+ while (index != buffer.len) {
+ const amt = try io.read(file, buffer[index..]);
+ if (amt == 0) break;
+ index += amt;
+ }
+ return index;
+}