kernel.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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() (сам *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. сам = &Kernel{
  33. ctxBg: context.Background(),
  34. wg: wgname.NewWgName(),
  35. }
  36. сам.ctxApp, сам.fnCancel = context.WithCancel(сам.ctxBg)
  37. сам.block.Lock()
  38. сам.slog, err = slog.NewSlog(сам)
  39. сам.block.Unlock()
  40. if err != nil {
  41. return nil, fmt.Errorf("NewKernel(): in creste ISlog, err=%w", err)
  42. }
  43. сам.slog.Debugf("NewKernel()")
  44. сам.keeper = keeper.NewKeeper(сам)
  45. return сам, nil
  46. }
  47. // Wg -- возвращает объект групповой сихнронизации
  48. func (сам *Kernel) Wg() types.IWgName {
  49. return сам.wg
  50. }
  51. // CtxApp -- возвращает глобальный контекст приложения
  52. func (сам *Kernel) CtxApp() context.Context {
  53. return сам.ctxApp
  54. }
  55. // Done -- возвращает канал отмены контекста приложения
  56. func (сам *Kernel) Done() <-chan struct{} {
  57. return сам.ctxApp.Done()
  58. }
  59. // CancelApp -- отменяет глобальный контекст приложения
  60. func (сам *Kernel) CancelApp() {
  61. сам.block.Lock()
  62. defer сам.block.Unlock()
  63. сам.slog.Infof("Kernel.CancelApp()\n")
  64. сам.fnCancel()
  65. }
  66. // Slog -- возвращает глобальный лог приложения
  67. func (сам *Kernel) Slog() types.ISlog {
  68. return сам.slog
  69. }