kmodule.go 3.3 KB

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