Move runtime.Start to be non blocking
This commit is contained in:
parent
9f880a1215
commit
c52651c4d0
@ -147,6 +147,48 @@ func (s *service) Wait() {
|
|||||||
s.running = false
|
s.running = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *runtime) run() {
|
||||||
|
r.RLock()
|
||||||
|
closed := r.closed
|
||||||
|
r.RUnlock()
|
||||||
|
|
||||||
|
t := time.NewTicker(time.Second * 5)
|
||||||
|
defer t.Stop()
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-t.C:
|
||||||
|
// check running services
|
||||||
|
r.RLock()
|
||||||
|
for _, service := range r.services {
|
||||||
|
if service.Running() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: check service error
|
||||||
|
log.Debugf("Runtime starting %s", service.Name)
|
||||||
|
if err := service.Start(); err != nil {
|
||||||
|
log.Debugf("Runtime error starting %s: %v", service.Name, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
r.RUnlock()
|
||||||
|
case service := <-r.start:
|
||||||
|
if service.Running() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: check service error
|
||||||
|
log.Debugf("Starting %s", service.Name)
|
||||||
|
if err := service.Start(); err != nil {
|
||||||
|
log.Debugf("Runtime error starting %s: %v", service.Name, err)
|
||||||
|
}
|
||||||
|
case <-closed:
|
||||||
|
// TODO: stop all the things
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (r *runtime) Create(s *Service) error {
|
func (r *runtime) Create(s *Service) error {
|
||||||
r.Lock()
|
r.Lock()
|
||||||
defer r.Unlock()
|
defer r.Unlock()
|
||||||
@ -178,55 +220,18 @@ func (r *runtime) Delete(s *Service) error {
|
|||||||
|
|
||||||
func (r *runtime) Start() error {
|
func (r *runtime) Start() error {
|
||||||
r.Lock()
|
r.Lock()
|
||||||
|
defer r.Unlock()
|
||||||
|
|
||||||
// already running
|
// already running
|
||||||
if r.running {
|
if r.running {
|
||||||
r.Unlock()
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// set running
|
// set running
|
||||||
r.running = true
|
r.running = true
|
||||||
r.closed = make(chan bool)
|
r.closed = make(chan bool)
|
||||||
closed := r.closed
|
|
||||||
|
|
||||||
r.Unlock()
|
go r.run()
|
||||||
|
|
||||||
t := time.NewTicker(time.Second * 5)
|
|
||||||
defer t.Stop()
|
|
||||||
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-t.C:
|
|
||||||
// check running services
|
|
||||||
r.RLock()
|
|
||||||
for _, service := range r.services {
|
|
||||||
if service.Running() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: check service error
|
|
||||||
log.Debugf("Starting %s", service.Name)
|
|
||||||
if err := service.Start(); err != nil {
|
|
||||||
log.Debugf("Error starting %s: %v", service.Name, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
r.RUnlock()
|
|
||||||
case service := <-r.start:
|
|
||||||
if service.Running() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: check service error
|
|
||||||
log.Debugf("Starting %s", service.Name)
|
|
||||||
if err := service.Start(); err != nil {
|
|
||||||
log.Debugf("Error starting %s: %v", service.Name, err)
|
|
||||||
}
|
|
||||||
case <-closed:
|
|
||||||
// TODO: stop all the things
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -250,6 +255,7 @@ func (r *runtime) Stop() error {
|
|||||||
|
|
||||||
// stop all the services
|
// stop all the services
|
||||||
for _, service := range r.services {
|
for _, service := range r.services {
|
||||||
|
log.Debugf("Runtime stopping %s", service.Name)
|
||||||
service.Stop()
|
service.Stop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user