diff options
-rw-r--r-- | libc/sysdeps/linux/common/epoll.c | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/libc/sysdeps/linux/common/epoll.c b/libc/sysdeps/linux/common/epoll.c index e3cbb00bf..85b0cfd2b 100644 --- a/libc/sysdeps/linux/common/epoll.c +++ b/libc/sysdeps/linux/common/epoll.c @@ -9,7 +9,11 @@ #include <sys/syscall.h> #include <sys/epoll.h> -#include <cancel.h> +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +# include <sysdep-cancel.h> +#else +# define SINGLE_THREAD_P 1 +#endif /* * epoll_create() @@ -36,12 +40,21 @@ _syscall4(int,epoll_ctl, int, epfd, int, op, int, fd, struct epoll_event *, even * epoll_wait() */ #ifdef __NR_epoll_wait -static int __NC(epoll_wait)(int epfd, struct epoll_event *events, int maxevents, int timeout) +extern __typeof(epoll_wait) __libc_epoll_wait; +int __libc_epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout) { - return INLINE_SYSCALL(epoll_wait, 4, epfd, events, maxevents, timeout); + if (SINGLE_THREAD_P) + return INLINE_SYSCALL(epoll_wait, 4, epfd, events, maxevents, timeout); +# ifdef __UCLIBC_HAS_THREADS_NATIVE__ + else { + int oldtype = LIBC_CANCEL_ASYNC (); + int result = INLINE_SYSCALL(epoll_wait, 4, epfd, events, maxevents, timeout); + LIBC_CANCEL_RESET (oldtype); + return result; + } +# endif } -CANCELLABLE_SYSCALL(int, epoll_wait, (int epfd, struct epoll_event *events, int maxevents, int timeout), - (epfd, events, maxevents, timeout)) +weak_alias(__libc_epoll_wait, epoll_wait) #endif /* @@ -50,16 +63,20 @@ CANCELLABLE_SYSCALL(int, epoll_wait, (int epfd, struct epoll_event *events, int #ifdef __NR_epoll_pwait # include <signal.h> -# define __NR___syscall_epoll_pwait __NR_epoll_pwait -static __always_inline _syscall6(int, __syscall_epoll_pwait, int, epfd, struct epoll_event *, events, - int, maxevents, int, timeout, const sigset_t *, sigmask, size_t, sigsetsize) - -static int __NC(epoll_pwait)(int epfd, struct epoll_event *events, int maxevents, int timeout, - const sigset_t *set) +extern __typeof(epoll_pwait) __libc_epoll_pwait; +int __libc_epoll_pwait(int epfd, struct epoll_event *events, int maxevents, + int timeout, const sigset_t *set) { - return __syscall_epoll_pwait(epfd, events, maxevents, timeout, set, __SYSCALL_SIGSET_T_SIZE); + if (SINGLE_THREAD_P) + return INLINE_SYSCALL(epoll_pwait, 6, epfd, events, maxevents, timeout, set, _NSIG / 8); +# ifdef __UCLIBC_HAS_THREADS_NATIVE__ + else { + int oldtype = LIBC_CANCEL_ASYNC (); + int result = INLINE_SYSCALL(epoll_pwait, 6, epfd, events, maxevents, timeout, set, _NSIG / 8); + LIBC_CANCEL_RESET (oldtype); + return result; + } +# endif } -CANCELLABLE_SYSCALL(int, epoll_pwait, (int epfd, struct epoll_event *events, int maxevents, int timeout, - const sigset_t *set), - (epfd, events, maxevents, timeout, set)) +weak_alias(__libc_epoll_pwait, epoll_pwait) #endif |