[libc][POSIX][poll.h] implement poll (#125118)

Simple syscall.

Fixes: #124647
This commit is contained in:
Nick Desaulniers 2025-02-05 13:24:39 -08:00 committed by GitHub
parent b4d547ac82
commit 8e35b3d29b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
27 changed files with 402 additions and 22 deletions

View File

@ -32,6 +32,9 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.fcntl.open
libc.src.fcntl.openat
# poll.h entrypoints
libc.src.poll.poll
# sched.h entrypoints
libc.src.sched.sched_get_priority_max
libc.src.sched.sched_get_priority_min

View File

@ -8,30 +8,31 @@ set(TARGET_PUBLIC_HEADERS
libc.include.features
libc.include.fenv
libc.include.float
libc.include.stdint
libc.include.inttypes
libc.include.limits
libc.include.link
libc.include.malloc
libc.include.math
libc.include.poll
libc.include.pthread
libc.include.search
libc.include.signal
libc.include.stdckdint
libc.include.stdbit
libc.include.stdckdint
libc.include.stdint
libc.include.stdio
libc.include.stdlib
libc.include.string
libc.include.strings
libc.include.search
libc.include.sys_mman
libc.include.sys_socket
libc.include.sys_syscall
libc.include.sys_time
libc.include.threads
libc.include.time
libc.include.uchar
libc.include.unistd
libc.include.wchar
libc.include.uchar
libc.include.sys_ioctl
# Disabled due to epoll_wait syscalls not being available on this platform.

View File

@ -20,6 +20,9 @@ set(TARGET_LIBC_ENTRYPOINTS
# errno.h entrypoints
libc.src.errno.errno
# poll.h entrypoints
libc.src.poll.poll
# string.h entrypoints
libc.src.string.memccpy
libc.src.string.memchr

View File

@ -32,6 +32,9 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.fcntl.open
libc.src.fcntl.openat
# poll.h entrypoints
libc.src.poll.poll
# sched.h entrypoints
libc.src.sched.sched_get_priority_max
libc.src.sched.sched_get_priority_min

View File

@ -32,6 +32,9 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.fcntl.open
libc.src.fcntl.openat
# poll.h entrypoints
libc.src.poll.poll
# sched.h entrypoints
libc.src.sched.sched_get_priority_max
libc.src.sched.sched_get_priority_min

View File

@ -1,4 +1,5 @@
set(TARGET_PUBLIC_HEADERS
libc.include.arpa_inet
libc.include.assert
libc.include.complex
libc.include.ctype
@ -10,35 +11,27 @@ set(TARGET_PUBLIC_HEADERS
libc.include.features
libc.include.fenv
libc.include.float
libc.include.stdint
libc.include.inttypes
libc.include.limits
libc.include.link
libc.include.locale
libc.include.malloc
libc.include.math
libc.include.poll
libc.include.pthread
libc.include.sched
libc.include.search
libc.include.setjmp
libc.include.signal
libc.include.spawn
libc.include.setjmp
libc.include.stdckdint
libc.include.stdbit
libc.include.stdckdint
libc.include.stdfix
libc.include.stdint
libc.include.stdio
libc.include.stdlib
libc.include.string
libc.include.strings
libc.include.search
libc.include.termios
libc.include.threads
libc.include.time
libc.include.unistd
libc.include.wchar
libc.include.uchar
libc.include.locale
libc.include.arpa_inet
libc.include.sys_auxv
libc.include.sys_epoll
libc.include.sys_ioctl
@ -56,4 +49,10 @@ set(TARGET_PUBLIC_HEADERS
libc.include.sys_types
libc.include.sys_utsname
libc.include.sys_wait
libc.include.termios
libc.include.threads
libc.include.time
libc.include.uchar
libc.include.unistd
libc.include.wchar
)

View File

@ -342,3 +342,19 @@ add_proxy_header_library(
libc.include.llvm-libc-types.struct_iovec
libc.include.sys_uio
)
add_proxy_header_library(
nfds_t
HDRS
nfds_t.h
FULL_BUILD_DEPENDS
libc.include.llvm-libc-types.nfds_t
)
add_proxy_header_library(
struct_pollfd
HDRS
struct_pollfd.h
FULL_BUILD_DEPENDS
libc.include.llvm-libc-types.struct_pollfd
)

23
libc/hdr/types/nfds_t.h Normal file
View File

@ -0,0 +1,23 @@
//===-- Definition of nfds_t ----------------------------------------------===//
//
// 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
//
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_HDR_TYPES_NFDS_T_H
#define LLVM_LIBC_HDR_TYPES_NFDS_T_H
#ifdef LIBC_FULL_BUILD
#include "include/llvm-libc-types/nfds_t.h"
#else // overlay mode
#include <poll.h>
#endif // LLVM_LIBC_FULL_BUILD
#endif // LLVM_LIBC_HDR_TYPES_NFDS_T_H

View File

@ -0,0 +1,23 @@
//===-- Definition of struct pollfd ---------------------------------------===//
//
// 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
//
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_POLLFD_H
#define LLVM_LIBC_HDR_TYPES_STRUCT_POLLFD_H
#ifdef LIBC_FULL_BUILD
#include "include/llvm-libc-types/struct_pollfd.h"
#else // overlay mode
#include <poll.h>
#endif // LLVM_LIBC_FULL_BUILD
#endif // LLVM_LIBC_HDR_TYPES_STRUCT_POLLFD_H

View File

@ -704,6 +704,16 @@ add_header_macro(
.llvm-libc-types.struct_lconv
)
add_header_macro(
poll
../libc/include/poll.yaml
poll.h
DEPENDS
.llvm-libc-types.struct_pollfd
.llvm-libc-types.nfds_t
.llvm-libc-macros.poll-macros
)
if(NOT LLVM_LIBC_FULL_BUILD)
# We don't install headers in non-fullbuild mode.
return()

View File

@ -321,3 +321,9 @@ add_macro_header(
HDR
pthread-macros.h
)
add_macro_header(
poll-macros
HDR
poll-macros.h
)

View File

@ -10,6 +10,12 @@ add_header(
fcntl-macros.h
)
add_header(
poll-macros
HDR
poll-macros.h
)
add_header(
sched_macros
HDR

View File

@ -0,0 +1,65 @@
//===-- Macros defined in poll.h header file ------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_MACROS_LINUX_POLL_MACROS_H
#define LLVM_LIBC_MACROS_LINUX_POLL_MACROS_H
// From asm-generic/poll.h, redefined here to avoid redeclaring struct pollfd.
#ifndef POLLIN
#define POLLIN 0x0001
#endif
#ifndef POLLPRI
#define POLLPRI 0x0002
#endif
#ifndef POLLOUT
#define POLLOUT 0x0004
#endif
#ifndef POLLERR
#define POLLERR 0x0008
#endif
#ifndef POLLHUP
#define POLLHUP 0x0010
#endif
#ifndef POLLNVAL
#define POLLNVAL 0x0020
#endif
#ifndef POLLRDNORM
#define POLLRDNORM 0x0040
#endif
#ifndef POLLRDBAND
#define POLLRDBAND 0x0080
#endif
#ifndef POLLWRNORM
#define POLLWRNORM 0x0100
#endif
#ifndef POLLWRBAND
#define POLLWRBAND 0x0200
#endif
#ifndef POLLMSG
#define POLLMSG 0x0400
#endif
#ifndef POLLREMOVE
#define POLLREMOVE 0x1000
#endif
#ifndef POLLRDHUP
#define POLLRDHUP 0x2000
#endif
#endif // LLVM_LIBC_MACROS_LINUX_POLL_MACROS_H

View File

@ -0,0 +1,16 @@
//===-- Macros defined in poll.h header file ------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_MACROS_POLL_MACROS_H
#define LLVM_LIBC_MACROS_POLL_MACROS_H
#ifdef __linux__
#include "linux/poll-macros.h"
#endif
#endif // LLVM_LIBC_MACROS_POLL_MACROS_H

View File

@ -44,6 +44,7 @@ add_header(jmp_buf HDR jmp_buf.h)
add_header(mbstate_t HDR mbstate_t.h)
add_header(mode_t HDR mode_t.h)
add_header(mtx_t HDR mtx_t.h DEPENDS .__futex_word .__mutex_type)
add_header(nfds_t HDR nfds_t.h)
add_header(nlink_t HDR nlink_t.h)
add_header(off_t HDR off_t.h)
add_header(once_flag HDR once_flag.h DEPENDS .__futex_word)
@ -67,14 +68,15 @@ else()
endif()
add_header(stack_t HDR stack_t.h DEPENDS .size_t)
add_header(suseconds_t HDR suseconds_t.h)
add_header(struct_dirent HDR struct_dirent.h DEPENDS .ino_t .off_t)
add_header(struct_f_owner_ex HDR struct_f_owner_ex.h DEPENDS .pid_t)
add_header(struct_flock HDR struct_flock.h DEPENDS .off_t .pid_t)
add_header(struct_flock64 HDR struct_flock64.h DEPENDS .off64_t .pid_t)
add_header(struct_f_owner_ex HDR struct_f_owner_ex.h DEPENDS .pid_t)
add_header(struct_timeval HDR struct_timeval.h DEPENDS .suseconds_t .time_t)
add_header(struct_pollfd HDR struct_pollfd.h)
add_header(struct_rlimit HDR struct_rlimit.h DEPENDS .rlim_t)
add_header(struct_rusage HDR struct_rusage.h DEPENDS .struct_timeval)
add_header(struct_dirent HDR struct_dirent.h DEPENDS .ino_t .off_t)
add_header(struct_sched_param HDR struct_sched_param.h)
add_header(struct_timeval HDR struct_timeval.h DEPENDS .suseconds_t .time_t)
add_header(struct_rusage HDR struct_rusage.h DEPENDS .struct_timeval)
add_header(union_sigval HDR union_sigval.h)
add_header(siginfo_t HDR siginfo_t.h DEPENDS .union_sigval .pid_t .uid_t .clock_t)
add_header(sig_atomic_t HDR sig_atomic_t.h)

View File

@ -0,0 +1,14 @@
//===-- Definition of type nfds_t -----------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_TYPES_NFDS_T_H
#define LLVM_LIBC_TYPES_NFDS_T_H
typedef unsigned int nfds_t;
#endif // LLVM_LIBC_TYPES_NFDS_T_H

View File

@ -0,0 +1,18 @@
//===-- Definition of type struct pollfd ----------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_TYPES_STRUCT_POLLFD_H
#define LLVM_LIBC_TYPES_STRUCT_POLLFD_H
struct pollfd {
int fd;
short events;
short revents;
};
#endif // LLVM_LIBC_TYPES_STRUCT_POLLFD_H

17
libc/include/poll.h.def Normal file
View File

@ -0,0 +1,17 @@
//===-- C standard library header poll.h ----------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_POLL_H
#define LLVM_LIBC_POLL_H
#include "__llvm-libc-common.h"
#include "llvm-libc-macros/poll-macros.h"
%%public_api()
#endif // LLVM_LIBC_POLL_H

16
libc/include/poll.yaml Normal file
View File

@ -0,0 +1,16 @@
header: poll.h
header_template: poll.h.def
macros: []
types:
- type_name: struct_pollfd
- type_name: nfds_t
enums: []
functions:
- name: poll
standards:
- posix
return_type: int
arguments:
- type: struct pollfd *
- type: nfds_t
- type: int

View File

@ -20,6 +20,7 @@ add_subdirectory(unistd)
if(${LIBC_TARGET_OS} STREQUAL "linux")
add_subdirectory(dirent)
add_subdirectory(fcntl)
add_subdirectory(poll)
add_subdirectory(pthread)
add_subdirectory(sched)
add_subdirectory(sys)

View File

@ -0,0 +1,10 @@
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
endif()
add_entrypoint_object(
poll
ALIAS
DEPENDS
.${LIBC_TARGET_OS}.poll
)

View File

@ -0,0 +1,14 @@
add_entrypoint_object(
poll
SRCS
poll.cpp
HDRS
../poll.h
DEPENDS
libc.hdr.types.nfds_t
libc.hdr.types.struct_pollfd
libc.hdr.types.struct_timespec
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
libc.src.errno.errno
)

View File

@ -0,0 +1,49 @@
//===-- Implementation of poll --------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "src/poll/poll.h"
#include "hdr/types/nfds_t.h"
#include "hdr/types/struct_pollfd.h"
#include "hdr/types/struct_timespec.h"
#include "src/__support/OSUtil/syscall.h" // syscall_impl
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
#include "src/errno/libc_errno.h"
#include <sys/syscall.h> // SYS_poll, SYS_ppoll
namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(int, poll, (pollfd * fds, nfds_t nfds, int timeout)) {
#ifdef SYS_poll
int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_poll, fds, nfds, timeout);
#elif defined(SYS_ppoll)
timespec ts, *tsp;
if (timeout >= 0) {
ts.tv_sec = timeout / 1000;
ts.tv_nsec = (timeout % 1000) * 1000000;
tsp = &ts;
} else {
tsp = nullptr;
}
int ret =
LIBC_NAMESPACE::syscall_impl<int>(SYS_ppoll, fds, nfds, tsp, nullptr, 0);
#else
#error "SYS_ppoll_time64?"
#endif
if (ret < 0) {
libc_errno = -ret;
return -1;
}
return ret;
}
} // namespace LIBC_NAMESPACE_DECL

22
libc/src/poll/poll.h Normal file
View File

@ -0,0 +1,22 @@
//===-- Implementation header for poll ----------------------------*-C++-*-===//
//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_SRC_POLL_POLL_H
#define LLVM_LIBC_SRC_POLL_POLL_H
#include "hdr/types/nfds_t.h"
#include "hdr/types/struct_pollfd.h"
#include "src/__support/macros/config.h"
namespace LIBC_NAMESPACE_DECL {
int poll(pollfd *fds, nfds_t nfds, int timeout);
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_POLL_POLL_H

View File

@ -77,6 +77,7 @@ add_subdirectory(inttypes)
if(${LIBC_TARGET_OS} STREQUAL "linux")
add_subdirectory(fcntl)
add_subdirectory(poll)
add_subdirectory(sched)
add_subdirectory(sys)
add_subdirectory(termios)

View File

@ -0,0 +1,14 @@
add_custom_target(libc_poll_unittests)
add_libc_unittest(
poll_test
SUITE
libc_poll_unittests
SRCS
poll_test.cpp
DEPENDS
libc.hdr.limits_macros
libc.src.errno.errno
libc.src.poll.poll
libc.test.UnitTest.ErrnoSetterMatcher
)

View File

@ -0,0 +1,25 @@
//===-- Unittests for poll ------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "hdr/limits_macros.h" // UINT_MAX
#include "src/errno/libc_errno.h"
#include "src/poll/poll.h"
#include "test/UnitTest/Test.h"
TEST(LlvmLibcPollTest, SmokeTest) {
LIBC_NAMESPACE::libc_errno = 0;
int ret = LIBC_NAMESPACE::poll(nullptr, 0, 0);
ASSERT_ERRNO_SUCCESS();
ASSERT_EQ(0, ret);
}
TEST(LlvmLibcPollTest, SmokeFailureTest) {
LIBC_NAMESPACE::libc_errno = 0;
int ret = LIBC_NAMESPACE::poll(nullptr, UINT_MAX, 0);
ASSERT_ERRNO_EQ(EINVAL);
ASSERT_EQ(-1, ret);
}