kmodule.go 3.2 KB

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