kmodule.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // package kmodule -- модуль на основе ядра.
  2. package kmodule
  3. import (
  4. "time"
  5. mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
  8. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
  9. mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
  12. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule/mod_stat"
  13. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
  14. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
  15. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
  16. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
  17. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/kbus_local"
  18. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
  19. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
  20. )
  21. // kModule -- модуль на основе ядра.
  22. type kModule struct {
  23. kCtx kspec.IKernelCtx
  24. ctx comp_spec.ILocalCtx
  25. name module_name.IModuleNameFix
  26. bus bus_spec.IKernelBus
  27. timePhase core_spec.ISafeInt
  28. strLive core_spec.ISafeString
  29. stat mod_spec.IModuleStat
  30. }
  31. // NewKernelModule -- возвращает новый модуль на основе ядра.
  32. func NewKernelModule(name module_name.IModuleNameFix) mod_spec.IKernelModule {
  33. helpers.Hassert(name != nil, "NewKernelModule(): name==nil", []any{})
  34. kCtx := kctx.GetKernelCtx()
  35. sf := &kModule{
  36. kCtx: kCtx,
  37. ctx: mL1.NewLocalCtx(kCtx.Ctx()),
  38. name: name,
  39. bus: kbus_local.GetKernelBusLocal(),
  40. timePhase: mL1.NewSafeInt(1000), // 1000 msec
  41. strLive: mL1.NewSafeString(),
  42. stat: mod_stat.NewModStat(name),
  43. }
  44. go sf.sigLive()
  45. return sf
  46. }
  47. // Stat -- возвращает статистику модуля.
  48. func (sf *kModule) Stat() mod_spec.IModuleStat {
  49. return sf.stat
  50. }
  51. // Log -- возвращает буферный лог.
  52. func (sf *kModule) Log() comp_spec.ILogBuf {
  53. return sf.ctx.Log()
  54. }
  55. // Ctx -- возвращает контекст модуля.
  56. func (sf *kModule) Ctx() comp_spec.ILocalCtx {
  57. return sf.ctx
  58. }
  59. // Run -- запускает модуль в работу.
  60. func (sf *kModule) Run() {
  61. helpers.Hassert(false, "kModule.Run(): module='%v', parent not realized this method", []any{sf.name})
  62. }
  63. // Name -- возвращает уникальное имя модуля.
  64. func (sf *kModule) Name() module_name.IModuleNameFix {
  65. return sf.name
  66. }
  67. // IsWork -- возвращает признак состояния работы.
  68. func (sf *kModule) IsWork() core_spec.EBool {
  69. helpers.Hassert(false, "kModule.IsWork(): module='%v', parent not realized this method", []any{sf.name})
  70. return ebool.NewEBool(false)
  71. }
  72. // Live -- возвращает индикатор жизни модуля.
  73. func (sf *kModule) Live() string {
  74. return sf.strLive.Get()
  75. }
  76. // Сигнал жизни, каждые 5 сек публикует в шину метку.
  77. func (sf *kModule) sigLive() {
  78. var (
  79. topic = bus_ent.ITopicFix(topic.NewTopic(bus_ent.ATopic(sf.name.Get()) + "_live"))
  80. iPhase = 0
  81. res mL0.IResult[core_spec.EBool]
  82. )
  83. fnPhase := func() {
  84. time.Sleep(time.Millisecond * time.Duration(sf.timePhase.Get()))
  85. select {
  86. case <-sf.kCtx.Ctx().Done():
  87. return
  88. default:
  89. switch iPhase {
  90. case 0:
  91. sf.strLive.Set("|")
  92. res = sf.bus.Publish(topic, sf.strLive.Byte())
  93. case 1:
  94. sf.strLive.Set("/")
  95. res = sf.bus.Publish(topic, sf.strLive.Byte())
  96. case 2:
  97. sf.strLive.Set("-")
  98. res = sf.bus.Publish(topic, sf.strLive.Byte())
  99. case 3:
  100. sf.strLive.Set("\\")
  101. res = sf.bus.Publish(topic, sf.strLive.Byte())
  102. iPhase = -1
  103. }
  104. res.Hassert("kModule.sigLive(): name=%v, in publish live", sf.Name())
  105. iPhase++
  106. sf.stat.Add(1)
  107. }
  108. }
  109. for {
  110. select {
  111. case <-sf.kCtx.Ctx().Done():
  112. return
  113. default:
  114. fnPhase()
  115. }
  116. }
  117. }