// package mutex -- безопасный мьютекс package mutex import ( "log" "sync" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs" ) type Mutex struct { block sync.Mutex val sync.Mutex isLock defs.Bool } // NewMutex -- возвращает новый безопасный мьютекс func NewMutex() core_spec.IMutex { sf := &Mutex{} return sf } // Unlock -- освободить мьютекс func (sf *Mutex) Unlock() { sf.block.Lock() defer sf.block.Unlock() if !sf.isLock { log.Println("ERROR Mutex.Unlock(): mutex already free") return } sf.val.Unlock() sf.isLock = false } // Lock -- попытка захватить мьютекс func (sf *Mutex) Lock() { sf.block.Lock() defer sf.block.Unlock() sf.val.Lock() sf.isLock = true } // IsLock -- возвращает признак захвата мьютекса func (sf *Mutex) IsLock() defs.Bool { sf.block.Lock() defer sf.block.Unlock() return sf.isLock } // IsFree -- возвращает признак свободного мьютекса func (sf *Mutex) IsFree() defs.Bool { sf.block.Lock() defer sf.block.Unlock() return !sf.isLock }