summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-mutexes/map_unsafe.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/codeberg.org/gruf/go-mutexes/map_unsafe.go')
-rw-r--r--vendor/codeberg.org/gruf/go-mutexes/map_unsafe.go41
1 files changed, 41 insertions, 0 deletions
diff --git a/vendor/codeberg.org/gruf/go-mutexes/map_unsafe.go b/vendor/codeberg.org/gruf/go-mutexes/map_unsafe.go
new file mode 100644
index 000000000..a59c13015
--- /dev/null
+++ b/vendor/codeberg.org/gruf/go-mutexes/map_unsafe.go
@@ -0,0 +1,41 @@
+//go:build go1.22 && !go1.25
+
+package mutexes
+
+import (
+ "sync"
+ "sync/atomic"
+ "unsafe"
+)
+
+// syncCond_last_ticket is an unsafe function that returns
+// the ticket of the last awoken / notified goroutine by a
+// a sync.Cond{}. it relies on expected memory layout.
+func syncCond_last_ticket(c *sync.Cond) uint32 {
+
+ // NOTE: must remain in
+ // sync with runtime.notifyList{}.
+ //
+ // goexperiment.staticlockranking
+ // does change it slightly, but
+ // this does not alter the first
+ // 2 fields which are all we need.
+ type notifyList struct {
+ _ atomic.Uint32
+ notify uint32
+ // ... other fields
+ }
+
+ // NOTE: must remain in
+ // sync with sync.Cond{}.
+ type syncCond struct {
+ _ struct{}
+ L sync.Locker
+ n notifyList
+ // ... other fields
+ }
+
+ // This field must be atomcially accessed.
+ cptr := (*syncCond)(unsafe.Pointer(c))
+ return atomic.LoadUint32(&cptr.n.notify)
+}