kernel.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // Package kernel -- объект ядра прилоэжения
  2. //
  3. // Содержит базовый функционал сервиса
  4. package kernel
  5. import (
  6. "context"
  7. "fmt"
  8. "sync"
  9. // "time"
  10. "wartank/pkg/components/kernel/keeper"
  11. "wartank/pkg/components/kernel/slog"
  12. "wartank/pkg/components/kernel/wgname"
  13. "wartank/pkg/types"
  14. )
  15. /*
  16. Базовый объект приложения.
  17. */
  18. // Kernel -- объект ядра приложения
  19. type Kernel struct {
  20. ctxBg context.Context // Неотменяемый контекст приложения
  21. ctxApp context.Context // Отменяемый контекст приложения
  22. fnCancel func() // Функция отмены приложения
  23. keeper *keeper.Keeper // Сторож системных сигналов
  24. slog *slog.Slog // Логгер в два вывода
  25. wg *wgname.WgName // Групповое ожидание частей приложения
  26. block sync.Mutex
  27. }
  28. // NewKernel -- возвращает новый *Kernel
  29. func NewKernel() (sf *Kernel, err error) {
  30. // timeStart := time.Now().UTC().Format("2006-10-02 15:04:05.000")
  31. // fmt._rintf("%v\t%v\tCI/CD test\n", cons.SelfName, timeStart)
  32. sf = &Kernel{
  33. ctxBg: context.Background(),
  34. wg: wgname.NewWgName(),
  35. }
  36. sf.ctxApp, sf.fnCancel = context.WithCancel(sf.ctxBg)
  37. sf.block.Lock()
  38. sf.slog, err = slog.NewSlog(sf)
  39. sf.block.Unlock()
  40. if err != nil {
  41. return nil, fmt.Errorf("NewKernel(): in creste ISlog, err=%w", err)
  42. }
  43. sf.slog.Debugf("NewKernel()")
  44. sf.keeper = keeper.NewKeeper(sf)
  45. return sf, nil
  46. }
  47. // Wg -- возвращает объект групповой сихнронизации
  48. func (sf *Kernel) Wg() types.IWgName {
  49. return sf.wg
  50. }
  51. // CtxApp -- возвращает глобальный контекст приложения
  52. func (sf *Kernel) CtxApp() context.Context {
  53. return sf.ctxApp
  54. }
  55. // Done -- возвращает канал отмены контекста приложения
  56. func (sf *Kernel) Done() <-chan struct{} {
  57. return sf.ctxApp.Done()
  58. }
  59. // CancelApp -- отменяет глобальный контекст приложения
  60. func (sf *Kernel) CancelApp() {
  61. sf.block.Lock()
  62. defer sf.block.Unlock()
  63. sf.slog.Infof("Kernel.CancelApp()\n")
  64. sf.fnCancel()
  65. }
  66. // Slog -- возвращает глобальный лог приложения
  67. func (sf *Kernel) Slog() types.ISlog {
  68. return sf.slog
  69. }