diff --git a/go.mod b/go.mod index ceb2ba932..219897701 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( codeberg.org/gruf/go-kv v1.6.5 codeberg.org/gruf/go-list v0.0.0-20240425093752-494db03d641f codeberg.org/gruf/go-mempool v0.0.0-20240507125005-cef10d64a760 - codeberg.org/gruf/go-mutexes v1.5.1 + codeberg.org/gruf/go-mutexes v1.5.2 codeberg.org/gruf/go-runners v1.6.3 codeberg.org/gruf/go-sched v1.2.4 codeberg.org/gruf/go-storage v0.2.0 diff --git a/go.sum b/go.sum index f78c94231..7d7bb3ab0 100644 --- a/go.sum +++ b/go.sum @@ -30,8 +30,8 @@ codeberg.org/gruf/go-maps v1.0.4 h1:K+Ww4vvR3TZqm5jqrKVirmguZwa3v1VUvmig2SE8uxY= codeberg.org/gruf/go-maps v1.0.4/go.mod h1:ASX7osM7kFwt5O8GfGflcFjrwYGD8eIuRLl/oMjhEi8= codeberg.org/gruf/go-mempool v0.0.0-20240507125005-cef10d64a760 h1:m2/UCRXhjDwAg4vyji6iKCpomKw6P4PmBOUi5DvAMH4= codeberg.org/gruf/go-mempool v0.0.0-20240507125005-cef10d64a760/go.mod h1:E3RcaCFNq4zXpvaJb8lfpPqdUAmSkP5F1VmMiEUYTEk= -codeberg.org/gruf/go-mutexes v1.5.1 h1:xICU0WXhWr6wf+Iror4eE3xT+xnXNPrO6o77D/G6QuY= -codeberg.org/gruf/go-mutexes v1.5.1/go.mod h1:rPEqQ/y6CmGITaZ3GPTMQVsoZAOzbsAHyIaLsJcOqVE= +codeberg.org/gruf/go-mutexes v1.5.2 h1:rp2o774ApGUVtOHDksqtBiqIcvniVfgFWSazszDluy0= +codeberg.org/gruf/go-mutexes v1.5.2/go.mod h1:AnhagsMzUISL/nBVwhnHwDwTZOAxMILwCOG8/wKOblg= codeberg.org/gruf/go-runners v1.6.3 h1:To/AX7eTrWuXrTkA3RA01YTP5zha1VZ68LQ+0D4RY7E= codeberg.org/gruf/go-runners v1.6.3/go.mod h1:oXAaUmG2VxoKttpCqZGv5nQBeSvZSR2BzIk7h1yTRlU= codeberg.org/gruf/go-sched v1.2.4 h1:ddBB9o0D/2oU8NbQ0ldN5aWxogpXPRBATWi58+p++Hw= diff --git a/vendor/codeberg.org/gruf/go-mutexes/map.go b/vendor/codeberg.org/gruf/go-mutexes/map.go index 4b721cec4..2f21ae0bb 100644 --- a/vendor/codeberg.org/gruf/go-mutexes/map.go +++ b/vendor/codeberg.org/gruf/go-mutexes/map.go @@ -2,7 +2,6 @@ package mutexes import ( "sync" - "sync/atomic" "unsafe" "codeberg.org/gruf/go-mempool" @@ -185,34 +184,11 @@ func (mu *rwmutex) Unlock() bool { // Fully unlocked. mu.t = 0 - // 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 { - _ uint32 - notify uint32 - // ... other fields - } - - // NOTE: must remain in - // sync with sync.Cond{}. - type syncCond struct { - _ struct{} - L sync.Locker - n notifyList - // ... other fields - } - // Awake all blocked goroutines and check // for change in the last notified ticket. - cptr := (*syncCond)(unsafe.Pointer(&mu.c)) - before := atomic.LoadUint32(&cptr.n.notify) + before := syncCond_last_ticket(&mu.c) mu.c.Broadcast() // awakes all blocked! - after := atomic.LoadUint32(&cptr.n.notify) + after := syncCond_last_ticket(&mu.c) // If ticket changed, this indicates // AT LEAST one goroutine was awoken. 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) +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 1886a386e..d9e199f56 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -47,7 +47,7 @@ codeberg.org/gruf/go-maps # codeberg.org/gruf/go-mempool v0.0.0-20240507125005-cef10d64a760 ## explicit; go 1.22.2 codeberg.org/gruf/go-mempool -# codeberg.org/gruf/go-mutexes v1.5.1 +# codeberg.org/gruf/go-mutexes v1.5.2 ## explicit; go 1.22.2 codeberg.org/gruf/go-mutexes # codeberg.org/gruf/go-runners v1.6.3