aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Read Cutting <moosichu@users.noreply.github.com>2022-04-22 16:12:51 +0100
committerGitHub <noreply@github.com>2022-04-22 11:12:51 -0400
commita430630002bf02162ccbf8d3eb10fd73e490cefd (patch)
treeb25bd6e1665a9207b88e5aaac8e5c4fa10078ac1 /src
parent42e81cd81b8a0167c1a21aadf554cea2d882eadd (diff)
downloadzig-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.zig2
-rw-r--r--src/Compilation.zig10
-rw-r--r--src/Module.zig4
-rw-r--r--src/stage1.zig9
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);