diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2024-03-16 15:45:10 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-16 18:45:10 -0400 |
| commit | 242ab81112c05fa815523551a6f612c5a12c52b2 (patch) | |
| tree | 32b581f036137436932883ffdfab24aec64576db /lib/std/debug.zig | |
| parent | 1b8d1b18c7ec1c8002046d8a7e131bf21ccf92ca (diff) | |
| download | zig-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.zig | 23 |
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; } |
