local_ctx.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // package local_ctx -- локальный контекст.
  2. package local_ctx
  3. import (
  4. "context"
  5. "sync"
  6. mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
  8. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx/ctx_value"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
  12. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/lst_sort"
  13. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
  14. )
  15. // ILocalCtx -- локальный контекст.
  16. type ILocalCtx interface {
  17. core_spec.IRWMutex
  18. // Get -- извлекает значение из контекста
  19. Get(key string) core_spec.IOption[comp_spec.ICtxValue]
  20. // Del -- удаляет значение из контекста
  21. Del(key string)
  22. // Set -- добавляет значение в контекст
  23. Set(key string, val any, comment string)
  24. // Size -- возвращает размер словаря контекста
  25. Size() int
  26. // SortedList -- возвращает сортированный список объектов контекста
  27. SortedList() []comp_spec.ICtxValue
  28. // Cancel -- отменяет контекст
  29. Cancel()
  30. // Wait -- ожидает отмены контекста
  31. Wait()
  32. // Log -- возвращает буфер сообщений
  33. Log() log_buf.ILogBuf
  34. // Ctx -- возвращает хранимый контекст
  35. Ctx() context.Context
  36. }
  37. // LocalCtx -- локальный контекст.
  38. type LocalCtx struct {
  39. sync.RWMutex
  40. ctx context.Context // Отменяемый контекст
  41. fnCancel func() // Функция отмены контекста
  42. dictVal map[string]comp_spec.ICtxValue // Словарь различных значений
  43. lstSort *lst_sort.LstSort // Сортированный список значений
  44. log comp_spec.ILogBuf // Локальный буфер
  45. }
  46. // NewLocalCtx -- возвращает новый локальный контекст.
  47. func NewLocalCtx(ctx context.Context) ILocalCtx {
  48. mL0.Hassert(ctx != nil, "NewLocalCtx(): ctx==nil")
  49. _ctx, fnCancel := context.WithCancel(ctx)
  50. paramLogBuf := &log_buf.LogBufParam{
  51. IsTerm_: safe_bool.NewSafeBool(true),
  52. Prefix_: "LocalCtx",
  53. }
  54. sf := &LocalCtx{
  55. ctx: _ctx,
  56. fnCancel: fnCancel,
  57. dictVal: map[string]comp_spec.ICtxValue{},
  58. lstSort: lst_sort.NewLstSort(),
  59. log: log_buf.NewLogBuf(paramLogBuf),
  60. }
  61. return sf
  62. }
  63. // Ctx -- возвращает отменяемый контекст.
  64. func (sf *LocalCtx) Ctx() context.Context {
  65. return sf.ctx
  66. }
  67. // Size -- возвращает размер контекста.
  68. func (sf *LocalCtx) Size() int {
  69. sf.RLock()
  70. defer sf.RUnlock()
  71. return len(sf.dictVal)
  72. }
  73. // SortedList -- возвращает сортированный список значений.
  74. func (sf *LocalCtx) SortedList() []comp_spec.ICtxValue {
  75. return sf.lstSort.List()
  76. }
  77. // Log -- возвращает локальный буферный лог.
  78. func (sf *LocalCtx) Log() comp_spec.ILogBuf {
  79. return sf.log
  80. }
  81. // Get -- возвращает хранимое значение.
  82. func (sf *LocalCtx) Get(key string) mL0.IOption[comp_spec.ICtxValue] {
  83. sf.RLock()
  84. defer sf.RUnlock()
  85. if key == "" {
  86. return mL0.NewNone[comp_spec.ICtxValue]()
  87. }
  88. sf.log.Debug("Get(): key='%v'", key)
  89. val, isOk := sf.dictVal[key]
  90. if !isOk {
  91. return mL0.NewNone[comp_spec.ICtxValue]()
  92. }
  93. return mL0.NewSome(val)
  94. }
  95. // Del -- удаляет значение из контекста.
  96. func (sf *LocalCtx) Del(key string) {
  97. sf.Lock()
  98. defer sf.Unlock()
  99. sf.log.Debug("Del(): key='%v'", key)
  100. val := sf.dictVal[key]
  101. delete(sf.dictVal, key)
  102. sf.lstSort.Del(val)
  103. }
  104. // Set -- добавляет значение в контекст.
  105. func (sf *LocalCtx) Set(key string, val any, comment string) {
  106. sf.Lock()
  107. defer sf.Unlock()
  108. sf.log.Debug("Set(): key='%v'", key)
  109. _val, isOk := sf.dictVal[key]
  110. if isOk {
  111. val0 := _val.(*ctx_value.CtxValue)
  112. val0.Lock()
  113. val0.UpdateAt_ = etime.NewETimeAutoMut()
  114. val0.Val_ = val
  115. val0.Unlock()
  116. return
  117. }
  118. _val = ctx_value.NewCtxValue(key, val, comment)
  119. sf.dictVal[key] = _val
  120. sf.lstSort.Add(_val)
  121. }
  122. // Wait -- блокирующий вызов ожидания отмены контекста.
  123. func (sf *LocalCtx) Wait() {
  124. <-sf.ctx.Done()
  125. }
  126. // Cancel -- отменяет контекст.
  127. func (sf *LocalCtx) Cancel() {
  128. sf.log.Warn("Cancel()")
  129. sf.fnCancel()
  130. }