mod_kctx.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // package mod_kctx -- модуль контекста ядра.
  2. package mod_kctx
  3. import (
  4. "fmt"
  5. "sync"
  6. mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
  8. mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
  12. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/http_api"
  13. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/page_module"
  14. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/page_monolit"
  15. )
  16. // ModuleKernelCtx -- модуль контекста ядра.
  17. type ModuleKernelCtx struct {
  18. mKt.IKernelModule
  19. kCtx mKt.IKernelCtx
  20. kServHttp mKt.IKernelServerHttp
  21. log mKt.ILogBuf
  22. }
  23. var (
  24. mod *ModuleKernelCtx
  25. block sync.Mutex
  26. )
  27. // GetModuleKernelCtx -- возвращает новый модуль контекста ядра.
  28. func GetModuleKernelCtx() *mL0.Result[*ModuleKernelCtx] {
  29. block.Lock()
  30. defer block.Unlock()
  31. if mod != nil {
  32. return mL0.NewRes(mod)
  33. }
  34. resHttp := kserv_http.GetKernelServHttp()
  35. if resHttp.IsErr() {
  36. err := fmt.Errorf("GetModuleKernelCtx(): in get kernServHttp, err=\n\t%w", resHttp.Err())
  37. return mL0.NewErr[*ModuleKernelCtx](err)
  38. }
  39. modName := alias.NewAModuleName("kCtx")
  40. resModKern := kmodule.NewKernelModule(modName)
  41. if resModKern.IsErr() {
  42. err := fmt.Errorf("GetModuleKernelCtx(): in get kernMod, err=\n\t%w", resModKern.Err())
  43. return mL0.NewErr[*ModuleKernelCtx](err)
  44. }
  45. resKernCtx := kctx.GetKernelCtx()
  46. if resKernCtx.IsErr() {
  47. err := fmt.Errorf("GetModuleKernelCtx(): in get kernCtx, err=\n\t%w", resKernCtx.Err())
  48. return mL0.NewErr[*ModuleKernelCtx](err)
  49. }
  50. kCtx := resKernCtx.Val()
  51. sf := &ModuleKernelCtx{
  52. kCtx: kCtx,
  53. IKernelModule: resModKern.Val(),
  54. kServHttp: resHttp.Val(),
  55. }
  56. sf.log = sf.Ctx().Log()
  57. _ = page_monolit.GetPageMonolit()
  58. _ = page_module.GetPageModule()
  59. _ = http_api.NewHttpApi()
  60. mod = sf
  61. return mL0.NewRes(mod)
  62. }
  63. // Run -- запускает модуль в работу.
  64. func (sf *ModuleKernelCtx) Run() {
  65. sf.log.Info("ModuleKernelCtx.Run(): module=%v, is run", sf.Name())
  66. go sf.kServHttp.Run()
  67. }
  68. // IsWork -- признак работы модуля.
  69. func (sf *ModuleKernelCtx) IsWork() bool {
  70. return sf.kCtx.Wg().IsWork()
  71. }