kmodule.go 3.3 KB

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