| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- // package local_ctx -- локальный контекст.
- package local_ctx
- import (
- "context"
- "sync"
- mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx/ctx_value"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev1/lst_sort"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
- )
- // ILocalCtx -- локальный контекст.
- type ILocalCtx interface {
- core_spec.IRWMutex
- // Get -- извлекает значение из контекста
- Get(key string) core_spec.IOption[comp_spec.ICtxValue]
- // Del -- удаляет значение из контекста
- Del(key string)
- // Set -- добавляет значение в контекст
- Set(key string, val any, comment string)
- // Size -- возвращает размер словаря контекста
- Size() int
- // SortedList -- возвращает сортированный список объектов контекста
- SortedList() []comp_spec.ICtxValue
- // Cancel -- отменяет контекст
- Cancel()
- // Wait -- ожидает отмены контекста
- Wait()
- // Log -- возвращает буфер сообщений
- Log() log_buf.ILogBuf
- // Ctx -- возвращает хранимый контекст
- Ctx() context.Context
- }
- // LocalCtx -- локальный контекст.
- type LocalCtx struct {
- sync.RWMutex
- ctx context.Context // Отменяемый контекст
- fnCancel func() // Функция отмены контекста
- dictVal map[string]comp_spec.ICtxValue // Словарь различных значений
- lstSort *lst_sort.LstSort // Сортированный список значений
- log comp_spec.ILogBuf // Локальный буфер
- }
- // NewLocalCtx -- возвращает новый локальный контекст.
- func NewLocalCtx(ctx context.Context) ILocalCtx {
- helpers.Hassert(ctx != nil, "NewLocalCtx(): ctx==nil", []any{})
- _ctx, fnCancel := context.WithCancel(ctx)
- paramLogBuf := &log_buf.LogBufParam{
- IsTerm_: safe_bool.NewSafeBool(true),
- Prefix_: "LocalCtx",
- }
- sf := &LocalCtx{
- ctx: _ctx,
- fnCancel: fnCancel,
- dictVal: map[string]comp_spec.ICtxValue{},
- lstSort: lst_sort.NewLstSort(),
- log: log_buf.NewLogBuf(paramLogBuf),
- }
- return sf
- }
- // Ctx -- возвращает отменяемый контекст.
- func (sf *LocalCtx) Ctx() context.Context {
- return sf.ctx
- }
- // Size -- возвращает размер контекста.
- func (sf *LocalCtx) Size() int {
- sf.RLock()
- defer sf.RUnlock()
- return len(sf.dictVal)
- }
- // SortedList -- возвращает сортированный список значений.
- func (sf *LocalCtx) SortedList() []comp_spec.ICtxValue {
- return sf.lstSort.List()
- }
- // Log -- возвращает локальный буферный лог.
- func (sf *LocalCtx) Log() comp_spec.ILogBuf {
- return sf.log
- }
- // Get -- возвращает хранимое значение.
- func (sf *LocalCtx) Get(key string) mL0.IOption[comp_spec.ICtxValue] {
- sf.RLock()
- defer sf.RUnlock()
- if key == "" {
- return mL0.NewNone[comp_spec.ICtxValue]()
- }
- sf.log.Debug("Get(): key='%v'", key)
- val, isOk := sf.dictVal[key]
- if !isOk {
- return mL0.NewNone[comp_spec.ICtxValue]()
- }
- return mL0.NewSome(val)
- }
- // Del -- удаляет значение из контекста.
- func (sf *LocalCtx) Del(key string) {
- sf.Lock()
- defer sf.Unlock()
- sf.log.Debug("Del(): key='%v'", key)
- val := sf.dictVal[key]
- delete(sf.dictVal, key)
- sf.lstSort.Del(val)
- }
- // Set -- добавляет значение в контекст.
- func (sf *LocalCtx) Set(key string, val any, comment string) {
- sf.Lock()
- defer sf.Unlock()
- sf.log.Debug("Set(): key='%v'", key)
- _val, isOk := sf.dictVal[key]
- if isOk {
- val0 := _val.(*ctx_value.CtxValue)
- val0.Lock()
- val0.UpdateAt_ = etime.NewETimeAutoMut()
- val0.Val_ = val
- val0.Unlock()
- return
- }
- _val = ctx_value.NewCtxValue(key, val, comment)
- sf.dictVal[key] = _val
- sf.lstSort.Add(_val)
- }
- // Wait -- блокирующий вызов ожидания отмены контекста.
- func (sf *LocalCtx) Wait() {
- <-sf.ctx.Done()
- }
- // Cancel -- отменяет контекст.
- func (sf *LocalCtx) Cancel() {
- sf.log.Warn("Cancel()")
- sf.fnCancel()
- }
|