|
@@ -1,4 +1,4 @@
|
|
|
-// package kwg -- именованный ожидатель потоков ядра
|
|
|
|
|
|
|
+// package kwg -- именованный ожидатель потоков ядра.
|
|
|
//
|
|
//
|
|
|
// Не позволяет завершиться ядру, если есть хоть один работающий поток
|
|
// Не позволяет завершиться ядру, если есть хоть один работающий поток
|
|
|
package kwg
|
|
package kwg
|
|
@@ -8,15 +8,15 @@ import (
|
|
|
"fmt"
|
|
"fmt"
|
|
|
"sync"
|
|
"sync"
|
|
|
|
|
|
|
|
|
|
+ . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
|
|
|
. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
|
|
. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
|
|
|
. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
|
|
. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
|
|
|
- . "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
|
|
|
|
|
"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
|
|
"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
|
|
|
. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
|
|
. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
|
|
|
"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
|
|
"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
-// kernelWg -- именованный ожидатель потоков ядра
|
|
|
|
|
|
|
+// kernelWg -- именованный ожидатель потоков ядра.
|
|
|
type kernelWg struct {
|
|
type kernelWg struct {
|
|
|
sync.RWMutex
|
|
sync.RWMutex
|
|
|
ctx context.Context
|
|
ctx context.Context
|
|
@@ -30,7 +30,7 @@ var (
|
|
|
block sync.Mutex
|
|
block sync.Mutex
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
-// GetKernelWg -- возвращает новый именованный ожидатель потоков ядра
|
|
|
|
|
|
|
+// GetKernelWg -- возвращает новый именованный ожидатель потоков ядра.
|
|
|
func GetKernelWg(ctx context.Context) IKernelWg {
|
|
func GetKernelWg(ctx context.Context) IKernelWg {
|
|
|
block.Lock()
|
|
block.Lock()
|
|
|
defer block.Unlock()
|
|
defer block.Unlock()
|
|
@@ -52,24 +52,24 @@ func GetKernelWg(ctx context.Context) IKernelWg {
|
|
|
return kernWg
|
|
return kernWg
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Log -- возвращает лог ожидателя потоков
|
|
|
|
|
|
|
+// Log -- возвращает лог ожидателя потоков.
|
|
|
func (sf *kernelWg) Log() ILogBuf {
|
|
func (sf *kernelWg) Log() ILogBuf {
|
|
|
return sf.log
|
|
return sf.log
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Len -- возвращает размер списка ожидания потоков
|
|
|
|
|
|
|
+// Len -- возвращает размер списка ожидания потоков.
|
|
|
func (sf *kernelWg) Len() int {
|
|
func (sf *kernelWg) Len() int {
|
|
|
sf.RLock()
|
|
sf.RLock()
|
|
|
defer sf.RUnlock()
|
|
defer sf.RUnlock()
|
|
|
return len(sf.dictStream)
|
|
return len(sf.dictStream)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// IsWork -- возвращает признак работы ядра
|
|
|
|
|
|
|
+// IsWork -- возвращает признак работы ядра.
|
|
|
func (sf *kernelWg) IsWork() bool {
|
|
func (sf *kernelWg) IsWork() bool {
|
|
|
return sf.isWork.Get()
|
|
return sf.isWork.Get()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// List -- возвращает список имён потоков на ожидании
|
|
|
|
|
|
|
+// List -- возвращает список имён потоков на ожидании.
|
|
|
func (sf *kernelWg) List() []AStreamName {
|
|
func (sf *kernelWg) List() []AStreamName {
|
|
|
sf.RLock()
|
|
sf.RLock()
|
|
|
defer sf.RUnlock()
|
|
defer sf.RUnlock()
|
|
@@ -80,7 +80,7 @@ func (sf *kernelWg) List() []AStreamName {
|
|
|
return lst
|
|
return lst
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Done -- удаляет поток из ожидания
|
|
|
|
|
|
|
+// Done -- удаляет поток из ожидания.
|
|
|
func (sf *kernelWg) Done(name AStreamName) {
|
|
func (sf *kernelWg) Done(name AStreamName) {
|
|
|
sf.Lock()
|
|
sf.Lock()
|
|
|
defer sf.Unlock()
|
|
defer sf.Unlock()
|
|
@@ -88,7 +88,7 @@ func (sf *kernelWg) Done(name AStreamName) {
|
|
|
sf.log.Debug("Done(): stream(%v) done", name)
|
|
sf.log.Debug("Done(): stream(%v) done", name)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Wait -- блокирующий вызов; возвращает управление, только когда все потоки завершили работу
|
|
|
|
|
|
|
+// Wait -- блокирующий вызов; возвращает управление, только когда все потоки завершили работу.
|
|
|
func (sf *kernelWg) Wait() {
|
|
func (sf *kernelWg) Wait() {
|
|
|
for {
|
|
for {
|
|
|
SleepMs()
|
|
SleepMs()
|
|
@@ -99,7 +99,7 @@ func (sf *kernelWg) Wait() {
|
|
|
sf.log.Debug("Wait(): done")
|
|
sf.log.Debug("Wait(): done")
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Add -- добавляет поток в ожидание
|
|
|
|
|
|
|
+// Add -- добавляет поток в ожидание.
|
|
|
func (sf *kernelWg) Add(name AStreamName) IResult[bool] {
|
|
func (sf *kernelWg) Add(name AStreamName) IResult[bool] {
|
|
|
sf.Lock()
|
|
sf.Lock()
|
|
|
defer sf.Unlock()
|
|
defer sf.Unlock()
|
|
@@ -115,7 +115,7 @@ func (sf *kernelWg) Add(name AStreamName) IResult[bool] {
|
|
|
return NewRes(true)
|
|
return NewRes(true)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Ожидает окончания работы ожидателя групп
|
|
|
|
|
|
|
+// Ожидает окончания работы ожидателя групп.
|
|
|
func (sf *kernelWg) close() {
|
|
func (sf *kernelWg) close() {
|
|
|
<-sf.ctx.Done()
|
|
<-sf.ctx.Done()
|
|
|
fnDone := func() bool {
|
|
fnDone := func() bool {
|