// package kernel_ctx -- контекст ядра package kernel_ctx import ( "context" "log" "sync" "wartank/pkg/kernel/kernel_ctx/kernel_keeper" "wartank/pkg/kernel/kernel_ctx/kernel_wg" . "wartank/pkg/kernel/kernel_types" ) // kernelCtx -- контекст ядра type kernelCtx struct { ctxBg context.Context // Неотменяемый контекст ядра ctx context.Context // Отменяемый контекст ядра fnCancel func() // Функция отмены контекста ядра dictVal map[string]interface{} // Словарь различных значений kernKeeper IKernelKeeper // Встроенный сторож отмены контекста системным сигналом kernWg IKernelWg // Встроенный ожидатель потока block sync.RWMutex } var ( kernCtx *kernelCtx // Глобальный объект контекста приложения block sync.Mutex ) // ПолучЯдроКонтекст -- возвращает контекст ядра func ПолучЯдроКонтекст() ИЯдроКонтекст { block.Lock() defer block.Unlock() if kernCtx != nil { return kernCtx } ctxBg := context.Background() ctx, fnCancel := context.WithCancel(ctxBg) sf := &kernelCtx{ ctxBg: ctxBg, ctx: ctx, fnCancel: fnCancel, dictVal: map[string]interface{}{}, } sf.kernWg = kernel_wg.GetKernelWg(sf.ctx) sf.kernKeeper = kernel_keeper.GetKernelKeeper(sf.ctx, sf.fnCancel, sf.kernWg) kernCtx = sf return kernCtx } // Оп -- возвращает ожидатель потоков func (sf *kernelCtx) Оп() IKernelWg { return sf.kernWg } // Получ -- возвращает хранимое значение func (sf *kernelCtx) Получ(key string) interface{} { sf.block.RLock() defer sf.block.RUnlock() return sf.dictVal[key] } // Уст -- устанавливает значение в контекст func (sf *kernelCtx) Уст(key string, val interface{}) { sf.block.Lock() defer sf.block.Unlock() sf.dictVal[key] = val } // Ждать -- блокирующий вызов ожидания отмены контекста ядра func (sf *kernelCtx) Ждать() { <-sf.ctx.Done() log.Println("kernelCtx.Done()") } // КонтФон -- возвращает неотменяемый контекст ядра (лучше не использовать) func (sf *kernelCtx) КонтФон() context.Context { return sf.ctxBg } // Конт -- возвращает контекст ядра func (sf *kernelCtx) Конт() context.Context { return sf.ctx } // Отменить -- отменяет контекст ядра func (sf *kernelCtx) Отменить() { log.Println("kernelCtx.Cancel()") sf.fnCancel() }