[libc-commits] [libc] [libc] Implement waitid in sys/wait (PR #227815)
Aman Maurya via libc-commits
libc-commits at lists.llvm.org
Fri Oct 9 04:34:33 PDT 2026
https://github.com/amanmaurya92 updated https://github.com/llvm/llvm-project/pull/227815
>From afc38e6a596a9a222cb099e8a39a6e122080a0f0 Mon Sep 17 00:00:00 2001
From: amanmaurya92 <amanmaurya9209 at gmail.com>
Date: Wed, 30 Sep 2026 23:38:47 +0530
Subject: [PATCH 1/3] [libc][sys] Implement waitid in sys/wait
Assisted by Antigravity and reviewed by Aman Maurya
---
libc/config/linux/aarch64/entrypoints.txt | 1 +
libc/config/linux/riscv/entrypoints.txt | 1 +
libc/config/linux/x86_64/entrypoints.txt | 1 +
libc/hdr/types/CMakeLists.txt | 9 ++++
libc/hdr/types/idtype_t.h | 27 ++++++++++++
libc/include/CMakeLists.txt | 2 +
.../llvm-libc-macros/linux/sys-wait-macros.h | 19 ++++++++
libc/include/llvm-libc-types/CMakeLists.txt | 1 +
libc/include/llvm-libc-types/idtype_t.h | 40 +++++++++++++++++
libc/include/sys/wait.yaml | 11 +++++
.../linux/syscall_wrappers/CMakeLists.txt | 16 +++++++
.../OSUtil/linux/syscall_wrappers/waitid.h | 42 ++++++++++++++++++
libc/src/sys/wait/CMakeLists.txt | 7 +++
libc/src/sys/wait/linux/CMakeLists.txt | 16 +++++++
libc/src/sys/wait/linux/waitid.cpp | 36 +++++++++++++++
libc/src/sys/wait/waitid.h | 28 ++++++++++++
.../integration/src/unistd/CMakeLists.txt | 1 +
.../test/integration/src/unistd/fork_test.cpp | 35 +++++++++++++++
libc/test/src/sys/wait/CMakeLists.txt | 14 ++++++
libc/test/src/sys/wait/waitid_test.cpp | 44 +++++++++++++++++++
20 files changed, 351 insertions(+)
create mode 100644 libc/hdr/types/idtype_t.h
create mode 100644 libc/include/llvm-libc-types/idtype_t.h
create mode 100644 libc/src/__support/OSUtil/linux/syscall_wrappers/waitid.h
create mode 100644 libc/src/sys/wait/linux/waitid.cpp
create mode 100644 libc/src/sys/wait/waitid.h
create mode 100644 libc/test/src/sys/wait/waitid_test.cpp
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index 9bb9407a7624b4..8b1c6fc30076dd 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -398,6 +398,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# sys/wait.h entrypoints
libc.src.sys.wait.wait
libc.src.sys.wait.wait4
+ libc.src.sys.wait.waitid
libc.src.sys.wait.waitpid
# sys/xattr.h entrypoints
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index 475c6bbd5fbac5..b8b8b9000dfd3c 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -433,6 +433,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# sys/wait.h entrypoints
libc.src.sys.wait.wait
libc.src.sys.wait.wait4
+ libc.src.sys.wait.waitid
libc.src.sys.wait.waitpid
# sys/prctl.h entrypoints
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 1007ba4775cd7c..7ebdc0659f1cb5 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -437,6 +437,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# sys/wait.h entrypoints
libc.src.sys.wait.wait
libc.src.sys.wait.wait4
+ libc.src.sys.wait.waitid
libc.src.sys.wait.waitpid
# sys/xattr.h entrypoints
diff --git a/libc/hdr/types/CMakeLists.txt b/libc/hdr/types/CMakeLists.txt
index 505c2d9fa65794..d11f28236dd8f7 100644
--- a/libc/hdr/types/CMakeLists.txt
+++ b/libc/hdr/types/CMakeLists.txt
@@ -1415,3 +1415,12 @@ add_proxy_header_library(
FULL_BUILD_DEPENDS
libc.include.llvm-libc-types.id_t
)
+
+add_proxy_header_library(
+ idtype_t
+ HDRS
+ idtype_t.h
+ FULL_BUILD_DEPENDS
+ libc.include.llvm-libc-types.idtype_t
+)
+
diff --git a/libc/hdr/types/idtype_t.h b/libc/hdr/types/idtype_t.h
new file mode 100644
index 00000000000000..35f9165c28b0c8
--- /dev/null
+++ b/libc/hdr/types/idtype_t.h
@@ -0,0 +1,27 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Proxy for idtype_t.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_HDR_TYPES_IDTYPE_T_H
+#define LLVM_LIBC_HDR_TYPES_IDTYPE_T_H
+
+#ifdef LIBC_FULL_BUILD
+
+#include "include/llvm-libc-types/idtype_t.h"
+
+#else // Overlay mode
+
+#include <sys/wait.h>
+
+#endif // LIBC_FULL_BUILD
+
+#endif // LLVM_LIBC_HDR_TYPES_IDTYPE_T_H
diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt
index 2fe1f92afc1d19..f2ba791ce57a34 100644
--- a/libc/include/CMakeLists.txt
+++ b/libc/include/CMakeLists.txt
@@ -1097,6 +1097,8 @@ add_header_macro(
.llvm-libc-types.pid_t
.llvm-libc-types.struct_rusage
.llvm-libc-types.siginfo_t
+ .llvm-libc-types.id_t
+ .llvm-libc-types.idtype_t
)
add_header_macro(
diff --git a/libc/include/llvm-libc-macros/linux/sys-wait-macros.h b/libc/include/llvm-libc-macros/linux/sys-wait-macros.h
index d01cfa71ba3906..5eaa94f5d7018a 100644
--- a/libc/include/llvm-libc-macros/linux/sys-wait-macros.h
+++ b/libc/include/llvm-libc-macros/linux/sys-wait-macros.h
@@ -11,6 +11,25 @@
#include <linux/wait.h>
+// <linux/wait.h> defines P_ALL, P_PID, P_PGID, P_PIDFD as numeric macros.
+// Undefine them so they do not collide with the idtype_t enum specified by
+// POSIX.
+#ifdef P_ALL
+#undef P_ALL
+#endif
+
+#ifdef P_PID
+#undef P_PID
+#endif
+
+#ifdef P_PGID
+#undef P_PGID
+#endif
+
+#ifdef P_PIDFD
+#undef P_PIDFD
+#endif
+
#define WCOREDUMP(status) ((status) & WCOREFLAG)
#define WEXITSTATUS(status) (((status) & 0xff00) >> 8)
#define WIFCONTINUED(status) ((status) == 0xffff)
diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt
index ea710ef48857cf..00a62c7d995a06 100644
--- a/libc/include/llvm-libc-types/CMakeLists.txt
+++ b/libc/include/llvm-libc-types/CMakeLists.txt
@@ -78,6 +78,7 @@ add_header(caddr_t HDR caddr_t.h)
add_header(dev_t HDR dev_t.h)
add_header(div_t HDR div_t.h)
add_header(id_t HDR id_t.h)
+add_header(idtype_t HDR idtype_t.h)
add_header(ino64_t HDR ino64_t.h)
add_header(u_int HDR u_int.h)
add_header(u_int16_t HDR u_int16_t.h)
diff --git a/libc/include/llvm-libc-types/idtype_t.h b/libc/include/llvm-libc-types/idtype_t.h
new file mode 100644
index 00000000000000..11aab766a06368
--- /dev/null
+++ b/libc/include/llvm-libc-types/idtype_t.h
@@ -0,0 +1,40 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Definition of idtype_t type.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_TYPES_IDTYPE_T_H
+#define LLVM_LIBC_TYPES_IDTYPE_T_H
+
+#ifdef P_ALL
+#undef P_ALL
+#endif
+
+#ifdef P_PID
+#undef P_PID
+#endif
+
+#ifdef P_PGID
+#undef P_PGID
+#endif
+
+#ifdef P_PIDFD
+#undef P_PIDFD
+#endif
+
+typedef enum {
+ P_ALL,
+ P_PID,
+ P_PGID,
+ P_PIDFD,
+} idtype_t;
+
+#endif // LLVM_LIBC_TYPES_IDTYPE_T_H
diff --git a/libc/include/sys/wait.yaml b/libc/include/sys/wait.yaml
index c5928cc1502a80..bf296381a337b1 100644
--- a/libc/include/sys/wait.yaml
+++ b/libc/include/sys/wait.yaml
@@ -8,6 +8,8 @@ types:
- type_name: siginfo_t
- type_name: struct_rusage
- type_name: pid_t
+ - type_name: id_t
+ - type_name: idtype_t
enums: []
objects: []
functions:
@@ -27,6 +29,15 @@ functions:
- type: int *
- type: int
- type: struct rusage *
+ - name: waitid
+ standards:
+ - posix
+ return_type: int
+ arguments:
+ - type: idtype_t
+ - type: id_t
+ - type: siginfo_t *
+ - type: int
- name: waitpid
standards:
- posix
diff --git a/libc/src/__support/OSUtil/linux/syscall_wrappers/CMakeLists.txt b/libc/src/__support/OSUtil/linux/syscall_wrappers/CMakeLists.txt
index 2a24b6b28cab0f..c4613ae71418ff 100644
--- a/libc/src/__support/OSUtil/linux/syscall_wrappers/CMakeLists.txt
+++ b/libc/src/__support/OSUtil/linux/syscall_wrappers/CMakeLists.txt
@@ -1350,6 +1350,22 @@ add_header_library(
libc.include.sys_syscall
)
+add_header_library(
+ waitid
+ HDRS
+ waitid.h
+ DEPENDS
+ libc.hdr.types.id_t
+ libc.hdr.types.idtype_t
+ libc.hdr.types.siginfo_t
+ libc.hdr.types.struct_rusage
+ libc.src.__support.OSUtil.osutil
+ libc.src.__support.common
+ libc.src.__support.error_or
+ libc.src.__support.macros.config
+ libc.include.sys_syscall
+)
+
add_header_library(
execve
HDRS
diff --git a/libc/src/__support/OSUtil/linux/syscall_wrappers/waitid.h b/libc/src/__support/OSUtil/linux/syscall_wrappers/waitid.h
new file mode 100644
index 00000000000000..9d279be7367264
--- /dev/null
+++ b/libc/src/__support/OSUtil/linux/syscall_wrappers/waitid.h
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Syscall wrapper for waitid.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_SYSCALL_WRAPPERS_WAITID_H
+#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_SYSCALL_WRAPPERS_WAITID_H
+
+#include "hdr/types/id_t.h"
+#include "hdr/types/idtype_t.h"
+#include "hdr/types/siginfo_t.h"
+#include "hdr/types/struct_rusage.h"
+#include "src/__support/OSUtil/linux/syscall.h" // For syscall_checked
+#include "src/__support/common.h"
+#include "src/__support/error_or.h"
+#include "src/__support/macros/config.h"
+#include <sys/syscall.h> // For syscall numbers
+
+namespace LIBC_NAMESPACE_DECL {
+namespace linux_syscalls {
+
+LIBC_INLINE ErrorOr<int> waitid(idtype_t idtype, id_t id, siginfo_t *infop,
+ int options, struct rusage *rusage = nullptr) {
+#ifdef SYS_waitid
+ return syscall_checked<int>(SYS_waitid, idtype, id, infop, options, rusage);
+#else
+#error "waitid syscall not available."
+#endif
+}
+
+} // namespace linux_syscalls
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_SYSCALL_WRAPPERS_WAITID_H
diff --git a/libc/src/sys/wait/CMakeLists.txt b/libc/src/sys/wait/CMakeLists.txt
index eb572b0618e33b..9dce3e5c2422fc 100644
--- a/libc/src/sys/wait/CMakeLists.txt
+++ b/libc/src/sys/wait/CMakeLists.txt
@@ -16,6 +16,13 @@ add_entrypoint_object(
.${LIBC_TARGET_OS}.wait4
)
+add_entrypoint_object(
+ waitid
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.waitid
+)
+
add_entrypoint_object(
waitpid
ALIAS
diff --git a/libc/src/sys/wait/linux/CMakeLists.txt b/libc/src/sys/wait/linux/CMakeLists.txt
index 90a98b8c6f4379..1799bf4b17ebb5 100644
--- a/libc/src/sys/wait/linux/CMakeLists.txt
+++ b/libc/src/sys/wait/linux/CMakeLists.txt
@@ -24,6 +24,22 @@ add_entrypoint_object(
libc.src.errno.errno
)
+add_entrypoint_object(
+ waitid
+ SRCS
+ waitid.cpp
+ HDRS
+ ../waitid.h
+ DEPENDS
+ libc.hdr.types.id_t
+ libc.hdr.types.idtype_t
+ libc.hdr.types.siginfo_t
+ libc.src.__support.OSUtil.linux.syscall_wrappers.waitid
+ libc.src.__support.common
+ libc.src.__support.macros.config
+ libc.src.errno.errno
+)
+
add_entrypoint_object(
waitpid
SRCS
diff --git a/libc/src/sys/wait/linux/waitid.cpp b/libc/src/sys/wait/linux/waitid.cpp
new file mode 100644
index 00000000000000..b04cfb1dfbd16f
--- /dev/null
+++ b/libc/src/sys/wait/linux/waitid.cpp
@@ -0,0 +1,36 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Linux implementation of waitid.
+///
+//===----------------------------------------------------------------------===//
+
+#include "src/sys/wait/waitid.h"
+
+#include "hdr/types/id_t.h"
+#include "hdr/types/idtype_t.h"
+#include "hdr/types/siginfo_t.h"
+#include "src/__support/OSUtil/linux/syscall_wrappers/waitid.h"
+#include "src/__support/common.h"
+#include "src/__support/libc_errno.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(int, waitid,
+ (idtype_t idtype, id_t id, siginfo_t *infop, int options)) {
+ auto result = linux_syscalls::waitid(idtype, id, infop, options, nullptr);
+ if (!result.has_value()) {
+ libc_errno = result.error();
+ return -1;
+ }
+ return 0;
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/sys/wait/waitid.h b/libc/src/sys/wait/waitid.h
new file mode 100644
index 00000000000000..3225b59c521d17
--- /dev/null
+++ b/libc/src/sys/wait/waitid.h
@@ -0,0 +1,28 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Implementation header for waitid.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_SYS_WAIT_WAITID_H
+#define LLVM_LIBC_SRC_SYS_WAIT_WAITID_H
+
+#include "hdr/types/id_t.h"
+#include "hdr/types/idtype_t.h"
+#include "hdr/types/siginfo_t.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_SYS_WAIT_WAITID_H
diff --git a/libc/test/integration/src/unistd/CMakeLists.txt b/libc/test/integration/src/unistd/CMakeLists.txt
index 6fe8f5126a05bf..069385a5325436 100644
--- a/libc/test/integration/src/unistd/CMakeLists.txt
+++ b/libc/test/integration/src/unistd/CMakeLists.txt
@@ -29,6 +29,7 @@ add_integration_test(
libc.src.signal.raise
libc.src.sys.wait.wait
libc.src.sys.wait.wait4
+ libc.src.sys.wait.waitid
libc.src.sys.wait.waitpid
libc.src.unistd.fork
libc.src.unistd.gettid
diff --git a/libc/test/integration/src/unistd/fork_test.cpp b/libc/test/integration/src/unistd/fork_test.cpp
index 7eeefa44778061..6936805ecb23a9 100644
--- a/libc/test/integration/src/unistd/fork_test.cpp
+++ b/libc/test/integration/src/unistd/fork_test.cpp
@@ -12,6 +12,7 @@
#include "src/stdlib/exit.h"
#include "src/sys/wait/wait.h"
#include "src/sys/wait/wait4.h"
+#include "src/sys/wait/waitid.h"
#include "src/sys/wait/waitpid.h"
#include "src/unistd/fork.h"
#include "src/unistd/gettid.h"
@@ -55,6 +56,22 @@ void fork_and_wait4_normal_exit() {
ASSERT_TRUE(WIFEXITED(status));
}
+void fork_and_waitid_normal_exit() {
+ pid_t pid = LIBC_NAMESPACE::fork();
+ if (pid == 0)
+ return; // Just end without any thing special.
+ ASSERT_TRUE(pid > 0);
+ siginfo_t info;
+ info.si_pid = 0;
+ info.si_status = 0;
+ int ret =
+ LIBC_NAMESPACE::waitid(P_PID, static_cast<id_t>(pid), &info, WEXITED);
+ ASSERT_EQ(ret, 0);
+ ASSERT_EQ(info.si_pid, pid);
+ ASSERT_EQ(info.si_code, CLD_EXITED);
+ ASSERT_EQ(info.si_status, 0);
+}
+
void fork_and_waitpid_normal_exit() {
pid_t pid = LIBC_NAMESPACE::fork();
if (pid == 0)
@@ -96,6 +113,22 @@ void fork_and_wait4_signal_exit() {
ASSERT_TRUE(WTERMSIG(status) == SIGUSR1);
}
+void fork_and_waitid_signal_exit() {
+ pid_t pid = LIBC_NAMESPACE::fork();
+ if (pid == 0)
+ LIBC_NAMESPACE::raise(SIGUSR1);
+ ASSERT_TRUE(pid > 0);
+ siginfo_t info;
+ info.si_pid = 0;
+ info.si_status = 0;
+ int ret =
+ LIBC_NAMESPACE::waitid(P_PID, static_cast<id_t>(pid), &info, WEXITED);
+ ASSERT_EQ(ret, 0);
+ ASSERT_EQ(info.si_pid, pid);
+ ASSERT_EQ(info.si_code, CLD_KILLED);
+ ASSERT_EQ(info.si_status, SIGUSR1);
+}
+
void fork_and_waitpid_signal_exit() {
pid_t pid = LIBC_NAMESPACE::fork();
if (pid == 0)
@@ -164,9 +197,11 @@ TEST_MAIN([[maybe_unused]] int argc, [[maybe_unused]] char **argv,
gettid_test();
fork_and_wait_normal_exit();
fork_and_wait4_normal_exit();
+ fork_and_waitid_normal_exit();
fork_and_waitpid_normal_exit();
fork_and_wait_signal_exit();
fork_and_wait4_signal_exit();
+ fork_and_waitid_signal_exit();
fork_and_waitpid_signal_exit();
fork_with_atfork_callbacks();
return 0;
diff --git a/libc/test/src/sys/wait/CMakeLists.txt b/libc/test/src/sys/wait/CMakeLists.txt
index 839fc8eac71908..8ed17fb7ec7ac7 100644
--- a/libc/test/src/sys/wait/CMakeLists.txt
+++ b/libc/test/src/sys/wait/CMakeLists.txt
@@ -27,3 +27,17 @@ add_libc_test(
libc.test.UnitTest.ErrnoCheckingTest
libc.test.UnitTest.ErrnoSetterMatcher
)
+
+add_libc_test(
+ waitid_test
+ SUITE
+ libc_sys_wait_unittests
+ SRCS
+ waitid_test.cpp
+ DEPENDS
+ libc.include.sys_wait
+ libc.src.errno.errno
+ libc.src.sys.wait.waitid
+ libc.test.UnitTest.ErrnoCheckingTest
+ libc.test.UnitTest.ErrnoSetterMatcher
+)
diff --git a/libc/test/src/sys/wait/waitid_test.cpp b/libc/test/src/sys/wait/waitid_test.cpp
new file mode 100644
index 00000000000000..caddc02f578c5c
--- /dev/null
+++ b/libc/test/src/sys/wait/waitid_test.cpp
@@ -0,0 +1,44 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Unittests for waitid.
+///
+//===----------------------------------------------------------------------===//
+
+#include "src/sys/wait/waitid.h"
+#include "test/UnitTest/ErrnoCheckingTest.h"
+#include "test/UnitTest/ErrnoSetterMatcher.h"
+#include "test/UnitTest/Test.h"
+
+#include <sys/wait.h>
+
+using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
+using LlvmLibcWaitidTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
+
+// The test here is a simple test for error handling and WNOHANG functionality.
+// For a more involved test, look at fork_test.
+
+TEST_F(LlvmLibcWaitidTest, InvalidFlags) {
+ siginfo_t info;
+ // POSIX and Linux require at least one of WEXITED, WSTOPPED, or WCONTINUED.
+ ASSERT_THAT(LIBC_NAMESPACE::waitid(P_ALL, 0, &info, 0), Fails(EINVAL));
+}
+
+TEST_F(LlvmLibcWaitidTest, InvalidIdType) {
+ siginfo_t info;
+ ASSERT_THAT(
+ LIBC_NAMESPACE::waitid(static_cast<idtype_t>(-1), 0, &info, WEXITED),
+ Fails(EINVAL));
+}
+
+TEST_F(LlvmLibcWaitidTest, NoHangNoChild) {
+ siginfo_t info;
+ ASSERT_THAT(LIBC_NAMESPACE::waitid(P_ALL, 0, &info, WEXITED | WNOHANG),
+ Fails(ECHILD));
+}
>From 31332a4cab6b566c472d1685ac060a1537c5c1ea Mon Sep 17 00:00:00 2001
From: amanmaurya92 <amanmaurya9209 at gmail.com>
Date: Thu, 8 Oct 2026 11:55:31 +0530
Subject: [PATCH 2/3] [libc] Define idtype_t as int and remove macro undefs
- Define idtype_t as int in include/llvm-libc-types/idtype_t.h
- Remove #undef workarounds for P_ALL, P_PID, P_PGID, P_PIDFD
---
.../llvm-libc-macros/linux/sys-wait-macros.h | 19 ---------------
libc/include/llvm-libc-types/idtype_t.h | 23 +------------------
2 files changed, 1 insertion(+), 41 deletions(-)
diff --git a/libc/include/llvm-libc-macros/linux/sys-wait-macros.h b/libc/include/llvm-libc-macros/linux/sys-wait-macros.h
index 5eaa94f5d7018a..d01cfa71ba3906 100644
--- a/libc/include/llvm-libc-macros/linux/sys-wait-macros.h
+++ b/libc/include/llvm-libc-macros/linux/sys-wait-macros.h
@@ -11,25 +11,6 @@
#include <linux/wait.h>
-// <linux/wait.h> defines P_ALL, P_PID, P_PGID, P_PIDFD as numeric macros.
-// Undefine them so they do not collide with the idtype_t enum specified by
-// POSIX.
-#ifdef P_ALL
-#undef P_ALL
-#endif
-
-#ifdef P_PID
-#undef P_PID
-#endif
-
-#ifdef P_PGID
-#undef P_PGID
-#endif
-
-#ifdef P_PIDFD
-#undef P_PIDFD
-#endif
-
#define WCOREDUMP(status) ((status) & WCOREFLAG)
#define WEXITSTATUS(status) (((status) & 0xff00) >> 8)
#define WIFCONTINUED(status) ((status) == 0xffff)
diff --git a/libc/include/llvm-libc-types/idtype_t.h b/libc/include/llvm-libc-types/idtype_t.h
index 11aab766a06368..c3c5d117b08f6e 100644
--- a/libc/include/llvm-libc-types/idtype_t.h
+++ b/libc/include/llvm-libc-types/idtype_t.h
@@ -14,27 +14,6 @@
#ifndef LLVM_LIBC_TYPES_IDTYPE_T_H
#define LLVM_LIBC_TYPES_IDTYPE_T_H
-#ifdef P_ALL
-#undef P_ALL
-#endif
-
-#ifdef P_PID
-#undef P_PID
-#endif
-
-#ifdef P_PGID
-#undef P_PGID
-#endif
-
-#ifdef P_PIDFD
-#undef P_PIDFD
-#endif
-
-typedef enum {
- P_ALL,
- P_PID,
- P_PGID,
- P_PIDFD,
-} idtype_t;
+typedef int idtype_t;
#endif // LLVM_LIBC_TYPES_IDTYPE_T_H
>From 6fe62f7435d27a067063ad5862aca84ed6fba927 Mon Sep 17 00:00:00 2001
From: amanmaurya92 <amanmaurya9209 at gmail.com>
Date: Fri, 9 Oct 2026 17:03:52 +0530
Subject: [PATCH 3/3] [libc] Address review feedback for waitid
---
libc/hdr/types/CMakeLists.txt | 1 -
.../__support/OSUtil/linux/syscall_wrappers/waitid.h | 4 ----
libc/test/integration/src/unistd/fork_test.cpp | 10 +++++-----
3 files changed, 5 insertions(+), 10 deletions(-)
diff --git a/libc/hdr/types/CMakeLists.txt b/libc/hdr/types/CMakeLists.txt
index 271046554f92f6..0c265b029b99f5 100644
--- a/libc/hdr/types/CMakeLists.txt
+++ b/libc/hdr/types/CMakeLists.txt
@@ -1443,4 +1443,3 @@ add_proxy_header_library(
FULL_BUILD_DEPENDS
libc.include.llvm-libc-types.idtype_t
)
-
diff --git a/libc/src/__support/OSUtil/linux/syscall_wrappers/waitid.h b/libc/src/__support/OSUtil/linux/syscall_wrappers/waitid.h
index 9d279be7367264..bec799ee7eaf6d 100644
--- a/libc/src/__support/OSUtil/linux/syscall_wrappers/waitid.h
+++ b/libc/src/__support/OSUtil/linux/syscall_wrappers/waitid.h
@@ -29,11 +29,7 @@ namespace linux_syscalls {
LIBC_INLINE ErrorOr<int> waitid(idtype_t idtype, id_t id, siginfo_t *infop,
int options, struct rusage *rusage = nullptr) {
-#ifdef SYS_waitid
return syscall_checked<int>(SYS_waitid, idtype, id, infop, options, rusage);
-#else
-#error "waitid syscall not available."
-#endif
}
} // namespace linux_syscalls
diff --git a/libc/test/integration/src/unistd/fork_test.cpp b/libc/test/integration/src/unistd/fork_test.cpp
index 6936805ecb23a9..74d480437ac82e 100644
--- a/libc/test/integration/src/unistd/fork_test.cpp
+++ b/libc/test/integration/src/unistd/fork_test.cpp
@@ -32,7 +32,7 @@
void fork_and_wait_normal_exit() {
pid_t pid = LIBC_NAMESPACE::fork();
if (pid == 0)
- return; // Just end without any thing special.
+ LIBC_NAMESPACE::internal::exit(0);
ASSERT_TRUE(pid > 0);
int status;
pid_t cpid = LIBC_NAMESPACE::wait(&status);
@@ -44,7 +44,7 @@ void fork_and_wait_normal_exit() {
void fork_and_wait4_normal_exit() {
pid_t pid = LIBC_NAMESPACE::fork();
if (pid == 0)
- return; // Just end without any thing special.
+ LIBC_NAMESPACE::internal::exit(0);
ASSERT_TRUE(pid > 0);
int status;
struct rusage usage;
@@ -59,7 +59,7 @@ void fork_and_wait4_normal_exit() {
void fork_and_waitid_normal_exit() {
pid_t pid = LIBC_NAMESPACE::fork();
if (pid == 0)
- return; // Just end without any thing special.
+ LIBC_NAMESPACE::internal::exit(0);
ASSERT_TRUE(pid > 0);
siginfo_t info;
info.si_pid = 0;
@@ -75,7 +75,7 @@ void fork_and_waitid_normal_exit() {
void fork_and_waitpid_normal_exit() {
pid_t pid = LIBC_NAMESPACE::fork();
if (pid == 0)
- return; // Just end without any thing special.
+ LIBC_NAMESPACE::internal::exit(0);
ASSERT_TRUE(pid > 0);
int status;
pid_t cpid = LIBC_NAMESPACE::waitpid(pid, &status, 0);
@@ -162,7 +162,7 @@ void fork_with_atfork_callbacks() {
// behavior is observed.
if (child != DONE || prepare != DONE || parent == DONE)
LIBC_NAMESPACE::raise(SIGUSR1);
- return;
+ LIBC_NAMESPACE::internal::exit(0);
}
ASSERT_TRUE(pid > 0);
More information about the libc-commits
mailing list