kernel_ctx.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // package kernel_ctx -- контекст ядра
  2. package kernel_ctx
  3. import (
  4. "context"
  5. "log"
  6. "sync"
  7. "wartank/pkg/kernel/kernel_ctx/kernel_keeper"
  8. "wartank/pkg/kernel/kernel_ctx/kernel_wg"
  9. . "wartank/pkg/kernel/kernel_types"
  10. )
  11. // kernelCtx -- контекст ядра
  12. type kernelCtx struct {
  13. ctxBg context.Context // Неотменяемый контекст ядра
  14. ctx context.Context // Отменяемый контекст ядра
  15. fnCancel func() // Функция отмены контекста ядра
  16. dictVal map[string]interface{} // Словарь различных значений
  17. kernKeeper IKernelKeeper // Встроенный сторож отмены контекста системным сигналом
  18. kernWg IKernelWg // Встроенный ожидатель потока
  19. block sync.RWMutex
  20. }
  21. var (
  22. kernCtx *kernelCtx // Глобальный объект контекста приложения
  23. block sync.Mutex
  24. )
  25. // ПолучЯдроКонтекст -- возвращает контекст ядра
  26. func ПолучЯдроКонтекст() ИЯдроКонтекст {
  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 := &kernelCtx{
  35. ctxBg: ctxBg,
  36. ctx: ctx,
  37. fnCancel: fnCancel,
  38. dictVal: map[string]interface{}{},
  39. }
  40. sf.kernWg = kernel_wg.GetKernelWg(sf.ctx)
  41. sf.kernKeeper = kernel_keeper.GetKernelKeeper(sf.ctx, sf.fnCancel, sf.kernWg)
  42. kernCtx = sf
  43. return kernCtx
  44. }
  45. // Оп -- возвращает ожидатель потоков
  46. func (sf *kernelCtx) Оп() IKernelWg {
  47. return sf.kernWg
  48. }
  49. // Получ -- возвращает хранимое значение
  50. func (sf *kernelCtx) Получ(key string) interface{} {
  51. sf.block.RLock()
  52. defer sf.block.RUnlock()
  53. return sf.dictVal[key]
  54. }
  55. // Уст -- устанавливает значение в контекст
  56. func (sf *kernelCtx) Уст(key string, val interface{}) {
  57. sf.block.Lock()
  58. defer sf.block.Unlock()
  59. sf.dictVal[key] = val
  60. }
  61. // Ждать -- блокирующий вызов ожидания отмены контекста ядра
  62. func (sf *kernelCtx) Ждать() {
  63. <-sf.ctx.Done()
  64. log.Println("kernelCtx.Done()")
  65. }
  66. // КонтФон -- возвращает неотменяемый контекст ядра (лучше не использовать)
  67. func (sf *kernelCtx) КонтФон() context.Context {
  68. return sf.ctxBg
  69. }
  70. // Конт -- возвращает контекст ядра
  71. func (sf *kernelCtx) Конт() context.Context {
  72. return sf.ctx
  73. }
  74. // Отменить -- отменяет контекст ядра
  75. func (sf *kernelCtx) Отменить() {
  76. log.Println("kernelCtx.Cancel()")
  77. sf.fnCancel()
  78. }