| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- // 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()
- }
|