kmodule.go 3.6 KB

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