summaryrefslogtreecommitdiff
path: root/libgo/go/os/exec_unix.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/os/exec_unix.go')
-rw-r--r--libgo/go/os/exec_unix.go18
1 files changed, 18 insertions, 0 deletions
diff --git a/libgo/go/os/exec_unix.go b/libgo/go/os/exec_unix.go
index ed97f85e22..c4999db57f 100644
--- a/libgo/go/os/exec_unix.go
+++ b/libgo/go/os/exec_unix.go
@@ -17,6 +17,22 @@ func (p *Process) wait() (ps *ProcessState, err error) {
if p.Pid == -1 {
return nil, syscall.EINVAL
}
+
+ // If we can block until Wait4 will succeed immediately, do so.
+ ready, err := p.blockUntilWaitable()
+ if err != nil {
+ return nil, err
+ }
+ if ready {
+ // Mark the process done now, before the call to Wait4,
+ // so that Process.signal will not send a signal.
+ p.setDone()
+ // Acquire a write lock on sigMu to wait for any
+ // active call to the signal method to complete.
+ p.sigMu.Lock()
+ p.sigMu.Unlock()
+ }
+
var status syscall.WaitStatus
var rusage syscall.Rusage
pid1, e := syscall.Wait4(p.Pid, &status, 0, &rusage)
@@ -43,6 +59,8 @@ func (p *Process) signal(sig Signal) error {
if p.Pid == 0 {
return errors.New("os: process not initialized")
}
+ p.sigMu.RLock()
+ defer p.sigMu.RUnlock()
if p.done() {
return errFinished
}