From ab377bbb5fda898eb974465aa4220ece0b2be567 Mon Sep 17 00:00:00 2001 From: boyce <6549168@qq.com> Date: Fri, 30 Aug 2019 17:43:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9Module=E6=A0=91=E7=8A=B6=E5=85=B3?= =?UTF-8?q?=E7=B3=BB=EF=BC=8C=E9=87=8D=E6=96=B0=E4=BC=98=E5=8C=96=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- service/Module.go | 136 ++++++++++++++++++++------------------------- service/Service.go | 2 - 2 files changed, 61 insertions(+), 77 deletions(-) diff --git a/service/Module.go b/service/Module.go index cc211d3..b9fcbdc 100644 --- a/service/Module.go +++ b/service/Module.go @@ -2,7 +2,6 @@ package service import ( "fmt" - "os" "runtime/debug" "sync" "sync/atomic" @@ -52,10 +51,10 @@ type BaseModule struct { CurrMaxModuleId uint32 corouterstatus int32 //0表示运行状态 //1释放消亡状态 - rwModuleLocker *sync.Mutex - ExitChan chan bool - WaitGroup *sync.WaitGroup - bInit bool + moduleLocker sync.RWMutex + ExitChan chan bool + WaitGroup *sync.WaitGroup + bInit bool recoverCount int8 bUnOnRun bool @@ -63,7 +62,6 @@ type BaseModule struct { func (slf *BaseModule) GetRoot() IModule { currentOwner := slf.GetSelf() - for { owner := currentOwner.GetOwner() if owner == currentOwner { @@ -73,10 +71,6 @@ func (slf *BaseModule) GetRoot() IModule { } } -func (slf *BaseModule) getLocker() *sync.Mutex { - return slf.rwModuleLocker -} - func (slf *BaseModule) SetModuleId(moduleId uint32) { slf.moduleId = moduleId } @@ -86,90 +80,79 @@ func (slf *BaseModule) GetModuleId() uint32 { } func (slf *BaseModule) GetModuleById(moduleId uint32) IModule { - locker := slf.GetRoot().getBaseModule().getLocker() - locker.Lock() - + slf.moduleLocker.RLock() ret, ok := slf.mapModule[moduleId] + slf.moduleLocker.RUnlock() if ok == false { - - locker.Unlock() return nil } - locker.Unlock() return ret } func (slf *BaseModule) GetModuleCount() int { - locker := slf.GetRoot().getBaseModule().getLocker() - locker.Lock() - defer locker.Unlock() - - return len(slf.mapModule) + slf.moduleLocker.RLock() + moduleCount := len(slf.mapModule) + slf.moduleLocker.RUnlock() + return moduleCount } func (slf *BaseModule) genModuleId() uint32 { - slf.CurrMaxModuleId = slf.CurrMaxModuleId + 1 - moduleId := slf.CurrMaxModuleId + slf.CurrMaxModuleId++ - return moduleId + return slf.CurrMaxModuleId } -func (slf *BaseModule) deleteModule(moduleId uint32) bool { - module, ok := slf.mapModule[moduleId] - if ok == false { - GetLogger().Printf(LEVER_WARN, "RemoveModule fail %d...", moduleId) - return false +func (slf *BaseModule) deleteModule(baseModule *BaseModule) bool { + for _, subModule := range baseModule.mapModule { + baseModule.deleteModule(subModule.getBaseModule()) } - //协程退出 - atomic.AddInt32(&module.getBaseModule().corouterstatus, 1) - module.getBaseModule().ownerService = nil - module.getBaseModule().mapModule = nil - module.getBaseModule().ownerModule = nil - module.getBaseModule().selfModule = nil + atomic.AddInt32(&baseModule.corouterstatus, 1) + //fmt.Printf("Delete %T->%T\n", slf.GetSelf(), baseModule.GetSelf()) + baseModule.ownerService = nil + baseModule.mapModule = nil + baseModule.ownerModule = nil + baseModule.selfModule = nil - delete(slf.mapModule, moduleId) + delete(slf.mapModule, baseModule.GetModuleId()) + baseModule.moduleLocker.Unlock() return true } -func (slf *BaseModule) releaseModule(moduleId uint32) bool { +func (slf *BaseModule) LockTree(rootModule *BaseModule) { + rootModule.moduleLocker.Lock() + //fmt.Printf("Lock %T\n", rootModule.GetSelf()) + + for _, pModule := range rootModule.mapModule { + slf.LockTree(pModule.getBaseModule()) + //pModule.getBaseModule().moduleLocker.Lock() + } +} + +func (slf *BaseModule) UnLockTree(rootModule *BaseModule) { + for _, pModule := range rootModule.mapModule { + pModule.getBaseModule().moduleLocker.Unlock() + } + rootModule.moduleLocker.Unlock() +} + +func (slf *BaseModule) ReleaseModule(moduleId uint32) bool { + slf.moduleLocker.Lock() + module, ok := slf.mapModule[moduleId] if ok == false { + slf.moduleLocker.Unlock() GetLogger().Printf(LEVER_FATAL, "RemoveModule fail %d...", moduleId) return false } - for submoduleId, _ := range module.getBaseModule().mapModule { - module.getBaseModule().releaseModule(submoduleId) - } + //锁住被结点树 + slf.LockTree(module.getBaseModule()) + slf.deleteModule(module.getBaseModule()) - slf.deleteModule(moduleId) - - return true -} - -func (slf *BaseModule) ReleaseModule(moduleId uint32) bool { - pRoot := slf.GetRoot() - if pRoot == nil { - return false - } - - baseModule := pRoot.getBaseModule() - if baseModule == nil { - return false - } - - //locker := slf.GetRoot().getBaseModule().getLocker() - locker := baseModule.getLocker() - if locker == nil { - return false - } - - locker.Lock() - slf.releaseModule(moduleId) - locker.Unlock() + slf.moduleLocker.Unlock() return true } @@ -206,11 +189,8 @@ func (slf *BaseModule) AddModule(module IModule) uint32 { return 0 } - locker := slf.GetRoot().getBaseModule().getLocker() - locker.Lock() - defer locker.Unlock() - //如果没有设置,自动生成ModuleId + slf.moduleLocker.Lock() var genid uint32 if module.GetModuleId() == 0 { genid = slf.genModuleId() @@ -236,22 +216,31 @@ func (slf *BaseModule) AddModule(module IModule) uint32 { } _, ok := slf.mapModule[module.GetModuleId()] if ok == true { + slf.moduleLocker.Unlock() GetLogger().Printf(LEVER_ERROR, "check mapModule %#v id is %d ,%d is fail...", module, module.GetModuleId(), genid) return 0 } slf.mapModule[module.GetModuleId()] = module + slf.moduleLocker.Unlock() + //运行模块 GetLogger().Printf(LEVER_INFO, "Start Init module %T.", module) err := module.OnInit() if err != nil { + delete(slf.mapModule, module.GetModuleId()) GetLogger().Printf(LEVER_ERROR, "End Init module %T id is %d is fail,reason:%v...", module, module.GetModuleId(), err) - os.Exit(-1) + return 0 + } + initErr := module.getBaseModule().OnInit() + if initErr != nil { + delete(slf.mapModule, module.GetModuleId()) + GetLogger().Printf(LEVER_ERROR, "OnInit module %T id is %d is fail,reason:%v...", module, module.GetModuleId(), initErr) + return 0 } - module.getBaseModule().OnInit() - GetLogger().Printf(LEVER_INFO, "End Init module %T.", module) + GetLogger().Printf(LEVER_INFO, "End Init module %T.", module) if module.getUnOnRun() == false { go module.RunModule(module) } @@ -337,7 +326,6 @@ func (slf *BaseModule) RunModule(module IModule) { slf.WaitGroup.Add(1) defer slf.WaitGroup.Done() for { - if atomic.LoadInt32(&slf.corouterstatus) != 0 { module.OnEndRun() GetLogger().Printf(LEVER_INFO, "OnEndRun module %T ...", module) @@ -346,7 +334,6 @@ func (slf *BaseModule) RunModule(module IModule) { //每500ms检查退出 if timer.CheckTimeOut() { - select { case <-slf.ExitChan: module.OnEndRun() @@ -361,7 +348,6 @@ func (slf *BaseModule) RunModule(module IModule) { GetLogger().Printf(LEVER_INFO, "OnEndRun module %T...", module) return } - } } diff --git a/service/Service.go b/service/Service.go index f08791d..30a3adb 100644 --- a/service/Service.go +++ b/service/Service.go @@ -2,7 +2,6 @@ package service import ( "fmt" - "sync" "reflect" "strings" @@ -81,7 +80,6 @@ func (slf *BaseService) Init(iservice IService) error { } slf.serviceid = InstanceServiceMgr().GenServiceID() - slf.BaseModule.rwModuleLocker = &sync.Mutex{} return nil }