1
0

2 Ревизии 797d1172db ... 923b6897dc

Автор SHA1 Съобщение Дата
  SVI 923b6897dc SVI Рабочее сохранение преди 1 месец
  SVI 49e5c4da7a SVI Рабочее сохранение преди 1 месец
променени са 100 файла, в които са добавени 268 реда и са изтрити 292 реда
  1. 1 1
      v4/cmd/demo/main.go
  2. 1 1
      v4/cmd/demo/main_test.go
  3. 3 3
      v4/d0/defs/def_bool/def_let_bool.go
  4. 1 1
      v4/d0/defs/def_bool/def_mut_bool.go
  5. 1 1
      v4/d0/defs/def_mut/def_mut.go
  6. 2 2
      v4/d0/defs/def_num/def_num_let.go
  7. 0 1
      v4/d0/defs/def_spec_base/def_spec_base.go
  8. 3 3
      v4/d0/defs/def_time/def_time_mut.go
  9. 8 7
      v4/d0/defs/def_txt/def_ltxt.go
  10. 14 11
      v4/d0/defs/def_txt/def_mtxt.go
  11. 1 1
      v4/d0/defs/defs.go
  12. 4 4
      v4/d0/defs/safe_bool/safe_bool_test.go
  13. 6 6
      v4/d0/defs/safe_bool_react/safe_bool_react_test.go
  14. 8 8
      v4/d0/defs/safe_mutex/safe_mutex.go
  15. 1 1
      v4/d0/defs/safe_num/safe_num.go
  16. 3 3
      v4/d0/defs/safe_num/safe_num_test.go
  17. 0 2
      v4/d0/defs/table/table.go
  18. 0 1
      v4/d0/helpers/helpers.go
  19. 1 1
      v4/d0/option/option.go
  20. 1 1
      v4/d0/result/result.go
  21. 2 2
      v4/d1/local_ctx/local_ctx.go
  22. 3 3
      v4/d1/local_ctx/local_ctx_test.go
  23. 3 3
      v4/d1/log_buf/log_buf.go
  24. 3 3
      v4/d1/log_buf/log_buf_test.go
  25. 4 5
      v4/d1/log_dict_topic/log_dict_topic.go
  26. 3 3
      v4/d1/lst_sort/lst_sort.go
  27. 1 1
      v4/d1/lst_sort/lst_sort_test.go
  28. 5 5
      v4/d1/mock_env/mock_env.go
  29. 3 3
      v4/d1/mock_env/mock_env_test.go
  30. 3 3
      v4/d2/kern_ctx/kern_ctx.go
  31. 1 2
      v4/d2/kernel_keeper/kernel_keeper.go
  32. 2 2
      v4/d2/kmodule/kmodule.go
  33. 6 6
      v4/d2/kmodule/kmodule_test.go
  34. 2 2
      v4/d2/kmodule/mod_stat/mod_stat.go
  35. 4 5
      v4/d2/kmodule/mod_stat/mod_stat_day/mod_stat_day.go
  36. 4 5
      v4/d2/kmodule/mod_stat/mod_stat_minute/mod_stat_minute.go
  37. 6 7
      v4/d2/kmodule/mod_stat/mod_stat_sec/mod_stat_sec.go
  38. 6 6
      v4/d2/kmodule/mod_stat/mod_stat_test.go
  39. 3 5
      v4/d2/kmonolit/kmonolit.go
  40. 4 4
      v4/d2/kmonolit/kmonolit_test.go
  41. 3 4
      v4/d2/kserv_http/kserv_http.go
  42. 3 4
      v4/d2/kserv_http_std/kserv_http_std.go
  43. 3 3
      v4/d2/kwg/kwg.go
  44. 1 1
      v4/d2/log_topic/log_topic.go
  45. 9 9
      v4/d2/lsi/kstore_kv/kstore_kv.go
  46. 6 6
      v4/d2/lsi/kstore_kv_std/kv_bucket_base/kv_bucket_base.go
  47. 3 4
      v4/d2/lsi/store_ent/dict_rec/dict_rec.go
  48. 2 2
      v4/d2/lsi/store_ent/rec_key/store_key.go
  49. 4 4
      v4/d2/lsi/store_ent/rec_meta/rec_meta.go
  50. 3 2
      v4/d2/lti/bus_ent/topic/topic_let.go
  51. 3 4
      v4/d2/lti/bus_mock/mock_hand_serve/mock_hand_serve.go
  52. 7 7
      v4/d2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http.go
  53. 4 4
      v4/d2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub.go
  54. 1 1
      v4/d2/lti/dot/msg_pub/msg_pub.go
  55. 2 2
      v4/d2/lti/dot/msg_serve/msg_serve.go
  56. 4 4
      v4/d2/lti/dot/msg_sub/msg_sub.go
  57. 1 1
      v4/d2/lti/dot/msg_unsub/msg_unsub.go
  58. 4 5
      v4/d2/lti/kbus/dict_sub_hook/dict_sub_hook.go
  59. 4 4
      v4/d2/lti/kbus/dict_topic_serve/dict_topic_serve.go
  60. 2 3
      v4/d2/lti/kbus/dict_topic_sub/dict_topic_sub.go
  61. 1 3
      v4/d2/lti/kbus_base/kbus_base.go
  62. 1 1
      v4/d2/lti/kbus_http/client_bus_http/client_bus_http.go
  63. 1 2
      v4/d2/lti/kbus_http/kbus_http.go
  64. 2 3
      v4/d2/lti/kbus_local/kbus_local.go
  65. 4 4
      v4/d2/wui/hx_swap/hx_swap.go
  66. 4 4
      v4/d2/wui/hx_swap_oob/hx_swap_oob.go
  67. 5 4
      v4/d2/wui/hx_target/hx_target.go
  68. 4 4
      v4/d2/wui/hx_trigger/hx_trigger.go
  69. 3 4
      v4/d2/wui/hx_url_method/hx_url_method.go
  70. 3 4
      v4/d2/wui/hx_url_patch/hx_url_patch.go
  71. 4 3
      v4/d2/wui/hx_vals/hx_vals.go
  72. 2 3
      v4/d2/wui/wui_ctx/wui_ctx.go
  73. 2 2
      v4/d2/wui/wui_text/wui_text.go
  74. 2 2
      v4/d3/depth3.go
  75. 2 2
      v4/d3/mod_ent/mod_ent.go
  76. 1 2
      v4/d3/mod_ent/mod_num/mod_num.go
  77. 0 0
      v4/d3/mod_ent/module_name/README.md
  78. 0 0
      v4/d3/mod_ent/module_name/module_name.go
  79. 0 0
      v4/d3/mod_ent/module_name/module_name_test.go
  80. 6 8
      v4/d3/mod_kctx/mod_kctx.go
  81. 1 1
      v4/d3/mod_kctx/mod_kctx_test.go
  82. 7 9
      v4/d3/mod_keeper/mod_keeper.go
  83. 1 1
      v4/d3/mod_keeper/mod_keeper_test.go
  84. 0 0
      v4/d3/mod_serv_http/btn_modules/block_modules.html
  85. 0 0
      v4/d3/mod_serv_http/btn_modules/block_row.html
  86. 1 1
      v4/d3/mod_serv_http/btn_modules/btn_modules.go
  87. 1 1
      v4/d3/mod_serv_http/btn_modules/btn_modules_test.go
  88. 0 0
      v4/d3/mod_serv_http/btn_monolit/block_monolit.html
  89. 0 0
      v4/d3/mod_serv_http/btn_monolit/btn_monolit.go
  90. 2 2
      v4/d3/mod_serv_http/btn_monolit/btn_monolit_test.go
  91. 0 0
      v4/d3/mod_serv_http/http_api/http_api.go
  92. 0 0
      v4/d3/mod_serv_http/http_api/http_api_test.go
  93. 9 11
      v4/d3/mod_serv_http/mod_serv_http.go
  94. 1 1
      v4/d3/mod_serv_http/mod_serv_http_test.go
  95. 0 0
      v4/d3/mod_serv_http/page_module/ctx_row_block.html
  96. 0 0
      v4/d3/mod_serv_http/page_module/ctx_row_val.html
  97. 0 0
      v4/d3/mod_serv_http/page_module/log_block.html
  98. 0 0
      v4/d3/mod_serv_http/page_module/module_state.html
  99. 0 0
      v4/d3/mod_serv_http/page_module/module_state_block.html
  100. 2 2
      v4/d3/mod_serv_http/page_module/page_module.go

+ 1 - 1
v4/cmd/demo/main.go

@@ -3,7 +3,7 @@ package main
 
 import (
 	"gitp78su.ipnodns.ru/svi/kern/v4"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_spec"
 )
 
 var app mod_spec.IKernelMonolit // Вынесено для тестов

+ 1 - 1
v4/cmd/demo/main_test.go

@@ -12,7 +12,7 @@ import (
 
 func TestMain(t *testing.T) {
 	t.Log("TestMain")
-	owner:=d0.LetOwner(1,"test_demo")
+	owner := d0.LetOwner(1, "test_demo")
 	_ = mock_env.MakeEnv(owner)
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	_ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18332/")

+ 3 - 3
v4/d0/defs/def_bool/def_let_bool.go

@@ -42,6 +42,6 @@ func (sf *LBool) Let() *LBool {
 }
 
 // String -- возвращает строковое представление
-func (sf *LBool)String()string{
-	return fmt.Sprintf("LBool(owner(%v) val(%v))",sf.OwnerPass, sf.val)
-}
+func (sf *LBool) String() string {
+	return fmt.Sprintf("LBool(owner(%v) val(%v))", sf.OwnerPass, sf.val)
+}

+ 1 - 1
v4/d0/defs/def_bool/def_mut_bool.go

@@ -55,5 +55,5 @@ func (sf *MBool) FromEnv(env def_spec_base.Txt) *result.Result[*LBool] {
 		err := def_err.LetErr("MBool.FromEnv(): env(%v) not set", env)
 		return result.ResErr[*LBool](err)
 	}
-	return result.ResOk[*LBool](sf.Let())
+	return result.ResOk(sf.Let())
 }

+ 1 - 1
v4/d0/defs/def_mut/def_mut.go

@@ -19,4 +19,4 @@ func (sf *Mut[T]) Get() T {
 // Set -- устанавливает хранимое значение
 func (sf *Mut[T]) Set(val T) {
 	sf.val = val
-}
+}

+ 2 - 2
v4/d0/defs/def_num/def_num_let.go

@@ -22,7 +22,7 @@ func LetNum[T def_spec_base.NumConstraint](owner *owner.LOwner, val T) *LNum {
 	helpers.If(owner == nil).Hassert("LetNum(): LOwner==nil")
 	sf := &LNum{
 		OwnerPass: owner.Pass(),
-		val:     def_spec_base.Num(val),
+		val:       def_spec_base.Num(val),
 	}
 	return sf
 }
@@ -69,4 +69,4 @@ func (sf *LNum) String() string {
 func (sf *LNum) Let() *LNum {
 	sf.CheckOwner()
 	return sf
-}
+}

+ 0 - 1
v4/d0/defs/def_spec_base/def_spec_base.go

@@ -27,4 +27,3 @@ type NumConstraint interface {
 type BoolConstraint interface {
 	~bool
 }
-

+ 3 - 3
v4/d0/defs/def_time/def_time_mut.go

@@ -61,8 +61,8 @@ func (sf *MTime) Get() def_spec_base.Time {
 // ToTuf -- сериализует себя в строку.
 func (sf *MTime) ToTuf() def_spec_base.Txt {
 	txtRes := tuf.StrToTuf("val", def_spec_base.Txt(sf.Mut.Get()))
-	lenVal:=len(string(sf.Mut.Get()))
-	isFill:=def_spec_base.Bool(lenVal>0)
+	lenVal := len(string(sf.Mut.Get()))
+	isFill := def_spec_base.Bool(lenVal > 0)
 	txtRes += tuf.BoolToTuf("isFill", isFill)
 	txtRes = tuf.RecToTuf("MTime", txtRes)
 	return txtRes
@@ -77,4 +77,4 @@ func (sf *MTime) Set(val def_spec_base.Time) {
 // String -- возвращает строку.
 func (sf *MTime) String() string {
 	return string(sf.Mut.Get())
-}
+}

+ 8 - 7
v4/d0/defs/def_txt/def_ltxt.go

@@ -2,6 +2,7 @@
 package def_txt
 
 import (
+	"bytes"
 	"fmt"
 	"strconv"
 
@@ -12,36 +13,36 @@ import (
 
 // LTxt -- неизменяемый текст
 type LTxt struct {
-	val def_spec_base.Txt
+	val *bytes.Buffer
 }
 
 // LetTxt -- создать новый внутренний неизменяемый текст.
 func LetTxt[T def_spec_fn.TxtConstraint](msg T, arg ...any) *LTxt {
 	_msg := def_spec_fn.Sprintf(msg, arg...)
 	sf := &LTxt{
-		val: _msg,
+		val: bytes.NewBufferString(string(_msg)),
 	}
 	return sf
 }
 
 // Byte -- возвращает внутренний текст в форме байтов.
 func (sf LTxt) Byte() []byte {
-	return []byte(sf.val)
+	return sf.val.Bytes()
 }
 
 // Rune -- возвращает внутренний текст в формк рун.
 func (sf LTxt) Rune() []rune {
-	return []rune(sf.val)
+	return []rune(sf.val.String())
 }
 
 // Len -- возвращает длину текста.
 func (sf LTxt) Len() def_spec_base.Num {
-	return def_spec_base.Num(len(sf.val))
+	return def_spec_base.Num(sf.val.Len())
 }
 
 // Get -- возвращает хранимое значение
 func (sf LTxt) Get() def_spec_base.Txt {
-	return sf.val
+	return def_spec_base.Txt(sf.val.String())
 }
 
 // Atoi -- возвращает возможное число.
@@ -57,7 +58,7 @@ func (sf LTxt) Atoi() *result.Result[def_spec_base.Num] {
 
 // String -- возвращает строку по требованию.
 func (sf LTxt) String() string {
-	return string(sf.val)
+	return sf.val.String()
 }
 
 // TrimSuffix -- обрезает суффикс текста.

+ 14 - 11
v4/d0/defs/def_txt/def_mtxt.go

@@ -3,6 +3,7 @@ package def_txt
 import (
 	"fmt"
 	"strconv"
+	"strings"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_spec_base"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_spec_fn"
@@ -24,18 +25,18 @@ func MutTxt[T def_spec_fn.TxtConstraint](msg T, arg ...any) *MTxt {
 
 // Concat -- создать новый изменяемый текст.
 func (sf *MTxt) Concat(msg any, arg ...any) def_spec_base.Txt {
-	val := def_spec_fn.Sprintf("%v", msg)
-	val = def_spec_fn.Sprintf(val, arg...)
-	sf.val += val
-	return sf.val
+	val := fmt.Sprintf("%v", msg)
+	val = fmt.Sprintf(val, arg...)
+	sf.val.WriteString(val)
+	return def_spec_base.Txt(sf.val.String())
 }
 
 // TrimSuffix -- обрезает суффикс неизменяемого текста.
 func (sf *MTxt) TrimSuffix[T def_spec_fn.TxtConstraint](suffix T) def_spec_base.Txt {
 	suf := fmt.Sprintf("%v", suffix)
-	txt := def_spec_fn.TrimSuffix(sf.val, suf)
-	sf.val = txt
-	return sf.val
+	txt := strings.TrimSuffix(sf.val.String(), suf)
+	sf.val.WriteString(txt)
+	return def_spec_base.Txt(sf.val.String())
 }
 
 // Atoi -- устанавливает и возвращает возможное число.
@@ -46,17 +47,19 @@ func (sf MTxt) Atoi() *result.Result[def_spec_base.Num] {
 			sf.String(), err)
 		return result.ResErr[def_spec_base.Num](err)
 	}
-	sf.val = def_spec_fn.Sprintf("%v", iRes)
+	sf.val.Reset()
+	sf.val.WriteString(fmt.Sprintf("%v", iRes))
 	return result.ResOk(def_spec_base.Num(iRes))
 }
 
 // Set -- изменение внутренней строки.
 func (sf *MTxt) Set[T def_spec_fn.TxtConstraint](msg T, arg ...any) {
-	_msg := def_spec_fn.Sprintf(msg, arg...)
-	sf.val = _msg
+	_msg := fmt.Sprintf(string(msg), arg...)
+	sf.val.Reset()
+	sf.val.WriteString(_msg)
 }
 
 // Let -- возвращает неизменяемую копию себя
 func (sf *MTxt) Let() *LTxt {
-	return LetTxt(sf.val)
+	return LetTxt(sf.val.String())
 }

+ 1 - 1
v4/d0/defs/defs.go

@@ -25,7 +25,7 @@ type Bool = def_spec_base.Bool
 // LBool -- неизменяемое булево значение.
 type LBool = def_bool.LBool
 
-//BoolConstraint -- ограничение внутреннего логического значения.
+// BoolConstraint -- ограничение внутреннего логического значения.
 type BoolConstraint = def_spec_base.BoolConstraint
 
 // LetBool -- возвращает новое внутреннее логическое значение.

+ 4 - 4
v4/d0/defs/safe_bool/safe_bool_test.go

@@ -9,15 +9,15 @@ import (
 )
 
 type tester struct {
-	t  *testing.T
-	sb *MSafeBool
+	t     *testing.T
+	sb    *MSafeBool
 	owner *owner.LOwner
 }
 
 func TestSAfeBool(t *testing.T) {
 	sf := &tester{
-		t: t,
-		owner:owner.LetOwner(1, "test_mut_safe_bool"),
+		t:     t,
+		owner: owner.LetOwner(1, "test_mut_safe_bool"),
 	}
 	sf.create()
 	sf.set()

+ 6 - 6
v4/d0/defs/safe_bool_react/safe_bool_react_test.go

@@ -11,16 +11,16 @@ import (
 )
 
 type tester struct {
-	t   *testing.T
-	sbr *MSafeBoolReact
-	val *def_bool.MBool
+	t     *testing.T
+	sbr   *MSafeBoolReact
+	val   *def_bool.MBool
 	owner *owner.LOwner
 }
 
 func TestSafeBoolReact(t *testing.T) {
 	sf := &tester{
-		t: t,
-		owner:owner.LetOwner(1,"test_safe_bool_react"),
+		t:     t,
+		owner: owner.LetOwner(1, "test_safe_bool_react"),
 	}
 	sf.create()
 	sf.add()
@@ -130,7 +130,7 @@ func (sf *tester) add() {
 // Функция обратного вызова для контроля.
 func (sf *tester) fnBack(val def_spec_base.Bool) {
 	sf.val.Reset()
-	if val{
+	if val {
 		sf.val.Set()
 	}
 }

+ 8 - 8
v4/d0/defs/safe_mutex/safe_mutex.go

@@ -11,8 +11,8 @@ import (
 const (
 	// Lock -- блокировка мьютекса
 	Lock = def_spec_base.Num(1)
-	// Unlock -- разблокировка мьютекса
-	Unlock = def_spec_base.Num(0)
+	// Free -- разблокировка мьютекса
+	Free = def_spec_base.Num(0)
 	// RLock -- блокировка мьютекса с чтением
 	RLock = def_spec_base.Num(-1)
 )
@@ -36,7 +36,7 @@ func (sf *MSafeMutex) Lock() {
 	defer sf.block.Unlock()
 
 	sf.val.Lock()
-	sf.stateLock = 1
+	sf.stateLock = Lock
 }
 
 // Unlock -- освободить мьютекс
@@ -48,7 +48,7 @@ func (sf *MSafeMutex) Unlock() {
 		return
 	}
 	sf.val.Unlock()
-	sf.stateLock = 0
+	sf.stateLock = Free
 }
 
 // RLock -- попытка захватить мьютекс
@@ -57,19 +57,19 @@ func (sf *MSafeMutex) RLock() {
 	defer sf.block.Unlock()
 
 	sf.val.RLock()
-	sf.stateLock = -1
+	sf.stateLock = RLock
 }
 
 // RUnlock -- освободить мьютекс
 func (sf *MSafeMutex) RUnlock() {
 	sf.block.Lock()
 	defer sf.block.Unlock()
-	if sf.stateLock == 0 {
+	if sf.stateLock == Free {
 		log.Println("ERROR MSafeMutex.Unlock(): mutex already free")
 		return
 	}
 	sf.val.RUnlock()
-	sf.stateLock = 0
+	sf.stateLock = Free
 }
 
 // State -- возвращает признак захвата мьютекса
@@ -83,5 +83,5 @@ func (sf *MSafeMutex) State() def_spec_base.Num {
 func (sf *MSafeMutex) IsFree() def_spec_base.Bool {
 	sf.block.Lock()
 	defer sf.block.Unlock()
-	return sf.stateLock == 0
+	return sf.stateLock == Free
 }

+ 1 - 1
v4/d0/defs/safe_num/safe_num.go

@@ -22,7 +22,7 @@ type MSafeNum struct {
 func MutSafeNum[T def_spec_base.NumConstraint](owner *owner.LOwner, val T) *MSafeNum {
 	sf := &MSafeNum{
 		MSafeMutex: safe_mutex.MutSafeMutex(),
-		val: def_num.MutNum(owner, val),
+		val:        def_num.MutNum(owner, val),
 	}
 	return sf
 }

+ 3 - 3
v4/d0/defs/safe_num/safe_num_test.go

@@ -9,14 +9,14 @@ import (
 )
 
 type tester struct {
-	t       *testing.T
-	si      *MSafeNum
+	t     *testing.T
+	si    *MSafeNum
 	owner *owner.LOwner
 }
 
 func TestSafeNum(t *testing.T) {
 	sf := &tester{
-		t:       t,
+		t:     t,
 		owner: owner.LetOwner(1, "test_safe_num"),
 	}
 	{

+ 0 - 2
v4/d0/defs/table/table.go

@@ -1,4 +1,2 @@
 // package table -- таблица объектов
 package table
-
-

+ 0 - 1
v4/d0/helpers/helpers.go

@@ -18,7 +18,6 @@ var (
 	IsStageProd  def_spec_base.Bool
 )
 
-
 // AssertAction -- хранит состояние для проверки.
 type AssertAction[T ~bool] struct {
 	isCond T

+ 1 - 1
v4/d0/option/option.go

@@ -32,7 +32,7 @@ func (sf *Option[T]) IsSome() def_spec_base.Bool {
 }
 
 // IsNone - проверяет, есть ли значение.
-func (sf *Option[T]) IsNone() def_spec_base.Bool  {
+func (sf *Option[T]) IsNone() def_spec_base.Bool {
 	return sf.some == nil
 }
 

+ 1 - 1
v4/d0/result/result.go

@@ -147,7 +147,7 @@ func (sf *Result[T]) Hassert(msgFormat def_spec_base.Txt, args ...any) T {
 func (sf *Result[T]) Assert(msgFormat def_spec_base.Txt, args ...any) T {
 	if sf.err != nil {
 		strErr := fmt.Sprintf("Result[T].Assert(): have error, , err=\n\t%v", sf.err)
-		txtErr:=def_spec_base.Txt(strErr)
+		txtErr := def_spec_base.Txt(strErr)
 		helpers.If(sf.err != nil).Assert(txtErr, args...)
 	}
 	sf.isCheck = true

+ 2 - 2
v4/d1/local_ctx/local_ctx.go

@@ -18,8 +18,8 @@ type LocalCtx struct {
 	fnCancel func()          // Функция отмены контекста
 
 	dictVal map[d0.Txt]*ctx_value.CtxValue // Словарь различных значений
-	lstSort *lst_sort.LstSort                // Сортированный список значений
-	log     *log_buf.LogBuf                  // Локальный буфер
+	lstSort *lst_sort.LstSort              // Сортированный список значений
+	log     *log_buf.LogBuf                // Локальный буфер
 }
 
 // NewLocalCtx -- возвращает новый локальный контекст.

+ 3 - 3
v4/d1/local_ctx/local_ctx_test.go

@@ -8,14 +8,14 @@ import (
 )
 
 type tester struct {
-	t    *testing.T
-	lCtx *LocalCtx
+	t     *testing.T
+	lCtx  *LocalCtx
 	owner *d0.LOwner
 }
 
 func TestLocalCtx(t *testing.T) {
 	sf := &tester{
-		t: t,
+		t:     t,
 		owner: d0.LetOwner(1, "test_local_ctx"),
 	}
 	sf.new()

+ 3 - 3
v4/d1/log_buf/log_buf.go

@@ -4,7 +4,6 @@ package log_buf
 import (
 	"fmt"
 	"log"
-	"sync"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0/helpers"
@@ -37,7 +36,7 @@ type ILogBuf interface {
 
 // LogBufParam -- параметры логирующего буфера.
 type LogBufParam struct {
-	Prefix_ *d0.LTxt        // Префикс для сообщений
+	Prefix_ *d0.LTxt      // Префикс для сообщений
 	IsTerm_ *d0.MSafeBool // Признак вывода в терминал
 }
 
@@ -48,7 +47,7 @@ func (sf *LogBufParam) SelfCheck() {
 
 // LogBuf -- потокобезопасный буфер лога.
 type LogBuf struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	*LogBufParam
 	lst    []log_msg.ILogMsg
 	lstErr []log_msg.ILogMsg
@@ -59,6 +58,7 @@ func NewLogBuf(param *LogBufParam) *LogBuf {
 	d0.If(param == nil).Hassert("NewLogBuf(): param==nil")
 	param.SelfCheck()
 	sf := &LogBuf{
+		MSafeMutex:  d0.MutSafeMutex(),
 		LogBufParam: param,
 		lst:         []log_msg.ILogMsg{},
 		lstErr:      []log_msg.ILogMsg{},

+ 3 - 3
v4/d1/log_buf/log_buf_test.go

@@ -8,14 +8,14 @@ import (
 )
 
 type tester struct {
-	t   *testing.T
-	log ILogBuf
+	t     *testing.T
+	log   ILogBuf
 	owner *d0.LOwner
 }
 
 func TestLogBuf(t *testing.T) {
 	sf := &tester{
-		t: t,
+		t:     t,
 		owner: d0.LetOwner(1, "test_log_buf"),
 	}
 	sf.new()

+ 4 - 5
v4/d1/log_dict_topic/log_dict_topic.go

@@ -2,15 +2,13 @@
 package log_dict_topic
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_spec"
 )
 
 type LogDictTopic struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	dict   map[topic.ATopic]struct{}
 	client bus_spec.IBusClient
 }
@@ -22,8 +20,9 @@ func NewLogDictTopic(clientBus bus_spec.IBusClient) *d0.Result[*LogDictTopic] {
 		return d0.ResErr[*LogDictTopic](err)
 	}
 	sf := &LogDictTopic{
-		dict:   map[topic.ATopic]struct{}{},
-		client: clientBus,
+		MSafeMutex: d0.MutSafeMutex(),
+		dict:       map[topic.ATopic]struct{}{},
+		client:     clientBus,
 	}
 	return d0.ResOk(sf)
 }

+ 3 - 3
v4/d1/lst_sort/lst_sort.go

@@ -3,7 +3,6 @@ package lst_sort
 
 import (
 	"sort"
-	"sync"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0/defs"
@@ -13,14 +12,15 @@ import (
 
 // LstSort -- сортированный список значений контекста.
 type LstSort struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	lstVal []*ctx_value.CtxValue // Сортированный список значений
 }
 
 // NewLstSort -- возвращает новый сортированный список значений контекста.
 func NewLstSort() *LstSort {
 	sf := &LstSort{
-		lstVal: []*ctx_value.CtxValue{},
+		MSafeMutex: d0.MutSafeMutex(),
+		lstVal:     []*ctx_value.CtxValue{},
 	}
 	return sf
 }

+ 1 - 1
v4/d1/lst_sort/lst_sort_test.go

@@ -26,7 +26,7 @@ func TestLstSort(t *testing.T) {
 func (sf *tester) del3() {
 	sf.t.Log("del3")
 	val5 := ctx_value.NewCtxValue("val5", 5, "test 5")
-		sf.lst.Del(val5)
+	sf.lst.Del(val5)
 	sf.lst.Del(nil)
 }
 

+ 5 - 5
v4/d1/mock_env/mock_env.go

@@ -16,11 +16,11 @@ type IMockEnv interface {
 
 // MockEnv -- объект мок-окружения.
 type MockEnv struct {
-	owner    *d0.LOwner            // Владелец мок-окружения
+	owner    *d0.LOwner          // Владелец мок-окружения
 	dictEnv  map[d0.Txt]*d0.LTxt // Словарь переменных окружения
-	pwd      *d0.LTxt              // Текущий путь процесса
-	fileName *d0.LTxt              // Полный путь к .env файлу
-	strEnv   *d0.LTxt              // Фактическое содержимое .env файла
+	pwd      *d0.LTxt            // Текущий путь процесса
+	fileName *d0.LTxt            // Полный путь к .env файлу
+	strEnv   *d0.LTxt            // Фактическое содержимое .env файла
 }
 
 // MakeEnv -- возвращает новое мок-окружение.
@@ -96,7 +96,7 @@ func (sf *MockEnv) setPath() {
 		}
 	}
 	helpers.If(!isFind).Hassert("MockEnv.setPath(): not find file .env", []any{})
-	sf.pwd = d0.LetTxt(pwd.String() + "/bin_dev")
+	sf.pwd = d0.LetTxt(pwd.String() + "/bin_dev/" + string(sf.owner.Name()))
 	err = os.MkdirAll(sf.pwd.String(), 0750)
 	helpers.If(err != nil).Hassert("MockEnv.setPath(): in create PWD, err=\n\t%v", []any{err})
 	err = os.Chdir(sf.pwd.String())

+ 3 - 3
v4/d1/mock_env/mock_env_test.go

@@ -7,14 +7,14 @@ import (
 )
 
 type tester struct {
-	t  *testing.T
-	me *MockEnv
+	t     *testing.T
+	me    *MockEnv
 	owner *d0.LOwner
 }
 
 func TestMockEnv(t *testing.T) {
 	sf := &tester{
-		t: t,
+		t:     t,
 		owner: d0.LetOwner(1, "test_mock_env"),
 	}
 	sf.make()

+ 3 - 3
v4/d2/kern_ctx/kern_ctx.go

@@ -3,7 +3,6 @@ package kern_ctx
 
 import (
 	"context"
-	"sync"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d1"
@@ -29,10 +28,11 @@ var (
 	ctxBg            context.Context
 	internalCtx      context.Context
 	internalFnCancel func()
-	block            sync.Mutex
+	block            *d0.MSafeMutex
 )
 
 func _init() {
+	block = d0.MutSafeMutex()
 	ctxBg = context.Background()
 	internalCtx, internalFnCancel = context.WithCancel(ctxBg)
 }
@@ -55,7 +55,7 @@ func GetKernCtx() *KernCtx {
 	if kernCtx != nil {
 		return kernCtx
 	}
-	owner:= d0.LetOwner(1, "kern_ctx")
+	owner := d0.LetOwner(1, "kern_ctx")
 	sf := &KernCtx{
 		LocalCtx: local_ctx.NewLocalCtx(owner, internalCtx),
 		ctxBg:    ctxBg,

+ 1 - 2
v4/d2/kernel_keeper/kernel_keeper.go

@@ -5,7 +5,6 @@ import (
 	"context"
 	"os"
 	"os/signal"
-	"sync"
 	"syscall"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
@@ -26,7 +25,7 @@ type KernKeeper struct {
 
 var (
 	kernKeep *KernKeeper
-	block    sync.Mutex
+	block    = d0.MutSafeMutex()
 	qName    = stream_name.NewAStreamName("kernel_keeper")
 )
 

+ 2 - 2
v4/d2/kmodule/kmodule.go

@@ -12,8 +12,8 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/kbus_local"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent/module_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_spec"
 )
 
 // kModule -- модуль на основе ядра.

+ 6 - 6
v4/d2/kmodule/kmodule_test.go

@@ -8,8 +8,8 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ctx"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_spec"
 )
 
 type tester struct {
@@ -21,11 +21,11 @@ type tester struct {
 }
 
 func TestKernelModule(t *testing.T) {
-	owner:=d0.LetOwner(1, "test_isol_kern")
+	owner := d0.LetOwner(1, "test_isol_kern")
 	sf := &tester{
-		t:         t,
-		owner:     owner,
-		me:        mock_env.MakeEnv(owner),
+		t:     t,
+		owner: owner,
+		me:    mock_env.MakeEnv(owner),
 	}
 	_ = os.Unsetenv("LOCAL_STORE_PATH")
 	_ = os.Setenv("LOCAL_STORE_PATH", "/store/store_module")

+ 2 - 2
v4/d2/kmodule/mod_stat/mod_stat.go

@@ -14,13 +14,13 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kmodule/mod_stat/mod_stat_day"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kmodule/mod_stat/mod_stat_sec"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent/module_name"
 )
 
 // ModStat -- статистика модуля.
 type ModStat struct {
 	statSec    *mod_stat_sec.ModStatSec // Объект статистики 60 секунд
-	timeMinute *d0.MSafeNum           // Интервал ожидания минутного таймера, мсек
+	timeMinute *d0.MSafeNum             // Интервал ожидания минутного таймера, мсек
 	statMin    *mod_stat_day.ModStatDay // Объект статистики 60 минут
 	statDay    *mod_stat_day.ModStatDay // Объект статистики за последние 24 часа
 	name       *module_name.LModuleName

+ 4 - 5
v4/d2/kmodule/mod_stat/mod_stat_day/mod_stat_day.go

@@ -5,8 +5,6 @@ import (
 	"bytes"
 	"fmt"
 	"math"
-
-	"sync"
 	"time"
 
 	svg "github.com/ajstarks/svgo"
@@ -15,7 +13,7 @@ import (
 
 // ModStatDay -- статистика модуля за первые 24 часа.
 type ModStatDay struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	lst    []d0.Num // Список значений за первые 24 часа
 	bufSvg *bytes.Buffer
 }
@@ -23,8 +21,9 @@ type ModStatDay struct {
 // NewModStatDay -- возвращает новую статистику модуля за первые 24 часа.
 func NewModStatDay() *ModStatDay {
 	sf := &ModStatDay{
-		lst:    []d0.Num{},
-		bufSvg: bytes.NewBufferString(""),
+		MSafeMutex: d0.MutSafeMutex(),
+		lst:        []d0.Num{},
+		bufSvg:     bytes.NewBufferString(""),
 	}
 	return sf
 }

+ 4 - 5
v4/d2/kmodule/mod_stat/mod_stat_minute/mod_stat_minute.go

@@ -5,8 +5,6 @@ import (
 	"bytes"
 	"fmt"
 	"math"
-
-	"sync"
 	"time"
 
 	svg "github.com/ajstarks/svgo"
@@ -15,7 +13,7 @@ import (
 
 // ModStatMinutes -- статистика модуля за первые 60 мин.
 type ModStatMinutes struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	lst    []d0.Num // Список значений за последние 60 мин
 	bufSvg *bytes.Buffer
 }
@@ -23,8 +21,9 @@ type ModStatMinutes struct {
 // NewModStatMinute -- возвращает новую статистику модуля за последние 60 мин.
 func NewModStatMinute() *ModStatMinutes {
 	sf := &ModStatMinutes{
-		lst:    []d0.Num{},
-		bufSvg: bytes.NewBufferString(""),
+		MSafeMutex: d0.MutSafeMutex(),
+		lst:        []d0.Num{},
+		bufSvg:     bytes.NewBufferString(""),
 	}
 	return sf
 }

+ 6 - 7
v4/d2/kmodule/mod_stat/mod_stat_sec/mod_stat_sec.go

@@ -5,8 +5,6 @@ import (
 	"bytes"
 	"fmt"
 	"math"
-
-	"sync"
 	"time"
 
 	svg "github.com/ajstarks/svgo"
@@ -15,18 +13,19 @@ import (
 
 // ModStatSec -- статистика модуля за первые 60 сек.
 type ModStatSec struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	lst      []d0.Num // Список значений за последние 60 сек
-	momentAt int64      // Метка времени для учёта текущей секунды
+	momentAt int64    // Метка времени для учёта текущей секунды
 	bufSvg   *bytes.Buffer
 }
 
 // NewModStatSec -- возвращает новую статистику модуля за последние 60 сек.
 func NewModStatSec() *ModStatSec {
 	sf := &ModStatSec{
-		lst:      []d0.Num{},
-		bufSvg:   bytes.NewBufferString(""),
-		momentAt: time.Now().Local().Unix(),
+		MSafeMutex: d0.MutSafeMutex(),
+		lst:        []d0.Num{},
+		bufSvg:     bytes.NewBufferString(""),
+		momentAt:   time.Now().Local().Unix(),
 	}
 	return sf
 }

+ 6 - 6
v4/d2/kmodule/mod_stat/mod_stat_test.go

@@ -5,20 +5,20 @@ import (
 	"time"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent"
 )
 
 type tester struct {
-	t    *testing.T
-	stat *ModStat
+	t     *testing.T
+	stat  *ModStat
 	owner *d0.LOwner
 }
 
 func TestModStat(t *testing.T) {
-	owner:=d0.LetOwner(1,"test_mod_stat")
+	owner := d0.LetOwner(1, "test_mod_stat")
 	sf := &tester{
-		t: t,
-		owner:owner,
+		t:     t,
+		owner: owner,
 	}
 	sf.new()
 	sf.event()

+ 3 - 5
v4/d2/kmonolit/kmonolit.go

@@ -2,13 +2,11 @@
 package kmonolit
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_spec"
 )
 
 // LModMonolit -- объект модульного монолита.
@@ -26,7 +24,7 @@ type LModMonolit struct {
 
 var (
 	mon   *LModMonolit
-	block sync.Mutex
+	block = d0.MutSafeMutex()
 )
 
 var (

+ 4 - 4
v4/d2/kmonolit/kmonolit_test.go

@@ -10,9 +10,9 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kmodule"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent/module_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_spec"
 )
 
 const (
@@ -69,7 +69,7 @@ type mod struct {
 	mod_spec.IKernelModule
 }
 
-func (sf *tester)newMod(name *module_name.LModuleName) mod_spec.IKernelModule {
+func (sf *tester) newMod(name *module_name.LModuleName) mod_spec.IKernelModule {
 	isol := &mod{
 		IKernelModule: kmodule.NewKernelModule(sf.owner, name),
 	}

+ 3 - 4
v4/d2/kserv_http/kserv_http.go

@@ -8,7 +8,6 @@ import (
 	"net/http"
 	"os"
 	"strings"
-	"sync"
 	"time"
 
 	"github.com/gofiber/contrib/v3/monitor"
@@ -45,7 +44,7 @@ var embedDirStatic embed.FS
 
 var (
 	kernServHttp *kServHttp
-	block        sync.Mutex
+	block        = d0.MutSafeMutex()
 )
 
 func getParams(owner *d0.LOwner) (*d0.LTxt, *d1.LogBuf, *kern_ctx.KernCtx) {
@@ -89,8 +88,8 @@ func GetKernelServHttp() kspec.IKernelServerHttp {
 		lCtx:     d1.NewLocalCtx(owner, kCtx.SelfCtx()),
 		strUrl:   strLocalUrl,
 		fiberApp: fiber.New(confFiber),
-		isWork:   d0.MutSafeBool(owner,false),
-		isEnd:    d0.MutSafeBool(owner,false),
+		isWork:   d0.MutSafeBool(owner, false),
+		isEnd:    d0.MutSafeBool(owner, false),
 	}
 	sf.fiberApp.Use(compress.New(compress.Config{
 		Level: compress.LevelBestCompression, // 2

+ 3 - 4
v4/d2/kserv_http_std/kserv_http_std.go

@@ -4,7 +4,6 @@ package kserv_http_std
 import (
 	"fmt"
 	"net/http"
-	"sync"
 	"time"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
@@ -23,13 +22,13 @@ type kServHttpStd struct {
 
 var (
 	kServ *kServHttpStd
-	mu    sync.Mutex
+	block = d0.MutSafeMutex()
 )
 
 // GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке.
 func GetKservHttpStd() *d0.Result[*kServHttpStd] {
-	mu.Lock()
-	defer mu.Unlock()
+	block.Lock()
+	defer block.Unlock()
 	if kServ != nil {
 		return d0.ResOk(kServ)
 	}

+ 3 - 3
v4/d2/kwg/kwg.go

@@ -5,7 +5,6 @@ package kwg
 
 import (
 	"context"
-	"sync"
 	"time"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
@@ -15,7 +14,7 @@ import (
 
 // KernWg -- именованный ожидатель потоков ядра.
 type KernWg struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	owner      *d0.LOwner
 	ctx        context.Context
 	dictStream map[*stream_name.AStreamName]d0.Bool // Словарь имён потоков с признаком работы
@@ -25,7 +24,7 @@ type KernWg struct {
 
 var (
 	kernWg *KernWg // Глобальный объект
-	block  sync.Mutex
+	block  = d0.MutSafeMutex()
 )
 
 // GetKernelWg -- возвращает новый именованный ожидатель потоков ядра.
@@ -43,6 +42,7 @@ func GetKernelWg(ctx context.Context) *KernWg {
 		Prefix_: d0.LetTxt("kernelWg"),
 	}
 	sf := &KernWg{
+		MSafeMutex: d0.MutSafeMutex(),
 		owner:      owner,
 		ctx:        ctx,
 		dictStream: map[*stream_name.AStreamName]d0.Bool{},

+ 1 - 1
v4/d2/log_topic/log_topic.go

@@ -9,7 +9,7 @@ import (
 
 // LogTopic -- элемент лога шины.
 type LogTopic struct {
-	topic  *topic.LTopic     // Топик, куда публиковать лог
+	topic  *topic.LTopic       // Топик, куда публиковать лог
 	client bus_spec.IBusClient // С помощью чего публиковать лог
 }
 

+ 9 - 9
v4/d2/lsi/kstore_kv/kstore_kv.go

@@ -3,7 +3,6 @@ package kstore_kv
 
 import (
 	"os"
-	"sync"
 	"time"
 
 	"github.com/dgraph-io/badger/v4"
@@ -25,7 +24,7 @@ var (
 
 // kStoreKv -- локальное хранилище ядра.
 type kStoreKv struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	owner     *d0.LOwner
 	kCtx      *kern_ctx.KernCtx
 	lCtx      *d1.LocalCtx
@@ -38,7 +37,7 @@ type kStoreKv struct {
 
 var (
 	kernStore *kStoreKv // Глобальный объект
-	block     sync.Mutex
+	block     = d0.MutSafeMutex()
 )
 
 // GetKernelStore -- возвращает новое локальное хранилище ядра.
@@ -57,12 +56,13 @@ func GetKernelStore() store_spec.IKernelStoreKv {
 	}
 	log := d1.NewLogBuf(param)
 	sf := &kStoreKv{
-		owner:  owner,
-		kCtx:   kCtx,
-		lCtx:   d1.NewLocalCtx(owner,kCtx.SelfCtx()),
-		wg:     kCtx.Wg(),
-		isWork: d0.MutSafeBool(owner, true),
-		log:    log,
+		MSafeMutex: d0.MutSafeMutex(),
+		owner:      owner,
+		kCtx:       kCtx,
+		lCtx:       d1.NewLocalCtx(owner, kCtx.SelfCtx()),
+		wg:         kCtx.Wg(),
+		isWork:     d0.MutSafeBool(owner, true),
+		log:        log,
 	}
 	sf.open()
 	kernStore = sf

+ 6 - 6
v4/d2/lsi/kstore_kv_std/kv_bucket_base/kv_bucket_base.go

@@ -19,14 +19,14 @@ import (
 // Он должен быть разумным значением (например, до 100 МБ).
 // Как только бакет заполнится, он будет вытеснен на диск.
 type KvBucketBase struct {
-	Name_      *d0.LTxt                         `json:"name"`       // Имя бакета
-	Level_     d0.Num                             `json:"level"`      // Уровень бакета
-	Number_    d0.Num                             `json:"num"`        // Номер бакета
+	Name_      *d0.LTxt                             `json:"name"`       // Имя бакета
+	Level_     d0.Num                               `json:"level"`      // Уровень бакета
+	Number_    d0.Num                               `json:"num"`        // Номер бакета
 	Size_      int64                                `json:"size"`       // Размер бакета
 	SizeLimit_ int64                                `json:"size_limit"` // Лимит размера бакета
-	CreatedAt_ *d0.LTime                      `json:"created_at"` // Время создания бакета
-	UpdatedAt_ *d0.MTime                   `json:"updated_at"` // Время обновления бакета
-	Vers_      d0.Num                             `json:"vers"`       // Версия бакета
+	CreatedAt_ *d0.LTime                            `json:"created_at"` // Время создания бакета
+	UpdatedAt_ *d0.MTime                            `json:"updated_at"` // Время обновления бакета
+	Vers_      d0.Num                               `json:"vers"`       // Версия бакета
 	dictRec    map[rec_key.ARecKey]rec_kv.IRecKvFix // Словарь для хранения данных
 }
 

+ 3 - 4
v4/d2/lsi/store_ent/dict_rec/dict_rec.go

@@ -2,8 +2,6 @@
 package dict_rec
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_ent/rec_key"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_ent/rec_kv"
@@ -24,13 +22,14 @@ type IDictRec interface {
 // DictRec -- потокобезопасный словарь KV-бакета.
 type DictRec struct {
 	dict  map[rec_key.ARecKey]rec_kv.IRecKvFix
-	block sync.RWMutex
+	block *d0.MSafeMutex
 }
 
 // NewDictRec -- создание нового потокобезопасного словаря KV.
 func NewDictRec() *DictRec {
 	sf := &DictRec{
-		dict: map[rec_key.ARecKey]rec_kv.IRecKvFix{},
+		dict:  map[rec_key.ARecKey]rec_kv.IRecKvFix{},
+		block: d0.MutSafeMutex(),
 	}
 	_ = IDictRec(sf)
 	return sf

+ 2 - 2
v4/d2/lsi/store_ent/rec_key/store_key.go

@@ -8,8 +8,8 @@ import (
 // ARecKey -- ключ хранилища.
 type ARecKey d0.Txt
 
-type IString interface{
-	String()string
+type IString interface {
+	String() string
 }
 
 // IRecKeyFix -- фиксированный ключ хранилища.

+ 4 - 4
v4/d2/lsi/store_ent/rec_meta/rec_meta.go

@@ -27,13 +27,13 @@ type IRecMeta interface {
 type RecMeta struct {
 	Key_       rec_key.ARecKey `json:"key"`       // Ключ
 	Vers_      int64           `json:"vers"`      // Версия записи
-	Operation_ *d0.LTxt      `json:"operation"` // Тип операции над записью
-	createdAt_ *d0.LTime     `voc:"created_at"` // Дата создания записи
-	updateAt_  *d0.MTime     `voc:"update_at"`  // Дата последнего обновления
+	Operation_ *d0.LTxt        `json:"operation"` // Тип операции над записью
+	createdAt_ *d0.LTime       `voc:"created_at"` // Дата создания записи
+	updateAt_  *d0.MTime       `voc:"update_at"`  // Дата последнего обновления
 
 	// Хеш мета-информации записи (вместе с значением, но без этого поля разумеется)
 	Sha_    *d0.LTxt `json:"sha"`
-	Offset_ int64      `json:"-"` // Смещение в файле, игнорируется при записи
+	Offset_ int64    `json:"-"` // Смещение в файле, игнорируется при записи
 }
 
 // NewRecMeta -- создание новой мета-информации записи KV-хранилища.

+ 3 - 2
v4/d2/lti/bus_ent/topic/topic_let.go

@@ -13,7 +13,7 @@ type LTopic struct {
 }
 
 // LetTopic -- неизменяемый топик
-func LetTopic(val ATopic)*LTopic{
+func LetTopic(val ATopic) *LTopic {
 	d0.If(val == "").Hassert("LetTopic(): val is empty")
 	sf := &LTopic{
 		val: val,
@@ -30,7 +30,8 @@ func (sf *LTopic) Txt() d0.Txt {
 func (sf *LTopic) String() string {
 	return string(sf.val)
 }
+
 // Get -- получить строковое представление топика.
 func (sf *LTopic) Get() ATopic {
 	return sf.val
-}
+}

+ 3 - 4
v4/d2/lti/bus_mock/mock_hand_serve/mock_hand_serve.go

@@ -2,8 +2,6 @@
 package mock_hand_serve
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_ent"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_ent/topic"
@@ -13,11 +11,11 @@ import (
 // MockHandlerServe -- мок-обработчик входящих запросов.
 type MockHandlerServe struct {
 	owner  *d0.LOwner
-	IsBad_ *d0.MSafeBool       // Признак сбоя при вызове
+	IsBad_ *d0.MSafeBool         // Признак сбоя при вызове
 	Msg_   []byte                // Для обратного вызова
 	Name_  *bus_ent.LHandlerName // Уникальное имя мок-обработчика подписки
 	Topic_ *topic.LTopic         // Имя топика подписки
-	block  sync.Mutex
+	block  *d0.MSafeMutex
 }
 
 // NewMockHandlerServe -- возвращает новый обработчик подписки.
@@ -30,6 +28,7 @@ func NewMockHandlerServe(topic *topic.LTopic, name bus_ent.AHandlerName) *MockHa
 		Topic_: topic,
 		Name_:  bus_ent.NewHandlerNameFix(name),
 		IsBad_: d0.MutSafeBool(owner, false),
+		block:  d0.MutSafeMutex(),
 	}
 	_ = bus_spec.IBusHandlerServe(sf)
 	return sf

+ 7 - 7
v4/d2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http.go

@@ -4,7 +4,6 @@ package mock_hand_sub_http
 import (
 	"crypto/rand"
 	"log"
-	"sync"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_ent"
@@ -16,10 +15,10 @@ import (
 // MockHandSubHttp -- обработчик подписки по HTTP.
 type MockHandSubHttp struct {
 	Name_    *bus_ent.LHandlerName // Уникальное имя обработчика
-	Topic_   *topic.LTopic       // Имя топика, на который подписан обработчик
-	WebHook_ *d0.LTxt            // Куда обращаться при запросах
-	BinMsg_  []byte                  // Последнее бинарное сообщение
-	block    sync.RWMutex
+	Topic_   *topic.LTopic         // Имя топика, на который подписан обработчик
+	WebHook_ *d0.LTxt              // Куда обращаться при запросах
+	BinMsg_  []byte                // Последнее бинарное сообщение
+	block    *d0.MSafeMutex
 }
 
 // NewMockHandSubHttp -- возвращает новый обработчик подписки по HTTP.
@@ -27,10 +26,11 @@ func NewMockHandSubHttp(topic *topic.LTopic, webHook *d0.LTxt) bus_spec.IBusHand
 	d0.If(topic == nil).Hassert("NewHandlerHttpSub(): topic is empty")
 	d0.If(webHook.Get() == "").Hassert("NewHandlerHttpSub(): webHook is empty")
 	sf := &MockHandSubHttp{
+		block:  d0.MutSafeMutex(),
 		Topic_: topic,
 		Name_: handler_name.LetHandlerName(
-				bus_ent.AHandlerName(
-					webHook.String() + "_" + rand.Text())),
+			bus_ent.AHandlerName(
+				webHook.String() + "_" + rand.Text())),
 		WebHook_: webHook,
 	}
 	return sf

+ 4 - 4
v4/d2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub.go

@@ -3,7 +3,6 @@ package mock_hand_sub_local
 
 import (
 	"crypto/rand"
-	"sync"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_ent"
@@ -12,10 +11,10 @@ import (
 )
 
 type MockHandlerSub struct {
-	Msg_   []byte                  // Для обратного вызова
+	Msg_   []byte                // Для обратного вызова
 	Name_  *bus_ent.LHandlerName // Уникальное имя мок-обработчика подписки
-	Topic_ *topic.LTopic       // Имя топика подписки
-	block  sync.RWMutex
+	Topic_ *topic.LTopic         // Имя топика подписки
+	block  *d0.MSafeMutex
 }
 
 // NewMockHandlerSub -- возвращает новый обработчик подписки.
@@ -24,6 +23,7 @@ func NewMockHandlerSub(topic *topic.LTopic, localHook *d0.LTxt) *MockHandlerSub
 	d0.If(localHook == nil).Hassert("NewMockHandlerSub(): name is empty")
 	handlerName := bus_ent.NewHandlerNameFix(bus_ent.AHandlerName(localHook.String() + "_" + rand.Text()))
 	sf := &MockHandlerSub{
+		block:  d0.MutSafeMutex(),
 		Topic_: topic,
 		Name_:  handlerName,
 	}

+ 1 - 1
v4/d2/lti/dot/msg_pub/msg_pub.go

@@ -9,7 +9,7 @@ import (
 // PublishReq -- запрос на публикацию.
 type PublishReq struct {
 	Topic_  bus_ent.ATopic `json:"topic"`
-	Uuid_   *d0.LTxt   `json:"uuid"`
+	Uuid_   *d0.LTxt       `json:"uuid"`
 	BinMsg_ []byte         `json:"msg"`
 }
 

+ 2 - 2
v4/d2/lti/dot/msg_serve/msg_serve.go

@@ -9,7 +9,7 @@ import (
 // ServeReq -- входящий запрос на обслуживание.
 type ServeReq struct {
 	Topic_  bus_ent.ATopic `json:"topic"`
-	Uuid_   *d0.LTxt     `json:"uuid"`
+	Uuid_   *d0.LTxt       `json:"uuid"`
 	BinReq_ []byte         `json:"req"`
 }
 
@@ -23,7 +23,7 @@ func (sf *ServeReq) SelfCheck() {
 type ServeResp struct {
 	Status_  *d0.LTxt `json:"status"`
 	Uuid_    *d0.LTxt `json:"uuid"`
-	BinResp_ []byte     `json:"resp"`
+	BinResp_ []byte   `json:"resp"`
 }
 
 // SelfCheck -- проверяет правильность своих полей.

+ 4 - 4
v4/d2/lti/dot/msg_sub/msg_sub.go

@@ -9,8 +9,8 @@ import (
 // SubscribeReq -- входящий запрос на подписку.
 type SubscribeReq struct {
 	Topic_   bus_ent.ATopic `json:"topic"` // Топик, на который надо подписаться
-	Uuid_    *d0.LTxt     `json:"uuid"`
-	WebHook_ *d0.LTxt     `json:"web_hook"` // Веб-хук для обратного вызова
+	Uuid_    *d0.LTxt       `json:"uuid"`
+	WebHook_ *d0.LTxt       `json:"web_hook"` // Веб-хук для обратного вызова
 }
 
 // SelfCheck -- проверяет поля на правильность.
@@ -22,8 +22,8 @@ func (sf *SubscribeReq) SelfCheck() {
 
 // SubscribeResp -- ответ на запрос подписки.
 type SubscribeResp struct {
-	Status_ *d0.LTxt           `json:"status"`
-	Uuid_   *d0.LTxt           `json:"uuid"`
+	Status_ *d0.LTxt             `json:"status"`
+	Uuid_   *d0.LTxt             `json:"uuid"`
 	Name_   bus_ent.AHandlerName `json:"name"` // Уникальное имя подписки
 }
 

+ 1 - 1
v4/d2/lti/dot/msg_unsub/msg_unsub.go

@@ -9,7 +9,7 @@ import (
 // UnsubReq -- запрос на отписку от топика.
 type UnsubReq struct {
 	HandlerName_ bus_ent.AHandlerName `json:"name"` // Уникальная метка подписки
-	Uuid_        *d0.LTxt         `json:"uuid"`
+	Uuid_        *d0.LTxt             `json:"uuid"`
 }
 
 // SelfCheck -- проверка запроса на правильность полей.

+ 4 - 5
v4/d2/lti/kbus/dict_sub_hook/dict_sub_hook.go

@@ -2,8 +2,6 @@
 package dict_sub_hook
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_ent"
@@ -14,14 +12,15 @@ import (
 type dictSubHook struct {
 	kCtx  *kern_ctx.KernCtx
 	dict  map[bus_ent.AHandlerName]struct{} // В качестве ключа -- URL веб-хука
-	block sync.RWMutex
+	block *d0.MSafeMutex
 }
 
 // NewDictSubHook -- возвращает новый словарь веб-хуков одного топика.
 func NewDictSubHook() bus_spec.IDictSubHook {
 	sf := &dictSubHook{
-		kCtx: kern_ctx.GetKernCtx(),
-		dict: map[bus_ent.AHandlerName]struct{}{},
+		kCtx:  kern_ctx.GetKernCtx(),
+		dict:  map[bus_ent.AHandlerName]struct{}{},
+		block: d0.MutSafeMutex(),
 	}
 	return sf
 }

+ 4 - 4
v4/d2/lti/kbus/dict_topic_serve/dict_topic_serve.go

@@ -3,7 +3,6 @@ package dict_topic_serve
 
 import (
 	"context"
-	"sync"
 	"time"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
@@ -17,7 +16,7 @@ import (
 //
 // Допускается только один обработчик запросов на один топик.
 type dictServe struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	kCtx      *kern_ctx.KernCtx
 	dictServe map[bus_ent.ATopic]bus_spec.IBusHandlerServe
 }
@@ -25,8 +24,9 @@ type dictServe struct {
 // NewDictServe -- возвращает потокобезопасный словарь обработчиков запросов.
 func NewDictServe() *dictServe {
 	sf := &dictServe{
-		kCtx:      kern_ctx.GetKernCtx(),
-		dictServe: map[bus_ent.ATopic]bus_spec.IBusHandlerServe{},
+		MSafeMutex: d0.MutSafeMutex(),
+		kCtx:       kern_ctx.GetKernCtx(),
+		dictServe:  map[bus_ent.ATopic]bus_spec.IBusHandlerServe{},
 	}
 	return sf
 }

+ 2 - 3
v4/d2/lti/kbus/dict_topic_sub/dict_topic_sub.go

@@ -2,8 +2,6 @@
 package dict_topic_sub
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ctx"
@@ -20,7 +18,7 @@ type tReadReq struct {
 
 // dictTopicSub -- потокобезопасный словарь подписчиков.
 type dictTopicSub struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	kCtx          *kern_ctx.KernCtx
 	dictTopicHook map[bus_ent.ATopic]bus_spec.IDictSubHook
 }
@@ -28,6 +26,7 @@ type dictTopicSub struct {
 // NewDictTopicSub -- возвращает потокобезопасный словарь подписчиков.
 func NewDictTopicSub() *dictTopicSub {
 	sf := &dictTopicSub{
+		MSafeMutex:    d0.MutSafeMutex(),
 		kCtx:          kern_ctx.GetKernCtx(),
 		dictTopicHook: map[bus_ent.ATopic]bus_spec.IDictSubHook{},
 	}

+ 1 - 3
v4/d2/lti/kbus_base/kbus_base.go

@@ -2,8 +2,6 @@
 package kbus_base
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ctx"
@@ -31,7 +29,7 @@ type KBusBase struct {
 
 var (
 	Bus_  *KBusBase
-	block sync.Mutex
+	block = d0.MutSafeMutex()
 )
 
 // GetKernelBusBase -- возвращает базовую шину сообщений.

+ 1 - 1
v4/d2/lti/kbus_http/client_bus_http/client_bus_http.go

@@ -51,7 +51,7 @@ func NewClientBusHttp(owner *d0.LOwner, urlRemote *d0.LTxt) bus_spec.IBusClient
 		lCtx:      d1.NewLocalCtx(owner, kCtx.SelfCtx()),
 		log:       log,
 		bus:       kBusHttp,
-		isWork:    d0.MutSafeBool(owner,true),
+		isWork:    d0.MutSafeBool(owner, true),
 		urlRemote: d0.LetTxt(urlRemote.TrimSuffix("/")),
 		urlLocal:  d0.LetTxt(txtUrl),
 	}

+ 1 - 2
v4/d2/lti/kbus_http/kbus_http.go

@@ -3,7 +3,6 @@ package kbus_http
 
 import (
 	"net/http"
-	"sync"
 
 	"github.com/gofiber/fiber/v3"
 
@@ -26,7 +25,7 @@ type kBusHttp struct {
 
 var (
 	Bus_  *kBusHttp
-	block sync.Mutex
+	block = d0.MutSafeMutex()
 )
 
 // GetKernelBusHttp -- возвращает шину HTTP.

+ 2 - 3
v4/d2/lti/kbus_local/kbus_local.go

@@ -2,8 +2,7 @@
 package kbus_local
 
 import (
-	"sync"
-
+	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/kbus_base"
 )
 
@@ -14,7 +13,7 @@ type kernelBusLocal struct {
 
 var (
 	bus   *kernelBusLocal
-	block sync.Mutex
+	block = d0.MutSafeMutex()
 )
 
 // GetKernelBusLocal -- возвращает локальную шину сообщений.

+ 4 - 4
v4/d2/wui/hx_swap/hx_swap.go

@@ -2,21 +2,21 @@
 package hx_swap
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/d2/wui/wui_types"
 )
 
 // HxSwap -- атрибут HTMX (политика замены).
 type HxSwap struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	swap *d0.MTxt
 }
 
 // NewHxSwap -- возвращает новую политику замены.
 func NewHxSwap() *HxSwap {
-	sf := &HxSwap{}
+	sf := &HxSwap{
+		MSafeMutex: d0.MutSafeMutex(),
+	}
 	_ = mWt.IHxSwap(sf)
 	return sf
 }

+ 4 - 4
v4/d2/wui/hx_swap_oob/hx_swap_oob.go

@@ -2,20 +2,20 @@
 package hx_swap_oob
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 )
 
 // HxSwapOob -- объект внеполосной подкачки.
 type HxSwapOob struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	val d0.Txt
 }
 
 // NewHxSwapOob -- возвращает новую внеполосную подкачку.
 func NewHxSwapOob() *HxSwapOob {
-	sf := &HxSwapOob{}
+	sf := &HxSwapOob{
+		MSafeMutex: d0.MutSafeMutex(),
+	}
 	return sf
 }
 

+ 5 - 4
v4/d2/wui/hx_target/hx_target.go

@@ -2,21 +2,22 @@
 package hx_target
 
 import (
-	"sync"
-
+	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0/defs"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/d2/wui/wui_types"
 )
 
 // HxSwap -- атрибут HTMX (цель замены).
 type HxSwap struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	val defs.Txt
 }
 
 // NewHxTarget -- возвращает новую цель замены.
 func NewHxTarget() *HxSwap {
-	sf := &HxSwap{}
+	sf := &HxSwap{
+		MSafeMutex: d0.MutSafeMutex(),
+	}
 	_ = mWt.IHxTarget(sf)
 
 	return sf

+ 4 - 4
v4/d2/wui/hx_trigger/hx_trigger.go

@@ -2,21 +2,21 @@
 package hx_trigger
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/d2/wui/wui_types"
 )
 
 // HxTrigger -- атрибут HTMX (триггер запроса).
 type HxTrigger struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	trigger *d0.MTxt
 }
 
 // NewHxTrigger -- возвращает новый триггер запроса.
 func NewHxTrigger() *HxTrigger {
-	sf := &HxTrigger{}
+	sf := &HxTrigger{
+		MSafeMutex: d0.MutSafeMutex(),
+	}
 	_ = mWt.IHxTrigger(sf)
 
 	return sf

+ 3 - 4
v4/d2/wui/hx_url_method/hx_url_method.go

@@ -2,22 +2,21 @@
 package hx_url_method
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/d2/wui/wui_types"
 )
 
 // HxSwap -- атрибут HTMX (метод запроса, внеполосная замена).
 type HxSwap struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	method *d0.LTxt
 }
 
 // NewHxUrlMethod -- возвращает новый метод запроса.
 func NewHxUrlMethod() *HxSwap {
 	sf := &HxSwap{
-		method: d0.LetTxt("hx-post"),
+		MSafeMutex: d0.MutSafeMutex(),
+		method:     d0.LetTxt("hx-post"),
 	}
 	_ = mWt.IHxUrlMethod(sf)
 	return sf

+ 3 - 4
v4/d2/wui/hx_url_patch/hx_url_patch.go

@@ -2,15 +2,13 @@
 package hx_url_patch
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/d2/wui/wui_types"
 )
 
 // HxUrlPatch -- атрибут HTMX (путь запроса).
 type HxUrlPatch struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	val *d0.LTxt
 }
 
@@ -18,7 +16,8 @@ type HxUrlPatch struct {
 func NewHxUrlPatch(patch *d0.LTxt) *HxUrlPatch {
 	d0.If(patch.Get() == "").Hassert("NewHxUrlPatch(): patch isempty")
 	sf := &HxUrlPatch{
-		val: patch,
+		MSafeMutex: d0.MutSafeMutex(),
+		val:        patch,
 	}
 	_ = mWt.IHxUrlPatch(sf)
 	return sf

+ 4 - 3
v4/d2/wui/hx_vals/hx_vals.go

@@ -3,8 +3,8 @@ package hx_vals
 
 import (
 	"encoding/json"
-	"sync"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0/defs"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/d0/helpers"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/d2/wui/wui_types"
@@ -12,14 +12,15 @@ import (
 
 // HxVals -- атрибут HTMX (словарь значений).
 type HxVals struct {
-	sync.RWMutex
+	*d0.MSafeMutex
 	dict map[defs.Txt]any
 }
 
 // NewHxVals -- возвращает новый словарь значений.
 func NewHxVals() *HxVals {
 	sf := &HxVals{
-		dict: map[defs.Txt]any{},
+		MSafeMutex: d0.MutSafeMutex(),
+		dict:       map[defs.Txt]any{},
 	}
 	_ = mWt.IHxVals(sf)
 	return sf

+ 2 - 3
v4/d2/wui/wui_ctx/wui_ctx.go

@@ -2,8 +2,7 @@
 package wui_ctx
 
 import (
-	"sync"
-
+	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ctx"
 )
@@ -13,7 +12,7 @@ type WuiCtx = d1.LocalCtx
 
 var (
 	wCtx  *WuiCtx
-	block sync.Mutex
+	block = d0.MutSafeMutex()
 )
 
 // GetWuiCtx -- возвращает глобальный веб-контекст графики.

+ 2 - 2
v4/d2/wui/wui_text/wui_text.go

@@ -3,7 +3,6 @@ package wui_text
 
 import (
 	"strings"
-	"sync"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/d2/wui/wui_types"
@@ -13,13 +12,14 @@ import (
 // WuiText -- текст для WUI.
 type WuiText struct {
 	mWt.IWuiWidget
-	sync.RWMutex
+	*d0.MSafeMutex
 	d0.MTxt
 }
 
 // NewWuiText -- возвращает новый текст WUI.
 func NewWuiText(val *d0.LTxt) *WuiText {
 	sf := &WuiText{
+		MSafeMutex: d0.MutSafeMutex(),
 		IWuiWidget: wui_widget.NewWuiWidget(),
 		MTxt:       *d0.MutTxt(val.Get()),
 	}

+ 2 - 2
v4/lev3/lev3.go → v4/d3/depth3.go

@@ -1,7 +1,7 @@
 // LModuleName -- уровень модулей.
-package lev3
+package d3
 
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
+import "gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent/module_name"
 
 // LModuleName -- неизменяемое имя модуля.
 type LModuleName = module_name.LModuleName

+ 2 - 2
v4/lev3/mod_ent/mod_ent.go → v4/d3/mod_ent/mod_ent.go

@@ -3,8 +3,8 @@ package mod_ent
 
 import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/mod_num"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent/mod_num"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent/module_name"
 )
 
 // IModEnt -- сущность уровня модуля

+ 1 - 2
v4/lev3/mod_ent/mod_num/mod_num.go → v4/d3/mod_ent/mod_num/mod_num.go

@@ -3,7 +3,6 @@ package mod_num
 
 import (
 	"fmt"
-	"sync"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 )
@@ -18,7 +17,7 @@ type LModuleNum struct {
 
 var (
 	nextNum AModNum // Следующий номер модуля
-	block   sync.Mutex
+	block   = d0.MutSafeMutex()
 )
 
 // LetModuleNum -- возвращает новый модуль номера.

+ 0 - 0
v4/lev3/mod_ent/module_name/README.md → v4/d3/mod_ent/module_name/README.md


+ 0 - 0
v4/lev3/mod_ent/module_name/module_name.go → v4/d3/mod_ent/module_name/module_name.go


+ 0 - 0
v4/lev3/mod_ent/module_name/module_name_test.go → v4/d3/mod_ent/module_name/module_name_test.go


+ 6 - 8
v4/lev3/mod_kctx/mod_kctx.go → v4/d3/mod_kctx/mod_kctx.go

@@ -2,19 +2,17 @@
 package mod_kctx
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kmodule"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kserv_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kspec"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/http_api"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/page_module"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/page_monolit"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent/module_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_serv_http/http_api"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_serv_http/page_module"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_serv_http/page_monolit"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_spec"
 )
 
 // ModuleKernelCtx -- модуль контекста ядра.
@@ -28,7 +26,7 @@ type ModuleKernelCtx struct {
 
 var (
 	mod   *ModuleKernelCtx
-	block sync.Mutex
+	block = d0.MutSafeMutex()
 )
 
 // GetModuleKernelCtx -- возвращает новый модуль контекста ядра.

+ 1 - 1
v4/lev3/mod_kctx/mod_kctx_test.go → v4/d3/mod_kctx/mod_kctx_test.go

@@ -8,7 +8,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_spec"
 )
 
 const (

+ 7 - 9
v4/lev3/mod_keeper/mod_keeper.go → v4/d3/mod_keeper/mod_keeper.go

@@ -2,19 +2,17 @@
 package mod_keeper
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kmodule"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kserv_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kspec"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/http_api"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/page_module"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/page_monolit"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent/module_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_serv_http/http_api"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_serv_http/page_module"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_serv_http/page_monolit"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_spec"
 )
 
 // ModuleKeeper -- модуль сторожа.
@@ -28,7 +26,7 @@ type ModuleKeeper struct {
 
 var (
 	mod   *ModuleKeeper
-	block sync.Mutex
+	block = d0.MutSafeMutex()
 )
 
 // GetModuleKeeper -- возвращает новый модуль сторожа ядра.
@@ -39,7 +37,7 @@ func GetModuleKeeper() *ModuleKeeper {
 		mod.log.Debug("GetModuleKeeper(): already exists")
 		return mod
 	}
-	owner:=d0.LetOwner(1,"isol_kern_keeper")
+	owner := d0.LetOwner(1, "isol_kern_keeper")
 	param := &d1.LogBufParam{
 		Prefix_: d0.LetTxt("ModuleKeeper"),
 		IsTerm_: d0.MutSafeBool(owner, true),

+ 1 - 1
v4/lev3/mod_keeper/mod_keeper_test.go → v4/d3/mod_keeper/mod_keeper_test.go

@@ -8,7 +8,7 @@ import (
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d1/mock_env"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_spec"
 )
 
 const (

+ 0 - 0
v4/lev3/mod_serv_http/btn_modules/block_modules.html → v4/d3/mod_serv_http/btn_modules/block_modules.html


+ 0 - 0
v4/lev3/mod_serv_http/btn_modules/block_row.html → v4/d3/mod_serv_http/btn_modules/block_row.html


+ 1 - 1
v4/lev3/mod_serv_http/btn_modules/btn_modules.go → v4/d3/mod_serv_http/btn_modules/btn_modules.go

@@ -10,7 +10,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/wui"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/d2/wui/wui_types"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_spec"
 )
 
 type BtnModules struct {

+ 1 - 1
v4/lev3/mod_serv_http/btn_modules/btn_modules_test.go → v4/d3/mod_serv_http/btn_modules/btn_modules_test.go

@@ -7,7 +7,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kmodule"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kmonolit"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent/module_name"
 )
 
 func TestBtnModules(t *testing.T) {

+ 0 - 0
v4/lev3/mod_serv_http/btn_monolit/block_monolit.html → v4/d3/mod_serv_http/btn_monolit/block_monolit.html


+ 0 - 0
v4/lev3/mod_serv_http/btn_monolit/btn_monolit.go → v4/d3/mod_serv_http/btn_monolit/btn_monolit.go


+ 2 - 2
v4/lev3/mod_serv_http/btn_monolit/btn_monolit_test.go → v4/d3/mod_serv_http/btn_monolit/btn_monolit_test.go

@@ -7,7 +7,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kmodule"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kmonolit"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent/module_name"
 )
 
 func TestBtnModules(t *testing.T) {
@@ -15,7 +15,7 @@ func TestBtnModules(t *testing.T) {
 	if html := btn.Html(); html.Get() == "" {
 		t.Fatalf("html is empty")
 	}
-	owner:=d0.LetOwner(1,"test_isol_wui_btn")
+	owner := d0.LetOwner(1, "test_isol_wui_btn")
 	kCtx := kern_ctx.GetKernCtx()
 	kCtx.Set(d0.LetTxt("isLocal"), true, "test")
 	kMon := kmonolit.LetModMonolit("test")

+ 0 - 0
v4/lev3/mod_serv_http/http_api/http_api.go → v4/d3/mod_serv_http/http_api/http_api.go


+ 0 - 0
v4/lev3/mod_serv_http/http_api/http_api_test.go → v4/d3/mod_serv_http/http_api/http_api_test.go


+ 9 - 11
v4/lev3/mod_serv_http/mod_serv_http.go → v4/d3/mod_serv_http/mod_serv_http.go

@@ -2,18 +2,16 @@
 package mod_serv_http
 
 import (
-	"sync"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kmodule"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kserv_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kspec"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/http_api"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/page_module"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/page_monolit"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent/module_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_serv_http/http_api"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_serv_http/page_module"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_serv_http/page_monolit"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_spec"
 )
 
 // ModuleServHttp -- модуль HTTP-сервера.
@@ -21,12 +19,12 @@ type ModuleServHttp struct {
 	mod_spec.IKernelModule
 	kServHttp kspec.IKernelServerHttp
 	log       *d1.LogBuf
-	owner *d0.LOwner
+	owner     *d0.LOwner
 }
 
 var (
 	mod   *ModuleServHttp
-	block sync.RWMutex
+	block = d0.MutSafeMutex()
 )
 
 // GetModuleServHttp -- возвращает новый модуль HTTP-сервера.
@@ -36,10 +34,10 @@ func GetModuleServHttp() *ModuleServHttp {
 	if mod != nil {
 		return mod
 	}
-	owner:=d0.LetOwner(1,"isol_serv_http")
+	owner := d0.LetOwner(1, "isol_serv_http")
 	modName := module_name.LetModuleName("kServHttp")
 	sf := &ModuleServHttp{
-		owner:owner,
+		owner:         owner,
 		IKernelModule: kmodule.NewKernelModule(owner, modName),
 		kServHttp:     kserv_http.GetKernelServHttp(),
 	}

+ 1 - 1
v4/lev3/mod_serv_http/mod_serv_http_test.go → v4/d3/mod_serv_http/mod_serv_http_test.go

@@ -9,7 +9,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ctx"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_spec"
 )
 
 const (

+ 0 - 0
v4/lev3/mod_serv_http/page_module/ctx_row_block.html → v4/d3/mod_serv_http/page_module/ctx_row_block.html


+ 0 - 0
v4/lev3/mod_serv_http/page_module/ctx_row_val.html → v4/d3/mod_serv_http/page_module/ctx_row_val.html


+ 0 - 0
v4/lev3/mod_serv_http/page_module/log_block.html → v4/d3/mod_serv_http/page_module/log_block.html


+ 0 - 0
v4/lev3/mod_serv_http/page_module/module_state.html → v4/d3/mod_serv_http/page_module/module_state.html


+ 0 - 0
v4/lev3/mod_serv_http/page_module/module_state_block.html → v4/d3/mod_serv_http/page_module/module_state_block.html


+ 2 - 2
v4/lev3/mod_serv_http/page_module/page_module.go → v4/d3/mod_serv_http/page_module/page_module.go

@@ -11,8 +11,8 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/mod_num"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_ent/mod_num"
+	"gitp78su.ipnodns.ru/svi/kern/v4/d3/mod_spec"
 )
 
 // PageModule -- страница показа модуля.

Някои файлове не бяха показани, защото твърде много файлове са промени