authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-07-10 19:03:07-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-07-10 19:03:07-04:00
log98f3a262a7aec25e0a7f0872dc7fafc9008be1d2
tree76d566351bcff414f3b17aa6551255a9bd65d224
parent2c89f3b65427e8ca733a9977ded4e8c6f0a89650

InternPool: fix extra mutation races


1 files changed, 12 insertions(+), 6 deletions(-)

src/InternPool.zig+12-6
......@@ -416,7 +416,7 @@ const Local = struct {
416416 arena: std.heap.ArenaAllocator.State,
417417
418418 items: ListMutate,
419 extra: ListMutate,
419 extra: MutexListMutate,
420420 limbs: ListMutate,
421421 strings: ListMutate,
422422 tracked_insts: MutexListMutate,
......@@ -758,7 +758,7 @@ const Local = struct {
758758 return .{
759759 .gpa = gpa,
760760 .arena = &local.mutate.arena,
761 .mutate = &local.mutate.extra,
761 .mutate = &local.mutate.extra.list,
762762 .list = &local.shared.extra,
763763 };
764764 }
......@@ -2999,6 +2999,9 @@ pub const LoadedStructType = struct {
29992999 }
30003000
30013001 pub fn setInitsWip(s: LoadedStructType, ip: *InternPool) bool {
3002 const local = ip.getLocal(s.tid);
3003 local.mutate.extra.mutex.lock();
3004 defer local.mutate.extra.mutex.unlock();
30023005 return switch (s.layout) {
30033006 .@"packed" => @as(Tag.TypeStructPacked.Flags, @bitCast(@atomicRmw(
30043007 u32,
......@@ -5437,7 +5440,7 @@ pub fn init(ip: *InternPool, gpa: Allocator, available_threads: usize) !void {
54375440 .arena = .{},
54385441
54395442 .items = Local.ListMutate.empty,
5440 .extra = Local.ListMutate.empty,
5443 .extra = Local.MutexListMutate.empty,
54415444 .limbs = Local.ListMutate.empty,
54425445 .strings = Local.ListMutate.empty,
54435446 .tracked_insts = Local.MutexListMutate.empty,
......@@ -9410,10 +9413,13 @@ pub fn errorUnionPayload(ip: *const InternPool, ty: Index) Index {
94109413/// The is only legal because the initializer is not part of the hash.
94119414pub fn mutateVarInit(ip: *InternPool, index: Index, init_index: Index) void {
94129415 const unwrapped_index = index.unwrap(ip);
9413 const extra_list = unwrapped_index.getExtra(ip);
9416 const local = ip.getLocal(unwrapped_index.tid);
9417 local.mutate.extra.mutex.lock();
9418 defer local.mutate.extra.mutex.unlock();
9419 const extra_items = local.shared.extra.view().items(.@"0");
94149420 const item = unwrapped_index.getItem(ip);
94159421 assert(item.tag == .variable);
9416 @atomicStore(u32, &extra_list.view().items(.@"0")[item.data + std.meta.fieldIndex(Tag.Variable, "init").?], @intFromEnum(init_index), .release);
9422 @atomicStore(u32, &extra_items[item.data + std.meta.fieldIndex(Tag.Variable, "init").?], @intFromEnum(init_index), .release);
94179423}
94189424
94199425pub fn dump(ip: *const InternPool) void {
......@@ -9428,7 +9434,7 @@ fn dumpStatsFallible(ip: *const InternPool, arena: Allocator) anyerror!void {
94289434 var decls_len: usize = 0;
94299435 for (ip.locals) |*local| {
94309436 items_len += local.mutate.items.len;
9431 extra_len += local.mutate.extra.len;
9437 extra_len += local.mutate.extra.list.len;
94329438 limbs_len += local.mutate.limbs.len;
94339439 decls_len += local.mutate.decls.buckets_list.len;
94349440 }