authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-12-08 15:42:42-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-12-23 22:15:08-08:00
log7f5bb118d4d90e2b883ee66e17592ac8d7808ac8
treea9ea1f3ad962cdfb7597b6e1a1d89982f7199c35
parent6f46570958af8ae27308eb4a9470e05f33aaa522

std.Io: make all the close functions batched


6 files changed, 29 insertions(+), 23 deletions(-)

lib/std/Build/Step/WriteFile.zig+1-7
...@@ -208,7 +208,7 @@ fn make(step: *Step, options: Step.MakeOptions) !void {...@@ -208,7 +208,7 @@ fn make(step: *Step, options: Step.MakeOptions) !void {
208208
209 const open_dir_cache = try arena.alloc(Io.Dir, write_file.directories.items.len);209 const open_dir_cache = try arena.alloc(Io.Dir, write_file.directories.items.len);
210 var open_dirs_count: usize = 0;210 var open_dirs_count: usize = 0;
211 defer closeDirs(open_dir_cache[0..open_dirs_count]);211 defer Io.Dir.closeMany(io, open_dir_cache[0..open_dirs_count]);
212212
213 for (write_file.directories.items, open_dir_cache) |dir, *open_dir_cache_elem| {213 for (write_file.directories.items, open_dir_cache) |dir, *open_dir_cache_elem| {
214 man.hash.addBytes(dir.sub_path);214 man.hash.addBytes(dir.sub_path);
...@@ -341,9 +341,3 @@ fn make(step: *Step, options: Step.MakeOptions) !void {...@@ -341,9 +341,3 @@ fn make(step: *Step, options: Step.MakeOptions) !void {
341341
342 try step.writeManifest(&man);342 try step.writeManifest(&man);
343}343}
344
345fn closeDirs(io: Io, dirs: []Io.Dir) void {
346 var group: Io.Group = .init;
347 defer group.wait();
348 for (dirs) |d| group.async(Io.Dir.close, .{ d, io });
349}
lib/std/Io.zig+3-3
...@@ -671,7 +671,7 @@ pub const VTable = struct {...@@ -671,7 +671,7 @@ pub const VTable = struct {
671 dirCreateFile: *const fn (?*anyopaque, Dir, []const u8, File.CreateFlags) File.OpenError!File,671 dirCreateFile: *const fn (?*anyopaque, Dir, []const u8, File.CreateFlags) File.OpenError!File,
672 dirOpenFile: *const fn (?*anyopaque, Dir, []const u8, File.OpenFlags) File.OpenError!File,672 dirOpenFile: *const fn (?*anyopaque, Dir, []const u8, File.OpenFlags) File.OpenError!File,
673 dirOpenDir: *const fn (?*anyopaque, Dir, []const u8, Dir.OpenOptions) Dir.OpenError!Dir,673 dirOpenDir: *const fn (?*anyopaque, Dir, []const u8, Dir.OpenOptions) Dir.OpenError!Dir,
674 dirClose: *const fn (?*anyopaque, Dir) void,674 dirClose: *const fn (?*anyopaque, []const Dir) void,
675 dirRead: *const fn (?*anyopaque, *Dir.Reader, []Dir.Entry) Dir.Reader.Error!usize,675 dirRead: *const fn (?*anyopaque, *Dir.Reader, []Dir.Entry) Dir.Reader.Error!usize,
676 dirRealPath: *const fn (?*anyopaque, Dir, path_name: []const u8, out_buffer: []u8) Dir.RealPathError!usize,676 dirRealPath: *const fn (?*anyopaque, Dir, path_name: []const u8, out_buffer: []u8) Dir.RealPathError!usize,
677 dirDeleteFile: *const fn (?*anyopaque, Dir, []const u8) Dir.DeleteFileError!void,677 dirDeleteFile: *const fn (?*anyopaque, Dir, []const u8) Dir.DeleteFileError!void,
...@@ -686,7 +686,7 @@ pub const VTable = struct {...@@ -686,7 +686,7 @@ pub const VTable = struct {
686686
687 fileStat: *const fn (?*anyopaque, File) File.StatError!File.Stat,687 fileStat: *const fn (?*anyopaque, File) File.StatError!File.Stat,
688 fileLength: *const fn (?*anyopaque, File) File.LengthError!u64,688 fileLength: *const fn (?*anyopaque, File) File.LengthError!u64,
689 fileClose: *const fn (?*anyopaque, File) void,689 fileClose: *const fn (?*anyopaque, []const File) void,
690 fileWriteStreaming: *const fn (?*anyopaque, File, header: []const u8, data: []const []const u8, splat: usize) File.Writer.Error!usize,690 fileWriteStreaming: *const fn (?*anyopaque, File, header: []const u8, data: []const []const u8, splat: usize) File.Writer.Error!usize,
691 fileWritePositional: *const fn (?*anyopaque, File, header: []const u8, data: []const []const u8, splat: usize, offset: u64) File.WritePositionalError!usize,691 fileWritePositional: *const fn (?*anyopaque, File, header: []const u8, data: []const []const u8, splat: usize, offset: u64) File.WritePositionalError!usize,
692 fileWriteFileStreaming: *const fn (?*anyopaque, File, header: []const u8, *Io.File.Reader, Io.Limit) File.Writer.WriteFileError!usize,692 fileWriteFileStreaming: *const fn (?*anyopaque, File, header: []const u8, *Io.File.Reader, Io.Limit) File.Writer.WriteFileError!usize,
...@@ -729,7 +729,7 @@ pub const VTable = struct {...@@ -729,7 +729,7 @@ pub const VTable = struct {
729 netRead: *const fn (?*anyopaque, src: net.Socket.Handle, data: [][]u8) net.Stream.Reader.Error!usize,729 netRead: *const fn (?*anyopaque, src: net.Socket.Handle, data: [][]u8) net.Stream.Reader.Error!usize,
730 netWrite: *const fn (?*anyopaque, dest: net.Socket.Handle, header: []const u8, data: []const []const u8, splat: usize) net.Stream.Writer.Error!usize,730 netWrite: *const fn (?*anyopaque, dest: net.Socket.Handle, header: []const u8, data: []const []const u8, splat: usize) net.Stream.Writer.Error!usize,
731 netWriteFile: *const fn (?*anyopaque, net.Socket.Handle, header: []const u8, *Io.File.Reader, Io.Limit) net.Stream.Writer.WriteFileError!usize,731 netWriteFile: *const fn (?*anyopaque, net.Socket.Handle, header: []const u8, *Io.File.Reader, Io.Limit) net.Stream.Writer.WriteFileError!usize,
732 netClose: *const fn (?*anyopaque, handle: net.Socket.Handle) void,732 netClose: *const fn (?*anyopaque, handle: []const net.Socket.Handle) void,
733 netInterfaceNameResolve: *const fn (?*anyopaque, *const net.Interface.Name) net.Interface.Name.ResolveError!net.Interface,733 netInterfaceNameResolve: *const fn (?*anyopaque, *const net.Interface.Name) net.Interface.Name.ResolveError!net.Interface,
734 netInterfaceName: *const fn (?*anyopaque, net.Interface) net.Interface.NameError!net.Interface.Name,734 netInterfaceName: *const fn (?*anyopaque, net.Interface) net.Interface.NameError!net.Interface.Name,
735 netLookup: *const fn (?*anyopaque, net.HostName, *Queue(net.HostName.LookupResult), net.HostName.LookupOptions) net.HostName.LookupError!void,735 netLookup: *const fn (?*anyopaque, net.HostName, *Queue(net.HostName.LookupResult), net.HostName.LookupOptions) net.HostName.LookupError!void,
lib/std/Io/Dir.zig+5-1
...@@ -446,7 +446,11 @@ pub fn openDirAbsolute(io: Io, absolute_path: []const u8, options: OpenOptions)...@@ -446,7 +446,11 @@ pub fn openDirAbsolute(io: Io, absolute_path: []const u8, options: OpenOptions)
446}446}
447447
448pub fn close(dir: Dir, io: Io) void {448pub fn close(dir: Dir, io: Io) void {
449 return io.vtable.dirClose(io.userdata, dir);449 return io.vtable.dirClose(io.userdata, (&dir)[0..1]);
450}
451
452pub fn closeMany(io: Io, dirs: []const Dir) void {
453 return io.vtable.dirClose(io.userdata, dirs);
450}454}
451455
452/// Opens a file for reading or writing, without attempting to create a new file.456/// Opens a file for reading or writing, without attempting to create a new file.
lib/std/Io/File.zig+5-1
...@@ -252,7 +252,11 @@ pub const OpenError = error{...@@ -252,7 +252,11 @@ pub const OpenError = error{
252} || Io.Dir.PathNameError || Io.Cancelable || Io.UnexpectedError;252} || Io.Dir.PathNameError || Io.Cancelable || Io.UnexpectedError;
253253
254pub fn close(file: File, io: Io) void {254pub fn close(file: File, io: Io) void {
255 return io.vtable.fileClose(io.userdata, file);255 return io.vtable.fileClose(io.userdata, (&file)[0..1]);
256}
257
258pub fn closeMany(io: Io, files: []const File) void {
259 return io.vtable.fileClose(io.userdata, files);
256}260}
257261
258pub const SyncError = error{262pub const SyncError = error{
lib/std/Io/Threaded.zig+9-9
...@@ -3243,10 +3243,10 @@ const MakeOpenDirAccessMaskWOptions = struct {...@@ -3243,10 +3243,10 @@ const MakeOpenDirAccessMaskWOptions = struct {
3243 create_disposition: u32,3243 create_disposition: u32,
3244};3244};
32453245
3246fn dirClose(userdata: ?*anyopaque, dir: Dir) void {3246fn dirClose(userdata: ?*anyopaque, dirs: []const Dir) void {
3247 const t: *Threaded = @ptrCast(@alignCast(userdata));3247 const t: *Threaded = @ptrCast(@alignCast(userdata));
3248 _ = t;3248 _ = t;
3249 posix.close(dir.handle);3249 for (dirs) |dir| posix.close(dir.handle);
3250}3250}
32513251
3252const dirRealPath = switch (native_os) {3252const dirRealPath = switch (native_os) {
...@@ -5515,10 +5515,10 @@ fn dirOpenDirWasi(...@@ -5515,10 +5515,10 @@ fn dirOpenDirWasi(
5515 }5515 }
5516}5516}
55175517
5518fn fileClose(userdata: ?*anyopaque, file: File) void {5518fn fileClose(userdata: ?*anyopaque, files: []const File) void {
5519 const t: *Threaded = @ptrCast(@alignCast(userdata));5519 const t: *Threaded = @ptrCast(@alignCast(userdata));
5520 _ = t;5520 _ = t;
5521 posix.close(file.handle);5521 for (files) |file| posix.close(file.handle);
5522}5522}
55235523
5524const fileReadStreaming = switch (native_os) {5524const fileReadStreaming = switch (native_os) {
...@@ -9084,18 +9084,18 @@ fn addBuf(v: []posix.iovec_const, i: *iovlen_t, bytes: []const u8) void {...@@ -9084,18 +9084,18 @@ fn addBuf(v: []posix.iovec_const, i: *iovlen_t, bytes: []const u8) void {
9084 i.* += 1;9084 i.* += 1;
9085}9085}
90869086
9087fn netClose(userdata: ?*anyopaque, handle: net.Socket.Handle) void {9087fn netClose(userdata: ?*anyopaque, handles: []const net.Socket.Handle) void {
9088 const t: *Threaded = @ptrCast(@alignCast(userdata));9088 const t: *Threaded = @ptrCast(@alignCast(userdata));
9089 _ = t;9089 _ = t;
9090 switch (native_os) {9090 switch (native_os) {
9091 .windows => closeSocketWindows(handle),9091 .windows => for (handles) |handle| closeSocketWindows(handle),
9092 else => posix.close(handle),9092 else => for (handles) |handle| posix.close(handle),
9093 }9093 }
9094}9094}
90959095
9096fn netCloseUnavailable(userdata: ?*anyopaque, handle: net.Socket.Handle) void {9096fn netCloseUnavailable(userdata: ?*anyopaque, handles: []const net.Socket.Handle) void {
9097 _ = userdata;9097 _ = userdata;
9098 _ = handle;9098 _ = handles;
9099 unreachable; // How you gonna close something that was impossible to open?9099 unreachable; // How you gonna close something that was impossible to open?
9100}9100}
91019101
lib/std/Io/net.zig+6-2
...@@ -1043,7 +1043,11 @@ pub const Socket = struct {...@@ -1043,7 +1043,11 @@ pub const Socket = struct {
10431043
1044 /// Leaves `address` in a valid state.1044 /// Leaves `address` in a valid state.
1045 pub fn close(s: *const Socket, io: Io) void {1045 pub fn close(s: *const Socket, io: Io) void {
1046 io.vtable.netClose(io.userdata, s.handle);1046 io.vtable.netClose(io.userdata, (&s.handle)[0..1]);
1047 }
1048
1049 pub fn closeMany(io: Io, sockets: []const Socket) void {
1050 io.vtable.netClose(io.userdata, sockets);
1047 }1051 }
10481052
1049 pub const SendError = error{1053 pub const SendError = error{
...@@ -1184,7 +1188,7 @@ pub const Stream = struct {...@@ -1184,7 +1188,7 @@ pub const Stream = struct {
1184 const max_iovecs_len = 8;1188 const max_iovecs_len = 8;
11851189
1186 pub fn close(s: *const Stream, io: Io) void {1190 pub fn close(s: *const Stream, io: Io) void {
1187 io.vtable.netClose(io.userdata, s.socket.handle);1191 io.vtable.netClose(io.userdata, (&s.socket.handle)[0..1]);
1188 }1192 }
11891193
1190 pub const Reader = struct {1194 pub const Reader = struct {