diff options
| author | Tom Read Cutting <moosichu@users.noreply.github.com> | 2022-04-22 16:12:51 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-04-22 11:12:51 -0400 |
| commit | a430630002bf02162ccbf8d3eb10fd73e490cefd (patch) | |
| tree | b25bd6e1665a9207b88e5aaac8e5c4fa10078ac1 /src | |
| parent | 42e81cd81b8a0167c1a21aadf554cea2d882eadd (diff) | |
| download | zig-a430630002bf02162ccbf8d3eb10fd73e490cefd.tar.gz zig-a430630002bf02162ccbf8d3eb10fd73e490cefd.zip | |
Fix C include files not being in `whole` cache (#11365)
Diffstat (limited to 'src')
| -rw-r--r-- | src/Cache.zig | 2 | ||||
| -rw-r--r-- | src/Compilation.zig | 10 | ||||
| -rw-r--r-- | src/Module.zig | 4 | ||||
| -rw-r--r-- | src/stage1.zig | 9 |
4 files changed, 19 insertions, 6 deletions
diff --git a/src/Cache.zig b/src/Cache.zig index 0d4b51492d..2438c5528d 100644 --- a/src/Cache.zig +++ b/src/Cache.zig @@ -690,7 +690,7 @@ pub const Manifest = struct { while (true) { switch (it.next() orelse return) { .target, .target_must_resolve => return, - .prereq => |bytes| try self.addFilePost(bytes), + .prereq => |file_path| try self.addFilePost(file_path), else => |err| { try err.printError(error_buf.writer()); log.err("failed parsing {s}: {s}", .{ dep_file_basename, error_buf.items }); diff --git a/src/Compilation.zig b/src/Compilation.zig index bfe52cd59e..d7181c7a0d 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -44,6 +44,7 @@ bin_file: *link.File, c_object_table: std.AutoArrayHashMapUnmanaged(*CObject, void) = .{}, /// This is a pointer to a local variable inside `update()`. whole_cache_manifest: ?*Cache.Manifest = null, +whole_cache_manifest_mutex: std.Thread.Mutex = .{}, link_error_flags: link.File.ErrorFlags = .{}, @@ -1962,8 +1963,8 @@ pub fn update(comp: *Compilation) !void { // We are about to obtain this lock, so here we give other processes a chance first. comp.bin_file.releaseLock(); - comp.whole_cache_manifest = &man; man = comp.cache_parent.obtain(); + comp.whole_cache_manifest = &man; try comp.addNonIncrementalStuffToCacheManifest(&man); const is_hit = man.hit() catch |err| { @@ -3352,6 +3353,8 @@ pub fn cImport(comp: *Compilation, c_src: []const u8) !CImportResult { const dep_basename = std.fs.path.basename(out_dep_path); try man.addDepFilePost(zig_cache_tmp_dir, dep_basename); if (comp.whole_cache_manifest) |whole_cache_manifest| { + comp.whole_cache_manifest_mutex.lock(); + defer comp.whole_cache_manifest_mutex.unlock(); try whole_cache_manifest.addDepFilePost(zig_cache_tmp_dir, dep_basename); } @@ -3693,6 +3696,11 @@ fn updateCObject(comp: *Compilation, c_object: *CObject, c_obj_prog_node: *std.P const dep_basename = std.fs.path.basename(dep_file_path); // Add the files depended on to the cache system. try man.addDepFilePost(zig_cache_tmp_dir, dep_basename); + if (comp.whole_cache_manifest) |whole_cache_manifest| { + comp.whole_cache_manifest_mutex.lock(); + defer comp.whole_cache_manifest_mutex.unlock(); + try whole_cache_manifest.addDepFilePost(zig_cache_tmp_dir, dep_basename); + } // Just to save disk space, we delete the file because it is never needed again. zig_cache_tmp_dir.deleteFile(dep_basename) catch |err| { log.warn("failed to delete '{s}': {s}", .{ dep_file_path, @errorName(err) }); diff --git a/src/Module.zig b/src/Module.zig index 1119d73ab0..e637a55dfb 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -3855,6 +3855,8 @@ pub fn semaFile(mod: *Module, file: *File) SemaError!void { }); errdefer gpa.free(resolved_path); + mod.comp.whole_cache_manifest_mutex.lock(); + defer mod.comp.whole_cache_manifest_mutex.unlock(); try man.addFilePostContents(resolved_path, source.bytes, source.stat); } } else { @@ -4336,6 +4338,8 @@ pub fn embedFile(mod: *Module, cur_file: *File, rel_file_path: []const u8) !*Emb if (mod.comp.whole_cache_manifest) |man| { const copied_resolved_path = try gpa.dupe(u8, resolved_path); errdefer gpa.free(copied_resolved_path); + mod.comp.whole_cache_manifest_mutex.lock(); + defer mod.comp.whole_cache_manifest_mutex.unlock(); try man.addFilePostContents(copied_resolved_path, bytes, stat); } diff --git a/src/stage1.zig b/src/stage1.zig index 005dc312ba..2533b242c7 100644 --- a/src/stage1.zig +++ b/src/stage1.zig @@ -455,10 +455,11 @@ export fn stage2_fetch_file( const comp = @intToPtr(*Compilation, stage1.userdata); const file_path = path_ptr[0..path_len]; const max_file_size = std.math.maxInt(u32); - const contents = if (comp.whole_cache_manifest) |man| - man.addFilePostFetch(file_path, max_file_size) catch return null - else - std.fs.cwd().readFileAlloc(comp.gpa, file_path, max_file_size) catch return null; + const contents = if (comp.whole_cache_manifest) |man| blk: { + comp.whole_cache_manifest_mutex.lock(); + defer comp.whole_cache_manifest_mutex.unlock(); + break :blk man.addFilePostFetch(file_path, max_file_size) catch return null; + } else std.fs.cwd().readFileAlloc(comp.gpa, file_path, max_file_size) catch return null; result_len.* = contents.len; // TODO https://github.com/ziglang/zig/issues/3328#issuecomment-716749475 if (contents.len == 0) return @intToPtr(?[*]const u8, 0x1); |
