| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- // package wgname -- ожидатель группы по имени для завершения
- package wgname
- import (
- "fmt"
- "sync"
- "wartank/pkg/components/safe_bool"
- )
- // WgName -- ожидатель группы завершения
- type WgName struct {
- dictName map[string]bool // Словарь имён потоков
- chEnd chan int // Канал сигнала закрытия ожидания
- isWork *safe_bool.БезопБул // Признак работы ожидания
- block sync.RWMutex
- }
- // NewWgName -- возвращает новый ожидатель группы
- func NewWgName() *WgName {
- сам := &WgName{
- dictName: make(map[string]bool),
- chEnd: make(chan int, 1),
- isWork: safe_bool.НовБезопБул(),
- }
- сам.isWork.Уст()
- return сам
- }
- // Add -- добавляет имя в группу ожидания
- func (сам *WgName) Add(name string) error {
- сам.block.Lock()
- defer сам.block.Unlock()
- _, isOk := сам.dictName[name]
- if isOk {
- return fmt.Errorf("WgName.Add(): name %q already exists", name)
- }
- сам.dictName[name] = true
- return nil
- }
- // Done -- отмечает словарь ожидания готовности потока
- func (сам *WgName) Done(name string) error {
- сам.block.Lock()
- defer сам.block.Unlock()
- _, isOk := сам.dictName[name]
- if !isOk {
- return fmt.Errorf("WgName.Done(): name %q not exists", name)
- }
- delete(сам.dictName, name)
- if !сам.isWork.Получ() {
- return nil
- }
- if len(сам.dictName) == 0 {
- сам.isWork.Сброс()
- close(сам.chEnd)
- }
- return nil
- }
- // Wait -- ожидание закрытия группы
- func (сам *WgName) Wait() {
- <-сам.chEnd
- }
|