Add 5ms sleep on Windows 7/8 in (*Process).Wait
This commit is contained in:
@@ -44,6 +44,17 @@ func (p *Process) wait() (ps *ProcessState, err error) {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
return nil, NewSyscallError("GetProcessTimes", e)
|
return nil, NewSyscallError("GetProcessTimes", e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE(brainman): It seems that sometimes process is not dead
|
||||||
|
// when WaitForSingleObject returns. But we do not know any
|
||||||
|
// other way to wait for it. Sleeping for a while seems to do
|
||||||
|
// the trick sometimes.
|
||||||
|
// See https://golang.org/issue/25965 for details.
|
||||||
|
_, isWin10AndAbove := syscall.WindowsVersion()
|
||||||
|
if !isWin10AndAbove {
|
||||||
|
defer time.Sleep(5 * time.Millisecond)
|
||||||
|
}
|
||||||
|
|
||||||
defer p.Release()
|
defer p.Release()
|
||||||
return &ProcessState{p.Pid, syscall.WaitStatus{ExitCode: ec}, &u}, nil
|
return &ProcessState{p.Pid, syscall.WaitStatus{ExitCode: ec}, &u}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -253,6 +253,16 @@ type SysProcAttr struct {
|
|||||||
var zeroProcAttr ProcAttr
|
var zeroProcAttr ProcAttr
|
||||||
var zeroSysProcAttr SysProcAttr
|
var zeroSysProcAttr SysProcAttr
|
||||||
|
|
||||||
|
// WindowsVersion returns whether the OS is Windows 7 (or earlier) and Windows 10 (or later)
|
||||||
|
func WindowsVersion() (isWin7, isWin10AndAbove bool) {
|
||||||
|
info := _OSVERSIONINFOW{}
|
||||||
|
info.osVersionInfoSize = uint32(unsafe.Sizeof(info))
|
||||||
|
rtlGetVersion(&info)
|
||||||
|
isWin7 = info.majorVersion < 6 || (info.majorVersion == 6 && info.minorVersion <= 1)
|
||||||
|
isWin10AndAbove = info.majorVersion >= 10
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle uintptr, err error) {
|
func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle uintptr, err error) {
|
||||||
if len(argv0) == 0 {
|
if len(argv0) == 0 {
|
||||||
return 0, 0, EWINDOWS
|
return 0, 0, EWINDOWS
|
||||||
@@ -316,10 +326,8 @@ func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info := _OSVERSIONINFOW{}
|
isWin7, _ := WindowsVersion()
|
||||||
info.osVersionInfoSize = uint32(unsafe.Sizeof(info))
|
|
||||||
rtlGetVersion(&info)
|
|
||||||
isWin7 := info.majorVersion < 6 || (info.majorVersion == 6 && info.minorVersion <= 1)
|
|
||||||
// NT kernel handles are divisible by 4, with the bottom 3 bits left as
|
// NT kernel handles are divisible by 4, with the bottom 3 bits left as
|
||||||
// a tag. The fully set tag correlates with the types of handles we're
|
// a tag. The fully set tag correlates with the types of handles we're
|
||||||
// concerned about here. Except, the kernel will interpret some
|
// concerned about here. Except, the kernel will interpret some
|
||||||
|
|||||||
Reference in New Issue
Block a user