kmodule.go 3.7 KB

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