diff --git a/services/service.go b/services/service.go index 4a4040f..d126642 100644 --- a/services/service.go +++ b/services/service.go @@ -4,6 +4,7 @@ import ( "fmt" logger "log" "runtime/debug" + "sync" ) type Service interface { @@ -17,31 +18,31 @@ type ServiceItem struct { Log *logger.Logger } -var servicesMap = map[string]*ServiceItem{} +var servicesMap = sync.Map{} func Regist(name string, s Service, args interface{}, log *logger.Logger) { Stop(name) - servicesMap[name] = &ServiceItem{ + servicesMap.Store(name, &ServiceItem{ S: s, Args: args, Name: name, Log: log, - } + }) } func GetService(name string) *ServiceItem { - if s, ok := servicesMap[name]; ok && s.S != nil { - return s + if s, ok := servicesMap.Load(name); ok && s.(*ServiceItem).S != nil { + return s.(*ServiceItem) } return nil } func Stop(name string) { - if s, ok := servicesMap[name]; ok && s.S != nil { - s.S.Clean() + if s, ok := servicesMap.Load(name); ok && s.(*ServiceItem).S != nil { + s.(*ServiceItem).S.Clean() } } func Run(name string, args interface{}) (service *ServiceItem, err error) { - service, ok := servicesMap[name] + _service, ok := servicesMap.Load(name) if ok { defer func() { e := recover() @@ -49,6 +50,7 @@ func Run(name string, args interface{}) (service *ServiceItem, err error) { err = fmt.Errorf("%s servcie crashed, ERR: %s\ntrace:%s", name, e, string(debug.Stack())) } }() + service = _service.(*ServiceItem) if args != nil { err = service.S.Start(args, service.Log) } else {