kern_ctx.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // package kern_ctx -- контекст ядра.
  2. package kern_ctx
  3. import (
  4. "context"
  5. "sync"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx"
  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. // KernCtx -- контекст ядра.
  13. type KernCtx struct {
  14. *lev1.LocalCtx
  15. log *lev1.LogBuf
  16. ctxBg context.Context // Неотменяемый контекст ядра
  17. ctx context.Context // Отменяемый контекст ядра
  18. fnCancel func() // Функция отмены контекста ядра
  19. kernKeeper *kernel_keeper.KernKeeper // Встроенный сторож отмены контекста системным сигналом
  20. kernWg kspec.IKernelWg // Встроенный ожидатель потока
  21. }
  22. var (
  23. kernCtx *KernCtx // Глобальный объект контекста приложения
  24. ctxBg context.Context
  25. internalCtx context.Context
  26. internalFnCancel func()
  27. block sync.Mutex
  28. )
  29. func _init() {
  30. ctxBg = context.Background()
  31. internalCtx, internalFnCancel = context.WithCancel(ctxBg)
  32. }
  33. func init() {
  34. _init()
  35. }
  36. // GetIntenalCtx -- возвроащает внутренний контекст
  37. func GetInternalCtx() (context.Context, func()) {
  38. block.Lock()
  39. defer block.Unlock()
  40. return internalCtx, internalFnCancel
  41. }
  42. // GetKernCtx -- возвращает контекст ядра.
  43. func GetKernCtx() *KernCtx {
  44. block.Lock()
  45. defer block.Unlock()
  46. if kernCtx != nil {
  47. return kernCtx
  48. }
  49. sf := &KernCtx{
  50. LocalCtx: local_ctx.NewLocalCtx(internalCtx),
  51. ctxBg: ctxBg,
  52. ctx: internalCtx,
  53. fnCancel: internalFnCancel,
  54. }
  55. sf.log = sf.Log()
  56. sf.kernWg = kwg.GetKernelWg(sf.ctx)
  57. kKeep := kernel_keeper.GetKernelKeeper(sf.ctx, sf.fnCancel, sf.kernWg)
  58. sf.kernKeeper = kKeep
  59. kernCtx = sf
  60. return kernCtx
  61. }
  62. // Keeper -- возвращает сторож системных сигналов.
  63. func (sf *KernCtx) Keeper() *kernel_keeper.KernKeeper {
  64. return sf.kernKeeper
  65. }
  66. // Wg -- возвращает ожидатель потоков.
  67. func (sf *KernCtx) Wg() kspec.IKernelWg {
  68. return sf.kernWg
  69. }
  70. // AllDone -- блокирующий вызов ожидания отмены контекста ядра.
  71. func (sf *KernCtx) AllDone() {
  72. <-sf.ctx.Done()
  73. sf.log.Debug("kCtx.Done()")
  74. }
  75. // CtxBg -- возвращает неотменяемый контекст ядра (лучше не использовать).
  76. func (sf *KernCtx) CtxBg() context.Context {
  77. return sf.ctxBg
  78. }
  79. // Cancel -- отменяет контекст ядра.
  80. func (sf *KernCtx) Cancel() {
  81. sf.fnCancel()
  82. sf.log.Debug("kCtx.Cancel()")
  83. }