12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- package module
- import (
- "leafstalk/conf"
- "leafstalk/log"
- "runtime"
- "sync"
- )
- type Module interface {
- OnInit()
- OnDestroy()
- Run(closeSig chan bool)
- }
- type module struct {
- mi Module
- closeSig chan bool
- wg sync.WaitGroup
- }
- var mods []*module
- // Register 注册模块
- // 底层模块先注册,注销顺序是先进后出
- func Register(mi Module) {
- m := new(module)
- m.mi = mi
- m.closeSig = make(chan bool, 1)
- mods = append(mods, m)
- }
- // Start 启动模块
- func Start() {
- for i := 0; i < len(mods); i++ {
- mods[i].mi.OnInit()
- }
- for i := 0; i < len(mods); i++ {
- m := mods[i]
- m.wg.Add(1)
- go run(m)
- }
- }
- // Destroy 停止模块
- func Destroy() {
- for i := len(mods) - 1; i >= 0; i-- {
- m := mods[i]
- m.closeSig <- true
- m.wg.Wait()
- destroy(m)
- }
- }
- func run(m *module) {
- m.mi.Run(m.closeSig)
- m.wg.Done()
- }
- func destroy(m *module) {
- defer func() {
- if r := recover(); r != nil {
- if conf.LenStackBuf > 0 {
- buf := make([]byte, conf.LenStackBuf)
- l := runtime.Stack(buf, false)
- log.Errorf("%v: %s", r, buf[:l])
- } else {
- log.Errorf("%v", r)
- }
- }
- }()
- m.mi.OnDestroy()
- }
|