[release-branch.go1.24] runtime: use WCLONE when waiting on pidfd test child

As of CL 650835, the pidfd test child no longer sends SIGCHLD on exit.
Per clone(2), "If [the child termination] signal is specified as
anything other than SIGCHLD, then the parent process must specify the
__WALL or __WCLONE options when waiting for the child with wait(2)."

Align with this requirement.

For #71849.
For #71828.

Change-Id: I6a6a636c739e4a59abe1533fe429a433e8588939
Reviewed-on: https://go-review.googlesource.com/c/go/+/651415
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Auto-Submit: Michael Pratt <mpratt@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
(cherry picked from commit e1e65ae3ee)
Reviewed-on: https://go-review.googlesource.com/c/go/+/651476
This commit is contained in:
Michael Pratt 2025-02-21 10:29:09 -05:00
parent d418e224ae
commit becc17ebcd
1 changed files with 7 additions and 2 deletions

View File

@ -779,7 +779,12 @@ func os_checkClonePidfd() error {
var err error var err error
for { for {
var status WaitStatus var status WaitStatus
_, err = Wait4(int(pid), &status, 0, nil) // WCLONE is an untyped constant that sets bit 31, so
// it cannot convert directly to int on 32-bit
// GOARCHes. We must convert through another type
// first.
flags := uint(WCLONE)
_, err = Wait4(int(pid), &status, int(flags), nil)
if err != EINTR { if err != EINTR {
break break
} }
@ -797,7 +802,7 @@ func os_checkClonePidfd() error {
for { for {
const _P_PIDFD = 3 const _P_PIDFD = 3
_, _, errno = Syscall6(SYS_WAITID, _P_PIDFD, uintptr(pidfd), 0, WEXITED, 0, 0) _, _, errno = Syscall6(SYS_WAITID, _P_PIDFD, uintptr(pidfd), 0, WEXITED | WCLONE, 0, 0)
if errno != EINTR { if errno != EINTR {
break break
} }