local_ctx.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // package local_ctx -- локальный контекст
  2. package local_ctx
  3. import (
  4. "context"
  5. "sync"
  6. . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  7. "gitp78su.ipnodns.ru/svi/kern/kc/local_ctx/ctx_value"
  8. "gitp78su.ipnodns.ru/svi/kern/kc/local_ctx/lst_sort"
  9. "gitp78su.ipnodns.ru/svi/kern/kc/log_buf"
  10. . "gitp78su.ipnodns.ru/svi/kern/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(),
  31. }
  32. return sf
  33. }
  34. // Size -- возвращает размер контекста
  35. func (sf *LocalCtx) Size() int {
  36. sf.RLock()
  37. defer sf.RUnlock()
  38. return len(sf.dictVal)
  39. }
  40. // SortedList -- возвращает сортированный список значений
  41. func (sf *LocalCtx) SortedList() []ICtxValue {
  42. return sf.lstSort.List()
  43. }
  44. // Log -- возвращает локальный буферный лог
  45. func (sf *LocalCtx) Log() ILogBuf {
  46. return sf.log
  47. }
  48. // Get -- возвращает хранимое значение
  49. func (sf *LocalCtx) Get(key string) ICtxValue {
  50. sf.RLock()
  51. defer sf.RUnlock()
  52. Hassert(key != "", "localCtx.Get(): key is empty")
  53. sf.log.Debug("localCtx.Get(): key='%v'", key)
  54. return sf.dictVal[key]
  55. }
  56. // Del -- удаляет значение из контекста
  57. func (sf *LocalCtx) Del(key string) {
  58. sf.Lock()
  59. defer sf.Unlock()
  60. sf.log.Debug("localCtx.Del(): key='%v'", key)
  61. val := sf.dictVal[key]
  62. delete(sf.dictVal, key)
  63. sf.lstSort.Del(val)
  64. }
  65. // Set -- добавляет значение в контекст
  66. func (sf *LocalCtx) Set(key string, val any, comment string) {
  67. sf.Lock()
  68. defer sf.Unlock()
  69. sf.log.Debug("localCtx.Set(): key='%v'", key)
  70. _val, isOk := sf.dictVal[key]
  71. if isOk {
  72. val0 := _val.(*ctx_value.CtxValue)
  73. val0.Lock()
  74. val0.UpdateAt_ = TimeNowStr()
  75. val0.Val_ = val
  76. val0.Unlock()
  77. return
  78. }
  79. _val = ctx_value.NewCtxValue(key, val, comment)
  80. sf.dictVal[key] = _val
  81. sf.lstSort.Add(_val)
  82. }
  83. // Done -- блокирующий вызов ожидания отмены контекста
  84. func (sf *LocalCtx) Done() {
  85. <-sf.ctx.Done()
  86. }
  87. // Cancel -- отменяет контекст
  88. func (sf *LocalCtx) Cancel() {
  89. sf.log.Warn("localCtx.Cancel()")
  90. sf.fnCancel()
  91. }