summaryrefslogtreecommitdiffstats
path: root/libc/sysdeps/linux/common/select.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/common/select.c')
-rw-r--r--libc/sysdeps/linux/common/select.c28
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)