in lambda/supervisor/local_supervisor.go [237:278]
func (s *LocalSupervisor) Stop(ctx context.Context, req *model.StopRequest) (*model.StopResponse, error) {
if req.Domain != "runtime" {
log.Debug("Shutdown is no op if domain != runtime")
return &model.StopResponse{}, nil
}
// shut down kills all the processes in the map
s.processMapLock.Lock()
defer s.processMapLock.Unlock()
nprocs := len(s.processMap)
successes := make(chan struct{})
errors := make(chan error)
for name, proc := range s.processMap {
go func(n string, p process) {
log.Debugf("Killing %s", n)
err := kill(p, n, req.Deadline)
if err != nil {
errors <- err
} else {
successes <- struct{}{}
}
}(name, proc)
}
var err error
for i := 0; i < nprocs; i++ {
select {
case <-successes:
case e := <-errors:
if err == nil {
err = fmt.Errorf("shutdown failed: %s", e.Error())
}
}
}
s.processMap = make(map[string]process)
return nil, err
}