| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- // package safe_mutex -- безопасный мьютекс
- package safe_mutex
- import (
- "log"
- "sync"
- "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_spec_base"
- )
- const (
- // Lock -- блокировка мьютекса
- Lock = def_spec_base.Num(1)
- // Unlock -- разблокировка мьютекса
- Unlock = def_spec_base.Num(0)
- // RLock -- блокировка мьютекса с чтением
- RLock = def_spec_base.Num(-1)
- )
- // MSafeMutex -- безопасный мьютекс.
- type MSafeMutex struct {
- block sync.Mutex // Блокирует операции мьютекса
- val sync.RWMutex // Фактическое значение мьютекса
- stateLock def_spec_base.Num // Значение блокировки
- }
- // MutSafeMutex -- возвращает новый безопасный мьютекс
- func MutSafeMutex() *MSafeMutex {
- sf := &MSafeMutex{}
- return sf
- }
- // Lock -- попытка захватить мьютекс
- func (sf *MSafeMutex) Lock() {
- sf.block.Lock()
- defer sf.block.Unlock()
- sf.val.Lock()
- sf.stateLock = 1
- }
- // Unlock -- освободить мьютекс
- func (sf *MSafeMutex) Unlock() {
- sf.block.Lock()
- defer sf.block.Unlock()
- if sf.stateLock == 0 {
- log.Println("ERROR MSafeMutex.Unlock(): mutex already free")
- return
- }
- sf.val.Unlock()
- sf.stateLock = 0
- }
- // RLock -- попытка захватить мьютекс
- func (sf *MSafeMutex) RLock() {
- sf.block.Lock()
- defer sf.block.Unlock()
- sf.val.RLock()
- sf.stateLock = -1
- }
- // RUnlock -- освободить мьютекс
- func (sf *MSafeMutex) RUnlock() {
- sf.block.Lock()
- defer sf.block.Unlock()
- if sf.stateLock == 0 {
- log.Println("ERROR MSafeMutex.Unlock(): mutex already free")
- return
- }
- sf.val.RUnlock()
- sf.stateLock = 0
- }
- // State -- возвращает признак захвата мьютекса
- func (sf *MSafeMutex) State() def_spec_base.Num {
- sf.block.Lock()
- defer sf.block.Unlock()
- return sf.stateLock
- }
- // IsFree -- возвращает признак свободного мьютекса
- func (sf *MSafeMutex) IsFree() def_spec_base.Bool {
- sf.block.Lock()
- defer sf.block.Unlock()
- return sf.stateLock == 0
- }
|