diff --git a/locker/spin_locker.go b/locker/spin_locker.go new file mode 100644 index 0000000..8db0e44 --- /dev/null +++ b/locker/spin_locker.go @@ -0,0 +1,22 @@ +package locker + +import ( + "runtime" + "sync/atomic" +) + +type spinLock uint32 + +func NewSpinLocker() *spinLock { + return new(spinLock) +} + +func (sl *spinLock) Lock() { + for !atomic.CompareAndSwapUint32((*uint32)(sl), 0, 1) { + runtime.Gosched() + } +} + +func (sl *spinLock) Unlock() { + atomic.StoreUint32((*uint32)(sl), 0) +}