kmodule.go 3.6 KB

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