| author | |
| committer | |
| log | a430630002bf02162ccbf8d3eb10fd73e490cefd |
| tree | b25bd6e1665a9207b88e5aaac8e5c4fa10078ac1 |
| parent | 42e81cd81b8a0167c1a21aadf554cea2d882eadd |
| signature |
4 files changed, 19 insertions(+), 6 deletions(-)
src/Cache.zig+1-1| ... | @@ -690,7 +690,7 @@ pub const Manifest = struct { | ... | @@ -690,7 +690,7 @@ pub const Manifest = struct { |
| 690 | while (true) { | 690 | while (true) { |
| 691 | switch (it.next() orelse return) { | 691 | switch (it.next() orelse return) { |
| 692 | .target, .target_must_resolve => return, | 692 | .target, .target_must_resolve => return, |
| 693 | .prereq => |bytes| try self.addFilePost(bytes), | 693 | .prereq => |file_path| try self.addFilePost(file_path), |
| 694 | else => |err| { | 694 | else => |err| { |
| 695 | try err.printError(error_buf.writer()); | 695 | try err.printError(error_buf.writer()); |
| 696 | log.err("failed parsing {s}: {s}", .{ dep_file_basename, error_buf.items }); | 696 | log.err("failed parsing {s}: {s}", .{ dep_file_basename, error_buf.items }); |
src/Compilation.zig+9-1| ... | @@ -44,6 +44,7 @@ bin_file: *link.File, | ... | @@ -44,6 +44,7 @@ bin_file: *link.File, |
| 44 | c_object_table: std.AutoArrayHashMapUnmanaged(*CObject, void) = .{}, | 44 | c_object_table: std.AutoArrayHashMapUnmanaged(*CObject, void) = .{}, |
| 45 | /// This is a pointer to a local variable inside `update()`. | 45 | /// This is a pointer to a local variable inside `update()`. |
| 46 | whole_cache_manifest: ?*Cache.Manifest = null, | 46 | whole_cache_manifest: ?*Cache.Manifest = null, |
| 47 | whole_cache_manifest_mutex: std.Thread.Mutex = .{}, | ||
| 47 | 48 | ||
| 48 | link_error_flags: link.File.ErrorFlags = .{}, | 49 | link_error_flags: link.File.ErrorFlags = .{}, |
| 49 | 50 | ||
| ... | @@ -1962,8 +1963,8 @@ pub fn update(comp: *Compilation) !void { | ... | @@ -1962,8 +1963,8 @@ pub fn update(comp: *Compilation) !void { |
| 1962 | // We are about to obtain this lock, so here we give other processes a chance first. | 1963 | // We are about to obtain this lock, so here we give other processes a chance first. |
| 1963 | comp.bin_file.releaseLock(); | 1964 | comp.bin_file.releaseLock(); |
| 1964 | 1965 | ||
| 1965 | comp.whole_cache_manifest = &man; | ||
| 1966 | man = comp.cache_parent.obtain(); | 1966 | man = comp.cache_parent.obtain(); |
| 1967 | comp.whole_cache_manifest = &man; | ||
| 1967 | try comp.addNonIncrementalStuffToCacheManifest(&man); | 1968 | try comp.addNonIncrementalStuffToCacheManifest(&man); |
| 1968 | 1969 | ||
| 1969 | const is_hit = man.hit() catch |err| { | 1970 | const is_hit = man.hit() catch |err| { |
| ... | @@ -3352,6 +3353,8 @@ pub fn cImport(comp: *Compilation, c_src: []const u8) !CImportResult { | ... | @@ -3352,6 +3353,8 @@ pub fn cImport(comp: *Compilation, c_src: []const u8) !CImportResult { |
| 3352 | const dep_basename = std.fs.path.basename(out_dep_path); | 3353 | const dep_basename = std.fs.path.basename(out_dep_path); |
| 3353 | try man.addDepFilePost(zig_cache_tmp_dir, dep_basename); | 3354 | try man.addDepFilePost(zig_cache_tmp_dir, dep_basename); |
| 3354 | if (comp.whole_cache_manifest) |whole_cache_manifest| { | 3355 | if (comp.whole_cache_manifest) |whole_cache_manifest| { |
| 3356 | comp.whole_cache_manifest_mutex.lock(); | ||
| 3357 | defer comp.whole_cache_manifest_mutex.unlock(); | ||
| 3355 | try whole_cache_manifest.addDepFilePost(zig_cache_tmp_dir, dep_basename); | 3358 | try whole_cache_manifest.addDepFilePost(zig_cache_tmp_dir, dep_basename); |
| 3356 | } | 3359 | } |
| 3357 | 3360 | ||
| ... | @@ -3693,6 +3696,11 @@ fn updateCObject(comp: *Compilation, c_object: *CObject, c_obj_prog_node: *std.P | ... | @@ -3693,6 +3696,11 @@ fn updateCObject(comp: *Compilation, c_object: *CObject, c_obj_prog_node: *std.P |
| 3693 | const dep_basename = std.fs.path.basename(dep_file_path); | 3696 | const dep_basename = std.fs.path.basename(dep_file_path); |
| 3694 | // Add the files depended on to the cache system. | 3697 | // Add the files depended on to the cache system. |
| 3695 | try man.addDepFilePost(zig_cache_tmp_dir, dep_basename); | 3698 | try man.addDepFilePost(zig_cache_tmp_dir, dep_basename); |
| 3699 | if (comp.whole_cache_manifest) |whole_cache_manifest| { | ||
| 3700 | comp.whole_cache_manifest_mutex.lock(); | ||
| 3701 | defer comp.whole_cache_manifest_mutex.unlock(); | ||
| 3702 | try whole_cache_manifest.addDepFilePost(zig_cache_tmp_dir, dep_basename); | ||
| 3703 | } | ||
| 3696 | // Just to save disk space, we delete the file because it is never needed again. | 3704 | // Just to save disk space, we delete the file because it is never needed again. |
| 3697 | zig_cache_tmp_dir.deleteFile(dep_basename) catch |err| { | 3705 | zig_cache_tmp_dir.deleteFile(dep_basename) catch |err| { |
| 3698 | log.warn("failed to delete '{s}': {s}", .{ dep_file_path, @errorName(err) }); | 3706 | log.warn("failed to delete '{s}': {s}", .{ dep_file_path, @errorName(err) }); |
src/Module.zig+4| ... | @@ -3855,6 +3855,8 @@ pub fn semaFile(mod: *Module, file: *File) SemaError!void { | ... | @@ -3855,6 +3855,8 @@ pub fn semaFile(mod: *Module, file: *File) SemaError!void { |
| 3855 | }); | 3855 | }); |
| 3856 | errdefer gpa.free(resolved_path); | 3856 | errdefer gpa.free(resolved_path); |
| 3857 | 3857 | ||
| 3858 | mod.comp.whole_cache_manifest_mutex.lock(); | ||
| 3859 | defer mod.comp.whole_cache_manifest_mutex.unlock(); | ||
| 3858 | try man.addFilePostContents(resolved_path, source.bytes, source.stat); | 3860 | try man.addFilePostContents(resolved_path, source.bytes, source.stat); |
| 3859 | } | 3861 | } |
| 3860 | } else { | 3862 | } else { |
| ... | @@ -4336,6 +4338,8 @@ pub fn embedFile(mod: *Module, cur_file: *File, rel_file_path: []const u8) !*Emb | ... | @@ -4336,6 +4338,8 @@ pub fn embedFile(mod: *Module, cur_file: *File, rel_file_path: []const u8) !*Emb |
| 4336 | if (mod.comp.whole_cache_manifest) |man| { | 4338 | if (mod.comp.whole_cache_manifest) |man| { |
| 4337 | const copied_resolved_path = try gpa.dupe(u8, resolved_path); | 4339 | const copied_resolved_path = try gpa.dupe(u8, resolved_path); |
| 4338 | errdefer gpa.free(copied_resolved_path); | 4340 | errdefer gpa.free(copied_resolved_path); |
| 4341 | mod.comp.whole_cache_manifest_mutex.lock(); | ||
| 4342 | defer mod.comp.whole_cache_manifest_mutex.unlock(); | ||
| 4339 | try man.addFilePostContents(copied_resolved_path, bytes, stat); | 4343 | try man.addFilePostContents(copied_resolved_path, bytes, stat); |
| 4340 | } | 4344 | } |
| 4341 | 4345 |
src/stage1.zig+5-4| ... | @@ -455,10 +455,11 @@ export fn stage2_fetch_file( | ... | @@ -455,10 +455,11 @@ export fn stage2_fetch_file( |
| 455 | const comp = @intToPtr(*Compilation, stage1.userdata); | 455 | const comp = @intToPtr(*Compilation, stage1.userdata); |
| 456 | const file_path = path_ptr[0..path_len]; | 456 | const file_path = path_ptr[0..path_len]; |
| 457 | const max_file_size = std.math.maxInt(u32); | 457 | const max_file_size = std.math.maxInt(u32); |
| 458 | const contents = if (comp.whole_cache_manifest) |man| | 458 | const contents = if (comp.whole_cache_manifest) |man| blk: { |
| 459 | man.addFilePostFetch(file_path, max_file_size) catch return null | 459 | comp.whole_cache_manifest_mutex.lock(); |
| 460 | else | 460 | defer comp.whole_cache_manifest_mutex.unlock(); |
| 461 | std.fs.cwd().readFileAlloc(comp.gpa, file_path, max_file_size) catch return null; | 461 | break :blk man.addFilePostFetch(file_path, max_file_size) catch return null; |
| 462 | } else std.fs.cwd().readFileAlloc(comp.gpa, file_path, max_file_size) catch return null; | ||
| 462 | result_len.* = contents.len; | 463 | result_len.* = contents.len; |
| 463 | // TODO https://github.com/ziglang/zig/issues/3328#issuecomment-716749475 | 464 | // TODO https://github.com/ziglang/zig/issues/3328#issuecomment-716749475 |
| 464 | if (contents.len == 0) return @intToPtr(?[*]const u8, 0x1); | 465 | if (contents.len == 0) return @intToPtr(?[*]const u8, 0x1); |