compiler: update to new createFileAtomic API

This commit is contained in:
Andrew Kelley 2026-01-04 21:47:00 -08:00
parent 1b6cee8e82
commit c1e9d87b1f
4 changed files with 28 additions and 22 deletions

View file

@ -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,
};
};

View file

@ -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

View file

@ -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 af = try Io.Dir.cwd().createFileAtomic(io, dep_file, .{ .replace = true });
defer af.deinit(io);
var buf: [4096]u8 = undefined;
var af = try Io.Dir.cwd().atomicFile(io, depfile, .{ .write_buffer = &buf });
defer af.deinit();
var file_writer = af.file.writer(io, &buf);
comp.writeDepFile(binfile, &af.file_writer.interface) catch return af.file_writer.err.?;
try af.finish();
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);

View file

@ -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});
}
}