// Signal sends the given signal to the given service. func (instance *Execution) Signal(target *service.Service, what values.Signal) error { instance.doRLock() execution, ok := instance.executions[target] if !ok { instance.doRUnlock() return service.AlreadyStoppedError{Name: target.Name()} } instance.doRUnlock() return execution.Signal(what) }
// Kill kills the given service. func (instance *Execution) Kill(target *service.Service) error { instance.doRLock() execution, ok := instance.executions[target] if !ok { instance.doRUnlock() return service.AlreadyStoppedError{Name: target.Name()} } instance.doRUnlock() instance.registerStopRequestsFor(execution) return execution.Kill() }
func (instance *Execution) createAndRegisterNotExistingExecutionFor(target *service.Service) (*service.Execution, error) { instance.doWLock() defer instance.doWUnlock() result, err := target.NewExecution(instance.executable.KeyStore()) if err != nil { return nil, err } if _, ok := instance.executions[target]; ok { return nil, service.AlreadyRunningError{Name: target.Name()} } instance.executions[target] = result return result, nil }
// Restart stops and restarts the given service. func (instance *Execution) Restart(target *service.Service) error { instance.doRLock() if stopRequested, ok := instance.stopRequests[target]; ok && stopRequested { instance.doRUnlock() return service.AlreadyStoppedError{Name: target.Name()} } execution, ok := instance.executions[target] if !ok { instance.doRUnlock() return instance.Start(target) } instance.restartRequests[target] = true instance.doRUnlock() execution.Stop() return nil }