[libc-commits] [libc] 569814e - [libc] Implement pwait2 using pwait (#99781)

via libc-commits libc-commits at lists.llvm.org
Sat Jul 20 13:27:43 PDT 2024


Author: Mikhail R. Gadelha
Date: 2024-07-20T17:27:39-03:00
New Revision: 569814e862a7ce1de3144e76d0a97253ac161d05

URL: https://github.com/llvm/llvm-project/commit/569814e862a7ce1de3144e76d0a97253ac161d05
DIFF: https://github.com/llvm/llvm-project/commit/569814e862a7ce1de3144e76d0a97253ac161d05.diff

LOG: [libc] Implement pwait2 using pwait (#99781)

This patch implements pwait2 using pwait. The implementation is an
approximation of pwait2, since pwait only only supports timeouts in
milliseconds, not nanoseconds, as required by pwait2.

Added: 
    

Modified: 
    libc/src/sys/epoll/linux/epoll_pwait2.cpp

Removed: 
    


################################################################################
diff  --git a/libc/src/sys/epoll/linux/epoll_pwait2.cpp b/libc/src/sys/epoll/linux/epoll_pwait2.cpp
index 14b419399fe9b..4123157d29fff 100644
--- a/libc/src/sys/epoll/linux/epoll_pwait2.cpp
+++ b/libc/src/sys/epoll/linux/epoll_pwait2.cpp
@@ -25,10 +25,22 @@ namespace LIBC_NAMESPACE_DECL {
 LLVM_LIBC_FUNCTION(int, epoll_pwait2,
                    (int epfd, struct epoll_event *events, int maxevents,
                     const struct timespec *timeout, const sigset_t *sigmask)) {
+#ifdef SYS_epoll_pwait2
   int ret = LIBC_NAMESPACE::syscall_impl<int>(
       SYS_epoll_pwait2, epfd, reinterpret_cast<long>(events), maxevents,
       reinterpret_cast<long>(timeout), reinterpret_cast<long>(sigmask),
       NSIG / 8);
+#elif defined(SYS_epoll_pwait)
+  // Convert nanoseconds to milliseconds, rounding up if there are remaining
+  // nanoseconds
+  long timeout_ms = static_cast<long>(timeout->tv_sec * 1000 +
+                                      (timeout->tv_nsec + 999999) / 1000000);
+  int ret = LIBC_NAMESPACE::syscall_impl<int>(
+      SYS_epoll_pwait, epfd, reinterpret_cast<long>(events), maxevents,
+      timeout_ms, reinterpret_cast<long>(sigmask), NSIG / 8);
+#else
+#error "epoll_pwait and epoll_pwait2 syscalls not available."
+#endif
 
   // A negative return value indicates an error with the magnitude of the
   // value being the error code.


        


More information about the libc-commits mailing list