| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- // 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
- }
|