local_ctx.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // package local_ctx -- локальный контекст
  2. package local_ctx
  3. import (
  4. "context"
  5. "sync"
  6. . "gitp78su.ipnodns.ru/svi/kern/v2/kc/helpers"
  7. "gitp78su.ipnodns.ru/svi/kern/v2/kc/local_ctx/ctx_value"
  8. "gitp78su.ipnodns.ru/svi/kern/v2/kc/local_ctx/lst_sort"
  9. "gitp78su.ipnodns.ru/svi/kern/v2/kc/log_buf"
  10. . "gitp78su.ipnodns.ru/svi/kern/v2/krn/ktypes"
  11. )
  12. // LocalCtx -- локальный контекст
  13. type LocalCtx struct {
  14. sync.RWMutex
  15. ctx context.Context // Отменяемый контекст
  16. fnCancel func() // Функция отмены контекста
  17. dictVal map[string]ICtxValue // Словарь различных значений
  18. lstSort *lst_sort.LstSort // Сортированный список значений
  19. log ILogBuf // Локальный буфер
  20. }
  21. // NewLocalCtx -- возвращает новый локальный контекст
  22. func NewLocalCtx(ctx context.Context) ILocalCtx {
  23. Hassert(ctx != nil, "NewLocalCtx(): ctx==nil")
  24. _ctx, fnCancel := context.WithCancel(ctx)
  25. sf := &LocalCtx{
  26. ctx: _ctx,
  27. fnCancel: fnCancel,
  28. dictVal: map[string]ICtxValue{},
  29. lstSort: lst_sort.NewLstSort(),
  30. log: log_buf.NewLogBuf(false),
  31. }
  32. return sf
  33. }
  34. // Ctx -- возвращает отменяемый контекст
  35. func (sf *LocalCtx) Ctx() context.Context {
  36. return sf.ctx
  37. }
  38. // Size -- возвращает размер контекста
  39. func (sf *LocalCtx) Size() int {
  40. sf.RLock()
  41. defer sf.RUnlock()
  42. return len(sf.dictVal)
  43. }
  44. // SortedList -- возвращает сортированный список значений
  45. func (sf *LocalCtx) SortedList() []ICtxValue {
  46. return sf.lstSort.List()
  47. }
  48. // Log -- возвращает локальный буферный лог
  49. func (sf *LocalCtx) Log() ILogBuf {
  50. return sf.log
  51. }
  52. // Get -- возвращает хранимое значение
  53. func (sf *LocalCtx) Get(key string) ICtxValue {
  54. sf.RLock()
  55. defer sf.RUnlock()
  56. Hassert(key != "", "localCtx.Get(): key is empty")
  57. sf.log.Debug("localCtx.Get(): key='%v'", key)
  58. return sf.dictVal[key]
  59. }
  60. // Del -- удаляет значение из контекста
  61. func (sf *LocalCtx) Del(key string) {
  62. sf.Lock()
  63. defer sf.Unlock()
  64. sf.log.Debug("localCtx.Del(): key='%v'", key)
  65. val := sf.dictVal[key]
  66. delete(sf.dictVal, key)
  67. sf.lstSort.Del(val)
  68. }
  69. // Set -- добавляет значение в контекст
  70. func (sf *LocalCtx) Set(key string, val any, comment string) {
  71. sf.Lock()
  72. defer sf.Unlock()
  73. sf.log.Debug("localCtx.Set(): key='%v'", key)
  74. _val, isOk := sf.dictVal[key]
  75. if isOk {
  76. val0 := _val.(*ctx_value.CtxValue)
  77. val0.Lock()
  78. val0.UpdateAt_ = TimeNowStr()
  79. val0.Val_ = val
  80. val0.Unlock()
  81. return
  82. }
  83. _val = ctx_value.NewCtxValue(key, val, comment)
  84. sf.dictVal[key] = _val
  85. sf.lstSort.Add(_val)
  86. }
  87. // Done -- блокирующий вызов ожидания отмены контекста
  88. func (sf *LocalCtx) Done() {
  89. <-sf.ctx.Done()
  90. }
  91. // Cancel -- отменяет контекст
  92. func (sf *LocalCtx) Cancel() {
  93. sf.log.Warn("localCtx.Cancel()")
  94. sf.fnCancel()
  95. }