// AddProcWatcher will add a watcher on proc. func (watcher *Watcher) AddProcWatcher(proc *process.Proc) { watcher.Lock() defer watcher.Unlock() if _, ok := watcher.watchProcs[proc.Name]; ok { log.Warnf("A watcher for this process already exists.") return } procWatcher := &ProcWatcher{ procStatus: make(chan *ProcStatus, 1), proc: proc, stopWatcher: make(chan bool, 1), } watcher.watchProcs[proc.Name] = procWatcher go func() { log.Infof("Starting watcher on proc %s", proc.Name) state, err := proc.Watch() procWatcher.procStatus <- &ProcStatus{ state: state, err: err, } }() go func() { defer delete(watcher.watchProcs, procWatcher.proc.Name) select { case procStatus := <-procWatcher.procStatus: log.Infof("Proc %s is dead, advising master...", procWatcher.proc.Name) log.Infof("State is %s", procStatus.state.String()) watcher.restartProc <- procWatcher.proc break case <-procWatcher.stopWatcher: break } }() }