kctx.go 2.3 KB

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