]> Cypherpunks repositories - gostls13.git/commitdiff
os: use waitid to avoid wait/kill race on darwin
authorMikio Hara <mikioh.mikioh@gmail.com>
Sat, 11 Jun 2016 10:36:17 +0000 (19:36 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Mon, 13 Jun 2016 22:13:12 +0000 (22:13 +0000)
This change is a followup to https://go-review.googlesource.com/23967
for Darwin.

Updates #13987.
Updates #16028.

Change-Id: Ib1fb9f957fafd0f91da6fceea56620e29ad82b00
Reviewed-on: https://go-review.googlesource.com/24020
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/os/wait_unimp.go
src/os/wait_waitid.go [moved from src/os/wait_linux.go with 71% similarity]

index 802b032c6ebc580e54561e4327c4597c2bbf2ac3..254bf7ec177c7606a356f0a89de7b744920a53ec 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd nacl netbsd openbsd solaris
+// +build dragonfly freebsd nacl netbsd openbsd solaris
 
 package os
 
similarity index 71%
rename from src/os/wait_linux.go
rename to src/os/wait_waitid.go
index 7707539630988b63f32e2ddfd3f017690e5ad8d5..5dbd7f97662989d8b977277da4bc92daf80aa4e2 100644 (file)
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// +build darwin linux
+
 package os
 
 import (
@@ -16,8 +18,11 @@ const _P_PID = 1
 // succeed immediately, and returns whether it has done so.
 // It does not actually call p.Wait.
 func (p *Process) blockUntilWaitable() (bool, error) {
-       // waitid expects a pointer to a siginfo_t, which is 128 bytes
-       // on all systems. We don't care about the values it returns.
+       // The waitid system call expects a pointer to a siginfo_t,
+       // which is 128 bytes on all GNU/Linux systems.
+       // On Darwin, it requires greater than or equal to 64 bytes
+       // for darwin/{386,arm} and 104 bytes for darwin/amd64.
+       // We don't care about the values it returns.
        var siginfo [128]byte
        psig := &siginfo[0]
        _, _, e := syscall.Syscall6(syscall.SYS_WAITID, _P_PID, uintptr(p.Pid), uintptr(unsafe.Pointer(psig)), syscall.WEXITED|syscall.WNOWAIT, 0, 0)