summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-mutexes/map_unsafe.go
diff options
context:
space:
mode:
authorLibravatar dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>2025-04-07 11:04:45 +0100
committerLibravatar GitHub <noreply@github.com>2025-04-07 11:04:45 +0100
commit4232d617823bff8905672b86748adb2b2461fa9a (patch)
treef808576c83daba93d43c6fb19d7291a40e462b32 /vendor/codeberg.org/gruf/go-mutexes/map_unsafe.go
parent[chore]: Bump codeberg.org/gruf/go-structr from 0.9.0 to 0.9.6 (#3973) (diff)
downloadgotosocial-4232d617823bff8905672b86748adb2b2461fa9a.tar.xz
[chore]: Bump codeberg.org/gruf/go-mutexes from 1.5.1 to 1.5.2 (#3976)
Bumps codeberg.org/gruf/go-mutexes from 1.5.1 to 1.5.2. --- updated-dependencies: - dependency-name: codeberg.org/gruf/go-mutexes dependency-version: 1.5.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
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)
+}