module.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package module
  2. import (
  3. "leafstalk/conf"
  4. "leafstalk/log"
  5. "runtime"
  6. "sync"
  7. )
  8. type Module interface {
  9. OnInit()
  10. OnDestroy()
  11. Run(closeSig chan bool)
  12. }
  13. type module struct {
  14. mi Module
  15. closeSig chan bool
  16. wg sync.WaitGroup
  17. }
  18. var mods []*module
  19. // Register 注册模块
  20. // 底层模块先注册,注销顺序是先进后出
  21. func Register(mi Module) {
  22. m := new(module)
  23. m.mi = mi
  24. m.closeSig = make(chan bool, 1)
  25. mods = append(mods, m)
  26. }
  27. // Start 启动模块
  28. func Start() {
  29. for i := 0; i < len(mods); i++ {
  30. mods[i].mi.OnInit()
  31. }
  32. for i := 0; i < len(mods); i++ {
  33. m := mods[i]
  34. m.wg.Add(1)
  35. go run(m)
  36. }
  37. }
  38. // Destroy 停止模块
  39. func Destroy() {
  40. for i := len(mods) - 1; i >= 0; i-- {
  41. m := mods[i]
  42. m.closeSig <- true
  43. m.wg.Wait()
  44. destroy(m)
  45. }
  46. }
  47. func run(m *module) {
  48. m.mi.Run(m.closeSig)
  49. m.wg.Done()
  50. }
  51. func destroy(m *module) {
  52. defer func() {
  53. if r := recover(); r != nil {
  54. if conf.LenStackBuf > 0 {
  55. buf := make([]byte, conf.LenStackBuf)
  56. l := runtime.Stack(buf, false)
  57. log.Errorf("%v: %s", r, buf[:l])
  58. } else {
  59. log.Errorf("%v", r)
  60. }
  61. }
  62. }()
  63. m.mi.OnDestroy()
  64. }