github.com/pkujhd/goloader@v0.0.0-20240411034752-1a28096bd7bd/iface.go (about) 1 package goloader 2 3 import "unsafe" 4 5 // Mutual exclusion locks. In the uncontended case, 6 // as fast as spin locks (just a few user-level instructions), 7 // but on the contention path they sleep in the kernel. 8 // A zeroed Mutex is unlocked (no need to initialize each lock). 9 type mutex struct { 10 // Futex-based impl treats it as uint32 key, 11 // while sema-based impl as M* waitm. 12 // Used to be a union, but unions break precise GC. 13 key uintptr 14 } 15 16 //go:linkname lock runtime.lock 17 func lock(l *mutex) 18 19 //go:linkname unlock runtime.unlock 20 func unlock(l *mutex) 21 22 //go:linkname atomicstorep runtime.atomicstorep 23 func atomicstorep(ptr unsafe.Pointer, new unsafe.Pointer)