From 5e669b5aba7b5075521bc5f8fd875e0e0a110566 Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Sun, 30 Jul 2023 12:51:36 +0900 Subject: [PATCH] tests: (test_mkfds) add pselect6 and select multiplexers Signed-off-by: Masatake YAMATO --- tests/helpers/test_mkfds.c | 114 +++++++++++++++++++++++++------------ 1 file changed, 78 insertions(+), 36 deletions(-) diff --git a/tests/helpers/test_mkfds.c b/tests/helpers/test_mkfds.c index 07816414ba..7c6060b887 100644 --- a/tests/helpers/test_mkfds.c +++ b/tests/helpers/test_mkfds.c @@ -3817,45 +3817,75 @@ struct multiplexer { void (*fn)(bool, struct fdesc *fdescs, size_t n_fdescs); }; -static void wait_event_default(bool monitor_stdin, struct fdesc *fdescs, size_t n_fdescs) +#if defined(__NR_select) +static void sighandler_nop(int si _U_) { - fd_set readfds; - fd_set writefds; - fd_set exceptfds; - sigset_t sigset; - int n = 0; - - FD_ZERO(&readfds); - FD_ZERO(&writefds); - FD_ZERO(&exceptfds); - /* Monitor the standard input only when the process - * is in foreground. */ - if (monitor_stdin) { - n = 1; - FD_SET(0, &readfds); - } - - for (size_t i = 0; i < n_fdescs; i++) { - if (fdescs[i].mx_modes & MX_READ) { - n = max(n, fdescs[i].fd + 1); - FD_SET(fdescs[i].fd, &readfds); - } - if (fdescs[i].mx_modes & MX_WRITE) { - n = max(n, fdescs[i].fd + 1); - FD_SET(fdescs[i].fd, &writefds); - } - if (fdescs[i].mx_modes & MX_EXCEPT) { - n = max(n, fdescs[i].fd + 1); - FD_SET(fdescs[i].fd, &exceptfds); - } - } + /* Do nothing */ +} +#endif - sigemptyset(&sigset); +#define DEFUN_WAIT_EVENT_SELECT(NAME,SYSCALL,XDECLS,SETUP_SIG_HANDLER,SYSCALL_INVOCATION) \ + static void wait_event_##NAME(bool add_stdin, struct fdesc *fdescs, size_t n_fdescs) \ + { \ + fd_set readfds; \ + fd_set writefds; \ + fd_set exceptfds; \ + XDECLS \ + int n = 0; \ + \ + FD_ZERO(&readfds); \ + FD_ZERO(&writefds); \ + FD_ZERO(&exceptfds); \ + /* Monitor the standard input only when the process \ + * is in foreground. */ \ + if (add_stdin) { \ + n = 1; \ + FD_SET(0, &readfds); \ + } \ + \ + for (size_t i = 0; i < n_fdescs; i++) { \ + if (fdescs[i].mx_modes & MX_READ) { \ + n = max(n, fdescs[i].fd + 1); \ + FD_SET(fdescs[i].fd, &readfds); \ + } \ + if (fdescs[i].mx_modes & MX_WRITE) { \ + n = max(n, fdescs[i].fd + 1); \ + FD_SET(fdescs[i].fd, &writefds); \ + } \ + if (fdescs[i].mx_modes & MX_EXCEPT) { \ + n = max(n, fdescs[i].fd + 1); \ + FD_SET(fdescs[i].fd, &exceptfds); \ + } \ + } \ + \ + SETUP_SIG_HANDLER \ + \ + if (SYSCALL_INVOCATION < 0 \ + && errno != EINTR) \ + err(EXIT_FAILURE, "failed in " SYSCALL); \ + } + +DEFUN_WAIT_EVENT_SELECT(default, + "pselect", + sigset_t sigset;, + sigemptyset(&sigset);, + pselect(n, &readfds, &writefds, &exceptfds, NULL, &sigset)) + +#ifdef __NR_pselect6 +DEFUN_WAIT_EVENT_SELECT(pselect6, + "pselect6", + sigset_t sigset;, + sigemptyset(&sigset);, + syscall(__NR_pselect6, n, &readfds, &writefds, &exceptfds, NULL, &sigset)) +#endif - if (pselect(n, &readfds, &writefds, &exceptfds, NULL, &sigset) < 0 - && errno != EINTR) - err(EXIT_FAILURE, "failed in pselect"); -} +#ifdef __NR_select +DEFUN_WAIT_EVENT_SELECT(select, + "select", + , + signal(SIGCONT,sighandler_nop);, + syscall(__NR_select, n, &readfds, &writefds, &exceptfds, NULL)) +#endif #define DEFAULT_MULTIPLEXER 0 static struct multiplexer multiplexers [] = { @@ -3863,6 +3893,18 @@ static struct multiplexer multiplexers [] = { .name = "default", .fn = wait_event_default, }, +#ifdef __NR_pselect6 + { + .name = "pselect6", + .fn = wait_event_pselect6, + }, +#endif +#ifdef __NR_select + { + .name = "select", + .fn = wait_event_select, + }, +#endif }; static struct multiplexer *lookup_multiplexer(const char *name) -- 2.47.3