diff options
Diffstat (limited to 'vendor/codeberg.org/gruf/go-mutexes/map_unsafe.go')
| -rw-r--r-- | vendor/codeberg.org/gruf/go-mutexes/map_unsafe.go | 41 |
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) +} |
