commit 39605bd6bc1ce8be4a775e5530a1d866c2a700d7 (tree)
parent 4365b0df88a300a48abdfcd5534acdb048b465ba
Author: Andrew Kelley <andrew@ziglang.org>
Date: Sun, 4 Jan 2026 21:47:00 -0800
compiler: update to new createFileAtomic API
Diffstat:
4 files changed, 28 insertions(+), 22 deletions(-)
diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig
@@ -7545,7 +7545,6 @@ fn dirOpenDirWasi(
.NOMEM => return error.SystemResources,
.NOTDIR => return error.NotDir,
.PERM => return error.PermissionDenied,
- .BUSY => return error.DeviceBusy,
.NOTCAPABLE => return error.AccessDenied,
.ILSEQ => return error.BadPathName,
else => |err| return posix.unexpectedErrno(err),
@@ -14012,7 +14011,6 @@ fn windowsCreateProcessPathExt(
error.NetworkNotFound,
error.NameTooLong,
error.BadPathName,
- error.DeviceBusy,
=> return error.FileNotFound,
};
};
diff --git a/src/Builtin.zig b/src/Builtin.zig
@@ -343,10 +343,10 @@ pub fn updateFileOnDisk(file: *File, comp: *Compilation) !void {
}
// `make_path` matters because the dir hasn't actually been created yet.
- var af = try root_dir.atomicFile(io, sub_path, .{ .make_path = true, .write_buffer = &.{} });
- defer af.deinit();
- try af.file_writer.interface.writeAll(file.source.?);
- af.finish() catch |err| switch (err) {
+ var af = try root_dir.createFileAtomic(io, sub_path, .{ .make_path = true, .replace = true });
+ defer af.deinit(io);
+ try af.file.writeStreamingAll(io, file.source.?);
+ af.replace(io) catch |err| switch (err) {
error.AccessDenied => switch (builtin.os.tag) {
.windows => {
// Very likely happened due to another process or thread
diff --git a/src/Compilation.zig b/src/Compilation.zig
@@ -3916,11 +3916,14 @@ pub fn saveState(comp: *Compilation) !void {
// Using an atomic file prevents a crash or power failure from corrupting
// the previous incremental compilation state.
+ var af = try lf.emit.root_dir.handle.createFileAtomic(io, basename, .{ .replace = true });
+ defer af.deinit(io);
+
var write_buffer: [1024]u8 = undefined;
- var af = try lf.emit.root_dir.handle.atomicFile(io, basename, .{ .write_buffer = &write_buffer });
- defer af.deinit();
- try af.file_writer.interface.writeVecAll(bufs.items);
- try af.finish();
+ var file_writer = af.file.writer(io, &write_buffer);
+ try file_writer.interface.writeVecAll(bufs.items);
+ try file_writer.interface.flush();
+ try af.replace(io);
}
fn addBuf(list: *std.array_list.Managed([]const u8), buf: []const u8) void {
@@ -5244,26 +5247,31 @@ fn processOneJob(
}
}
-fn createDepFile(comp: *Compilation, depfile: []const u8, binfile: Cache.Path) anyerror!void {
+fn createDepFile(comp: *Compilation, dep_file: []const u8, bin_file: Cache.Path) anyerror!void {
const io = comp.io;
- var buf: [4096]u8 = undefined;
- var af = try Io.Dir.cwd().atomicFile(io, depfile, .{ .write_buffer = &buf });
- defer af.deinit();
- comp.writeDepFile(binfile, &af.file_writer.interface) catch return af.file_writer.err.?;
+ var af = try Io.Dir.cwd().createFileAtomic(io, dep_file, .{ .replace = true });
+ defer af.deinit(io);
- try af.finish();
+ var buf: [4096]u8 = undefined;
+ var file_writer = af.file.writer(io, &buf);
+
+ comp.writeDepFile(bin_file, &file_writer.interface) catch |err| switch (err) {
+ error.WriteFailed => return file_writer.err.?,
+ };
+ try file_writer.flush();
+ try af.replace(io);
}
fn writeDepFile(
comp: *Compilation,
- binfile: Cache.Path,
+ bin_file: Cache.Path,
w: *std.Io.Writer,
) std.Io.Writer.Error!void {
const prefixes = comp.cache_parent.prefixes();
const fsi = comp.file_system_inputs.?.items;
- try w.print("{f}:", .{binfile});
+ try w.print("{f}:", .{bin_file});
{
var it = std.mem.splitScalar(u8, fsi, 0);
diff --git a/src/fmt.zig b/src/fmt.zig
@@ -355,11 +355,11 @@ fn fmtPathFile(
try fmt.stdout_writer.interface.print("{s}\n", .{file_path});
fmt.any_error = true;
} else {
- var af = try dir.atomicFile(io, sub_path, .{ .permissions = stat.permissions, .write_buffer = &.{} });
- defer af.deinit();
+ var af = try dir.createFileAtomic(io, sub_path, .{ .permissions = stat.permissions, .replace = true });
+ defer af.deinit(io);
- try af.file_writer.interface.writeAll(fmt.out_buffer.written());
- try af.finish();
+ try af.file.writeStreamingAll(io, fmt.out_buffer.written());
+ try af.replace(io);
try fmt.stdout_writer.interface.print("{s}\n", .{file_path});
}
}