kmodule.go 3.2 KB

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