)]}'
{
  "commit": "5b52f7ddb32683dd955f46b19e26e747dbfa1472",
  "tree": "1071da97491fd7db9e55487d545018be92fe3384",
  "parents": [
    "7145327c9ad89fd089c2be31e04156dbf0a4472f",
    "a401851cfc985171de7617ae6b1b7e4998f80ccd"
  ],
  "author": {
    "name": "Jonathan Brouwer",
    "email": "jonathantbrouwer@gmail.com",
    "time": "Sun Aug 16 22:46:21 2026 +0200"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Sun Aug 16 22:46:21 2026 +0200"
  },
  "message": "Rollup merge of #159855 - valentynkit:pidfd-wait-eintr, r\u003dMark-Simulacrum\n\nstd: retry waitid on EINTR in the pidfd wait path\n\nThe pidfd-backed `Child::wait()` and `try_wait()` share a `waitid` helper that calls `waitid` through plain `cvt`, so an `EINTR` reaches the caller as `ErrorKind::Interrupted`. The legacy `waitpid` path that the pidfd path stands in for retries instead: `wait()` there uses `cvt_r`. So a child spawned with a pidfd can see `Interrupted` from `wait()` where the same call without one wouldn\u0027t.\n\nBoth callers go through the one helper, so this wraps the `waitid` call in `cvt_r` to match the legacy `wait()`:\n\n```rust\nlet r \u003d cvt_r(|| unsafe {\n    libc::waitid(libc::P_PIDFD, self.0.as_raw_fd() as u32, \u0026mut siginfo, options)\n});\n```\n\nFor the blocking `wait()` that\u0027s the fix. `try_wait()` passes `WNOHANG`, and `waitid` only returns `EINTR` when it isn\u0027t set, from\n[`wait(2)`](https://www.man7.org/linux/man-pages/man2/wait.2.html#ERRORS):\n\u003e EINTR  WNOHANG was not set and an unblocked signal or a SIGCHLD was caught; see signal(7).\n\nI didn\u0027t add a test, since landing an `EINTR` in the wait window needs a signal to arrive at the right moment and isn\u0027t practical to reproduce.\n\nr? libs\n",
  "tree_diff": []
}
