mirror of
https://gitclone.com/github.com/MetaCubeX/Clash.Meta
synced 2024-11-15 05:31:18 +08:00
27 lines
382 B
Go
27 lines
382 B
Go
|
//go:build go1.22
|
||
|
|
||
|
package once
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
"sync/atomic"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
type Once struct {
|
||
|
done atomic.Uint32
|
||
|
m sync.Mutex
|
||
|
}
|
||
|
|
||
|
func Done(once *sync.Once) bool {
|
||
|
// atomic visit sync.Once.done
|
||
|
return (*atomic.Uint32)(unsafe.Pointer(once)).Load() == 1
|
||
|
}
|
||
|
|
||
|
func Reset(once *sync.Once) {
|
||
|
o := (*Once)(unsafe.Pointer(once))
|
||
|
o.m.Lock()
|
||
|
defer o.m.Unlock()
|
||
|
o.done.Store(0)
|
||
|
}
|