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() }