aboutsummaryrefslogtreecommitdiff
path: root/lib/std/debug.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2024-03-16 15:45:10 -0700
committerGitHub <noreply@github.com>2024-03-16 18:45:10 -0400
commit242ab81112c05fa815523551a6f612c5a12c52b2 (patch)
tree32b581f036137436932883ffdfab24aec64576db /lib/std/debug.zig
parent1b8d1b18c7ec1c8002046d8a7e131bf21ccf92ca (diff)
downloadzig-242ab81112c05fa815523551a6f612c5a12c52b2.tar.gz
zig-242ab81112c05fa815523551a6f612c5a12c52b2.zip
std: introduce pointer stability locks to hash maps (#17719)
This adds std.debug.SafetyLock and uses it in std.HashMapUnmanaged by adding lockPointers() and unlockPointers(). This provides a way to detect when an illegal modification has happened and panic rather than invoke undefined behavior.
Diffstat (limited to 'lib/std/debug.zig')
-rw-r--r--lib/std/debug.zig23
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/std/debug.zig b/lib/std/debug.zig
index 13e2d95e2c..f190e7fee2 100644
--- a/lib/std/debug.zig
+++ b/lib/std/debug.zig
@@ -2838,6 +2838,29 @@ pub fn ConfigurableTrace(comptime size: usize, comptime stack_frame_count: usize
};
}
+pub const SafetyLock = struct {
+ state: State = .unlocked,
+
+ pub const State = if (runtime_safety) enum { unlocked, locked } else enum { unlocked };
+
+ pub fn lock(l: *SafetyLock) void {
+ if (!runtime_safety) return;
+ assert(l.state == .unlocked);
+ l.state = .locked;
+ }
+
+ pub fn unlock(l: *SafetyLock) void {
+ if (!runtime_safety) return;
+ assert(l.state == .locked);
+ l.state = .unlocked;
+ }
+
+ pub fn assertUnlocked(l: SafetyLock) void {
+ if (!runtime_safety) return;
+ assert(l.state == .unlocked);
+ }
+};
+
test {
_ = &dump_hex;
}