diff --git a/lib/std/Io.zig b/lib/std/Io.zig index 859568a15a88845793c23df3a5b21c59920120a2..a6507df6187dbe881e625599a68bd5ec1a07ebe2 100644 --- a/lib/std/Io.zig +++ b/lib/std/Io.zig @@ -667,6 +667,7 @@ pub const VTable = struct { dirCreateFile: *const fn (?*anyopaque, Dir, sub_path: []const u8, File.CreateFlags) File.OpenError!File, dirOpenFile: *const fn (?*anyopaque, Dir, sub_path: []const u8, File.OpenFlags) File.OpenError!File, dirOpenDir: *const fn (?*anyopaque, Dir, sub_path: []const u8, Dir.OpenOptions) Dir.OpenError!Dir, + dirClose: *const fn (?*anyopaque, Dir) void, fileStat: *const fn (?*anyopaque, File) File.StatError!File.Stat, fileClose: *const fn (?*anyopaque, File) void, fileWriteStreaming: *const fn (?*anyopaque, File, buffer: [][]const u8) File.WriteStreamingError!usize, diff --git a/lib/std/Io/Dir.zig b/lib/std/Io/Dir.zig index 45833dd7f7757bfb46948cd173d613799fe48d80..749bea99ba91a214f4a88623b315cd966add4634 100644 --- a/lib/std/Io/Dir.zig +++ b/lib/std/Io/Dir.zig @@ -93,6 +93,10 @@ pub fn openDir(dir: Dir, io: Io, sub_path: []const u8, options: OpenOptions) Ope return io.vtable.dirOpenDir(io.userdata, dir, sub_path, options); } +pub fn close(dir: Dir, io: Io) void { + return io.vtable.dirClose(io.userdata, dir); +} + pub fn openFile(dir: Dir, io: Io, sub_path: []const u8, flags: File.OpenFlags) File.OpenError!File { return io.vtable.dirOpenFile(io.userdata, dir, sub_path, flags); } diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index b1ef09e34d770c3532f3160530c2bb89acc9489a..330cc6725db43f09fbcdbd01ad249e69a79e6aaa 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -203,6 +203,7 @@ pub fn io(t: *Threaded) Io { .wasi => dirOpenDirWasi, else => dirOpenDirPosix, }, + .dirClose = dirClose, .fileClose = fileClose, .fileWriteStreaming = fileWriteStreaming, .fileWritePositional = fileWritePositional, @@ -1685,6 +1686,12 @@ fn dirOpenDirPosix( @panic("TODO"); } +fn dirClose(userdata: ?*anyopaque, dir: Io.Dir) void { + const t: *Threaded = @ptrCast(@alignCast(userdata)); + _ = t; + posix.close(dir.handle); +} + fn dirOpenDirWasi( userdata: ?*anyopaque, dir: Io.Dir, diff --git a/lib/std/Io/net.zig b/lib/std/Io/net.zig index 17d82451c5c69a92ad49478fe3eb0440fa761e5f..f262a0d6b58f075f805803494599059d9e4f1261 100644 --- a/lib/std/Io/net.zig +++ b/lib/std/Io/net.zig @@ -1033,9 +1033,8 @@ pub const Socket = struct { }; /// Leaves `address` in a valid state. - pub fn close(s: *Socket, io: Io) void { + pub fn close(s: *const Socket, io: Io) void { io.vtable.netClose(io.userdata, s.handle); - s.handle = undefined; } pub const SendError = error{ @@ -1163,13 +1162,7 @@ pub const Stream = struct { const max_iovecs_len = 8; - pub fn close(s: *Stream, io: Io) void { - io.vtable.netClose(io.userdata, s.socket.handle); - s.* = undefined; - } - - /// Same as `close` but doesn't try to set `Stream` to `undefined`. - pub fn closeConst(s: *const Stream, io: Io) void { + pub fn close(s: *const Stream, io: Io) void { io.vtable.netClose(io.userdata, s.socket.handle); }