| // Copyright 2016 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| //go:build dragonfly || freebsd || netbsd | |
| package os | |
| import ( | |
| "runtime" | |
| "syscall" | |
| ) | |
| // blockUntilWaitable attempts to block until a call to p.Wait will | |
| // succeed immediately, and reports whether it has done so. | |
| // It does not actually call p.Wait. | |
| func (p *Process) blockUntilWaitable() (bool, error) { | |
| var errno syscall.Errno | |
| for { | |
| _, errno = wait6(_P_PID, p.Pid, syscall.WEXITED|syscall.WNOWAIT) | |
| if errno != syscall.EINTR { | |
| break | |
| } | |
| } | |
| runtime.KeepAlive(p) | |
| if errno == syscall.ENOSYS { | |
| return false, nil | |
| } else if errno != 0 { | |
| return false, NewSyscallError("wait6", errno) | |
| } | |
| return true, nil | |
| } |