kctx.go 2.4 KB

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