diff options
Diffstat (limited to 'libc/sysdeps/linux/common/select.c')
| -rw-r--r-- | libc/sysdeps/linux/common/select.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/libc/sysdeps/linux/common/select.c b/libc/sysdeps/linux/common/select.c index 9a50d198a..55f4c23fb 100644 --- a/libc/sysdeps/linux/common/select.c +++ b/libc/sysdeps/linux/common/select.c @@ -10,12 +10,36 @@ #include "syscalls.h" #include <sys/select.h> +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +#include <sysdep-cancel.h> +#else +#define SINGLE_THREAD_P 1 +#endif + + libc_hidden_proto(select) #ifdef __NR__newselect # undef __NR_select # define __NR_select __NR__newselect #endif -_syscall5(int, select, int, n, fd_set *, readfds, fd_set *, writefds, - fd_set *, exceptfds, struct timeval *, timeout); + +#define __NR___syscall_select __NR_select +static inline _syscall5(int, __syscall_select, int, n, fd_set *, readfds, + fd_set *, writefds, fd_set *, exceptfds, struct timeval *, timeout); + +int select(int n, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, + struct timeval * timeout) +{ + if (SINGLE_THREAD_P) + return __syscall_select(n, readfds, writefds, exceptfds, timeout); + +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ + int oldtype = LIBC_CANCEL_ASYNC (); + int result = __syscall_select(n, readfds, writefds, exceptfds, timeout); + LIBC_CANCEL_RESET (oldtype); + return result; +#endif +} + libc_hidden_def(select) |
