kctx.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // package kctx -- контекст ядра
  2. package kctx
  3. import (
  4. "context"
  5. "sync"
  6. "gitp78su.ipnodns.ru/svi/kern/kc/local_ctx"
  7. "gitp78su.ipnodns.ru/svi/kern/krn/kctx/kernel_keeper"
  8. "gitp78su.ipnodns.ru/svi/kern/krn/kctx/kwg"
  9. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  10. )
  11. // kCtx -- контекст ядра
  12. type kCtx struct {
  13. ILocalCtx
  14. log ILogBuf
  15. ctxBg context.Context // Неотменяемый контекст ядра
  16. ctx context.Context // Отменяемый контекст ядра
  17. fnCancel func() // Функция отмены контекста ядра
  18. kernKeeper IKernelKeeper // Встроенный сторож отмены контекста системным сигналом
  19. kernWg IKernelWg // Встроенный ожидатель потока
  20. }
  21. var (
  22. kernCtx *kCtx // Глобальный объект контекста приложения
  23. block sync.Mutex
  24. )
  25. // GetKernelCtx -- возвращает контекст ядра
  26. func GetKernelCtx() IKernelCtx {
  27. block.Lock()
  28. defer block.Unlock()
  29. if kernCtx != nil {
  30. return kernCtx
  31. }
  32. ctxBg := context.Background()
  33. ctx, fnCancel := context.WithCancel(ctxBg)
  34. sf := &kCtx{
  35. ctxBg: ctxBg,
  36. ctx: ctx,
  37. fnCancel: fnCancel,
  38. }
  39. sf.ILocalCtx = local_ctx.NewLocalCtx(sf.ctx)
  40. sf.log = sf.Log()
  41. sf.kernWg = kwg.GetKernelWg(sf.ctx)
  42. sf.kernKeeper = kernel_keeper.GetKernelKeeper(sf.ctx, sf.fnCancel, sf.kernWg)
  43. kernCtx = sf
  44. return kernCtx
  45. }
  46. // Keeper -- возвращает сторож системных сигналов
  47. func (sf *kCtx) Keeper() IKernelKeeper {
  48. return sf.kernKeeper
  49. }
  50. // Wg -- возвращает ожидатель потоков
  51. func (sf *kCtx) Wg() IKernelWg {
  52. return sf.kernWg
  53. }
  54. // Done -- блокирующий вызов ожидания отмены контекста ядра
  55. func (sf *kCtx) Done() {
  56. <-sf.ctx.Done()
  57. sf.log.Debug("kCtx.Done()")
  58. }
  59. // CtxBg -- возвращает неотменяемый контекст ядра (лучше не использовать)
  60. func (sf *kCtx) CtxBg() context.Context {
  61. return sf.ctxBg
  62. }
  63. // Cancel -- отменяет контекст ядра
  64. func (sf *kCtx) Cancel() {
  65. sf.fnCancel()
  66. sf.log.Debug("kCtx.Cancel()")
  67. }