Merge pull request #349 from LK4D4/replace_wait_for_wait4

Use Wait4 instead of cmd.Wait
This commit is contained in:
Michael Crosby 2015-01-26 13:07:54 -08:00
commit e05f807a89
1 changed files with 17 additions and 7 deletions

View File

@ -51,10 +51,20 @@ func Exec(container *libcontainer.Config, stdin io.Reader, stdout, stderr io.Wri
} }
child.Close() child.Close()
wait := func() (*os.ProcessState, error) {
ps, err := command.Process.Wait()
// we should kill all processes in cgroup when init is died if we use
// host PID namespace
if !container.Namespaces.Contains(libcontainer.NEWPID) {
killAllPids(container)
}
return ps, err
}
terminate := func(terr error) (int, error) { terminate := func(terr error) (int, error) {
// TODO: log the errors for kill and wait // TODO: log the errors for kill and wait
command.Process.Kill() command.Process.Kill()
command.Wait() wait()
return -1, terr return -1, terr
} }
@ -94,7 +104,7 @@ func Exec(container *libcontainer.Config, stdin io.Reader, stdout, stderr io.Wri
output, err := setupCmd.CombinedOutput() output, err := setupCmd.CombinedOutput()
if err != nil || setupCmd.ProcessState.Sys().(syscall.WaitStatus).ExitStatus() != 0 { if err != nil || setupCmd.ProcessState.Sys().(syscall.WaitStatus).ExitStatus() != 0 {
command.Process.Kill() command.Process.Kill()
command.Wait() wait()
return -1, fmt.Errorf("setup failed: %s %s", err, output) return -1, fmt.Errorf("setup failed: %s %s", err, output)
} }
} }
@ -122,16 +132,16 @@ func Exec(container *libcontainer.Config, stdin io.Reader, stdout, stderr io.Wri
startCallback() startCallback()
} }
if err := command.Wait(); err != nil { ps, err := wait()
if err != nil {
if _, ok := err.(*exec.ExitError); !ok { if _, ok := err.(*exec.ExitError); !ok {
return -1, err return -1, err
} }
} }
if !container.Namespaces.Contains(libcontainer.NEWPID) { // waiting for pipe flushing
killAllPids(container) command.Wait()
}
waitStatus := command.ProcessState.Sys().(syscall.WaitStatus) waitStatus := ps.Sys().(syscall.WaitStatus)
if waitStatus.Signaled() { if waitStatus.Signaled() {
return EXIT_SIGNAL_OFFSET + int(waitStatus.Signal()), nil return EXIT_SIGNAL_OFFSET + int(waitStatus.Signal()), nil
} }