authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-06-12 13:20:14-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-06-12 13:20:14-04:00
log44f4abf3805eb457525a474f243b71373b5c3824
tree9558809eac9dbb93c50e128c417a2196d81f44d3
parentd9bd34fd0533295044ffb4160da41f7873aff905
parent727f1fa74316e412c32828689e569a3d1fd1981b
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #20269 from ziglang/fix-progress-race


2 files changed, 20 insertions(+), 16 deletions(-)

lib/std/Progress.zig+14-5
......@@ -734,7 +734,7 @@ const Serialized = struct {
734734 const Buffer = struct {
735735 parents: [node_storage_buffer_len]Node.Parent,
736736 storage: [node_storage_buffer_len]Node.Storage,
737 map: [node_storage_buffer_len]Node.Index,
737 map: [node_storage_buffer_len]Node.OptionalIndex,
738738
739739 parents_copy: [node_storage_buffer_len]Node.Parent,
740740 storage_copy: [node_storage_buffer_len]Node.Storage,
......@@ -753,9 +753,11 @@ fn serialize(serialized_buffer: *Serialized.Buffer) Serialized {
753753 // Iterate all of the nodes and construct a serializable copy of the state that can be examined
754754 // without atomics.
755755 const end_index = @atomicLoad(u32, &global_progress.node_end_index, .monotonic);
756 const node_parents = global_progress.node_parents[0..end_index];
757 const node_storage = global_progress.node_storage[0..end_index];
758 for (node_parents, node_storage, 0..) |*parent_ptr, *storage_ptr, i| {
756 for (
757 global_progress.node_parents[0..end_index],
758 global_progress.node_storage[0..end_index],
759 serialized_buffer.map[0..end_index],
760 ) |*parent_ptr, *storage_ptr, *map| {
759761 var begin_parent = @atomicLoad(Node.Parent, parent_ptr, .acquire);
760762 while (begin_parent != .unused) {
761763 const dest_storage = &serialized_buffer.storage[serialized_len];
......@@ -766,12 +768,19 @@ fn serialize(serialized_buffer: *Serialized.Buffer) Serialized {
766768 if (begin_parent == end_parent) {
767769 any_ipc = any_ipc or (dest_storage.getIpcFd() != null);
768770 serialized_buffer.parents[serialized_len] = begin_parent;
769 serialized_buffer.map[i] = @enumFromInt(serialized_len);
771 map.* = @enumFromInt(serialized_len);
770772 serialized_len += 1;
771773 break;
772774 }
773775
774776 begin_parent = end_parent;
777 } else {
778 // A node may be freed during the execution of this loop, causing
779 // there to be a parent reference to a nonexistent node. Without
780 // this assignment, this would lead to the map entry containing
781 // stale data. By assigning none, the child node with the bad
782 // parent pointer will be harmlessly omitted from the tree.
783 map.* = .none;
775784 }
776785 }
777786
tools/update_cpu_features.zig+6-11
......@@ -1038,8 +1038,7 @@ pub fn main() anyerror!void {
10381038 var zig_src_dir = try fs.cwd().openDir(zig_src_root, .{});
10391039 defer zig_src_dir.close();
10401040
1041 var progress = std.Progress{};
1042 const root_progress = progress.start("", llvm_targets.len);
1041 const root_progress = std.Progress.start(.{ .estimated_total_items = llvm_targets.len });
10431042 defer root_progress.end();
10441043
10451044 if (builtin.single_threaded) {
......@@ -1074,7 +1073,7 @@ const Job = struct {
10741073 llvm_tblgen_exe: []const u8,
10751074 llvm_src_root: []const u8,
10761075 zig_src_dir: std.fs.Dir,
1077 root_progress: *std.Progress.Node,
1076 root_progress: std.Progress.Node,
10781077 llvm_target: LlvmTarget,
10791078};
10801079
......@@ -1085,12 +1084,10 @@ fn processOneTarget(job: Job) anyerror!void {
10851084 defer arena_state.deinit();
10861085 const arena = arena_state.allocator();
10871086
1088 var progress_node = job.root_progress.start(llvm_target.zig_name, 3);
1089 progress_node.activate();
1087 const progress_node = job.root_progress.start(llvm_target.zig_name, 3);
10901088 defer progress_node.end();
10911089
1092 var tblgen_progress = progress_node.start("invoke llvm-tblgen", 0);
1093 tblgen_progress.activate();
1090 const tblgen_progress = progress_node.start("invoke llvm-tblgen", 0);
10941091
10951092 const child_args = [_][]const u8{
10961093 job.llvm_tblgen_exe,
......@@ -1127,16 +1124,14 @@ fn processOneTarget(job: Job) anyerror!void {
11271124 },
11281125 };
11291126
1130 var json_parse_progress = progress_node.start("parse JSON", 0);
1131 json_parse_progress.activate();
1127 const json_parse_progress = progress_node.start("parse JSON", 0);
11321128
11331129 const parsed = try json.parseFromSlice(json.Value, arena, json_text, .{});
11341130 defer parsed.deinit();
11351131 const root_map = &parsed.value.object;
11361132 json_parse_progress.end();
11371133
1138 var render_progress = progress_node.start("render zig code", 0);
1139 render_progress.activate();
1134 const render_progress = progress_node.start("render zig code", 0);
11401135
11411136 var features_table = std.StringHashMap(Feature).init(arena);
11421137 var all_features = std.ArrayList(Feature).init(arena);