kmodule.go 3.4 KB

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