kctx.go 2.3 KB

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