diff --git a/src/os/exec.go b/src/os/exec.go index 2da573426b..1588c91f39 100644 --- a/src/os/exec.go +++ b/src/os/exec.go @@ -62,6 +62,9 @@ func StartProcess(name string, argv []string, attr *ProcAttr) (*Process, error) } func (p *Process) Wait() (*ProcessState, error) { + if p.Pid == -1 { + return nil, syscall.EINVAL + } return nil, ErrNotImplemented } @@ -73,6 +76,13 @@ func (p *Process) Signal(sig Signal) error { return ErrNotImplemented } +// Release releases any resources associated with the Process p, +// rendering it unusable in the future. +// Release only needs to be called if Wait is not. +func (p *Process) Release() error { + return p.release() +} + // Keep compatibility with golang and always succeed and return new proc with pid on Linux. func FindProcess(pid int) (*Process, error) { return findProcess(pid) diff --git a/src/os/exec_posix.go b/src/os/exec_posix.go index 84843a2813..0a968d9a10 100644 --- a/src/os/exec_posix.go +++ b/src/os/exec_posix.go @@ -7,6 +7,7 @@ package os import ( + "runtime" "syscall" ) @@ -24,3 +25,11 @@ var ( func findProcess(pid int) (*Process, error) { return &Process{Pid: pid}, nil } + +func (p *Process) release() error { + // NOOP for unix. + p.Pid = -1 + // no need for a finalizer anymore + runtime.SetFinalizer(p, nil) + return nil +}