// package kctx -- контекст ядра. package kctx import ( "context" "sync" mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kspec" mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kernel_keeper" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kwg" ) // kCtx -- контекст ядра. type kCtx struct { mKs.ILocalCtx log mKs.ILogBuf ctxBg context.Context // Неотменяемый контекст ядра ctx context.Context // Отменяемый контекст ядра fnCancel func() // Функция отмены контекста ядра kernKeeper mKs.IKernelKeeper // Встроенный сторож отмены контекста системным сигналом kernWg mKs.IKernelWg // Встроенный ожидатель потока } var ( kernCtx *kCtx // Глобальный объект контекста приложения block sync.Mutex ) // GetKernelCtx -- возвращает контекст ядра. func GetKernelCtx() mKs.IKernelCtx { block.Lock() defer block.Unlock() if kernCtx != nil { return kernCtx } ctxBg := context.Background() ctx, fnCancel := context.WithCancel(ctxBg) sf := &kCtx{ ctxBg: ctxBg, ctx: ctx, fnCancel: fnCancel, } lCtx := mL1.NewLocalCtx(sf.ctx) sf.ILocalCtx = lCtx sf.log = sf.Log() sf.kernWg = kwg.GetKernelWg(sf.ctx) kKeep := kernel_keeper.GetKernelKeeper(sf.ctx, sf.fnCancel, sf.kernWg) sf.kernKeeper = kKeep kernCtx = sf return kernCtx } // Keeper -- возвращает сторож системных сигналов. func (sf *kCtx) Keeper() mKs.IKernelKeeper { return sf.kernKeeper } // Wg -- возвращает ожидатель потоков. func (sf *kCtx) Wg() mKs.IKernelWg { return sf.kernWg } // Done -- блокирующий вызов ожидания отмены контекста ядра. func (sf *kCtx) Done() { <-sf.ctx.Done() sf.log.Debug("kCtx.Done()") } // CtxBg -- возвращает неотменяемый контекст ядра (лучше не использовать). func (sf *kCtx) CtxBg() context.Context { return sf.ctxBg } // Cancel -- отменяет контекст ядра. func (sf *kCtx) Cancel() { sf.fnCancel() sf.log.Debug("kCtx.Cancel()") }