diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index 1b6c97a127..9bdfbd489a 100644 --- 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 index a097e88734..92a0e40ae3 100644 --- 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 index 82f45ee9f0..957e0fadcf 100644 --- 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 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); diff --git a/src/fmt.zig b/src/fmt.zig index b1903aad53..a3cd7c8d74 100644 --- 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}); } }