nptl: Rewrite cancellation macros
Commit Message
Hi
This patch is another of the required adjustments for the fix for bz12683
(Race conditions in pthread cancellation) and the idea is to remove
LIBC_CANCEL_ASYNC/LIBC_CANCEL_RESET explicit usage.
This patch changes the way cancellation entrypoints are defined to
instead call the macro SYSCALL_CANCEL. An usual cancellation definition
is defined as:
if (SINGLE_THREAD_P)
return INLINE_SYSCALL (syscall, NARGS, args...)
int oldtype = LIBC_CANCEL_ASYNC ();
return INLINE_SYSCALL (syscall, NARGS, args...)
LIBC_CANCEL_RESET (oldtype);
And it is rewrited as just:
SYSCALL_CANCEL (syscall, args...)
Tested on i386, x86_64, powerpc32, powerpc64le, arm, and aarch64.
--
* sysdeps/unix/sysdep.h [SYSCALL_CANCEL]: New macro: define
cancellable syscalls.
(SYS_ify): Add guard to no redefine it.
(INLINE_SYSCALL): Likewise.
* sysdeps/unix/sysv/linux/accept4.c (accept4): Remove
LIBC_CANCEL_ASYNC/INLINE_SYSCALL/LIBC_CANCEL_RESET and use
SYSCALL_CANCEL instead.
* sysdeps/unix/sysv/linux/alpha/fdatasync.c (__fdatasync): Likewise.
* sysdeps/unix/sysv/linux/arm/pread.c (__libc_pread): Likewise.
* sysdeps/unix/sysv/linux/arm/pread64.c (__libc_pread64): Likewise.
* sysdeps/unix/sysv/linux/arm/pwrite.c (__libc_pwrite): Likewise.
* sysdeps/unix/sysv/linux/arm/pwrite64.c (__libc_pwrite64): Likewise.
* sysdeps/unix/sysv/linux/epoll_pwait.c (epoll_pwait): Likewise.
* sysdeps/unix/sysv/linux/fallocate.c (fallocate): Likewise.
* sysdeps/unix/sysv/linux/fallocate64.c (fallocate64): Likewise.
* sysdeps/unix/sysv/linux/generic/open.c (__libc_open): Likewise.
* sysdeps/unix/sysv/linux/generic/open64.c (__libc_open64): Likewise.
* sysdeps/unix/sysv/linux/generic/pause.c (__libc_pause): Likewise.
* sysdeps/unix/sysv/linux/generic/poll.c (__poll): Likewise.
* sysdeps/unix/sysv/linux/generic/recv.c (__libc_recv): Likewise.
* sysdeps/unix/sysv/linux/generic/select.c (__select): Likewise.
* sysdeps/unix/sysv/linux/generic/send.c (__libc_send): Likewise.
* sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c (__libc_pread):
Likewise.
* sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
(__libc_pread64): Likewise.
* sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
(__libc_preadv): Likewise.
* sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
(__libc_readv64): Likewise.
* sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c
(__libc_pwrite): Likewise.
* sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c
(__libc_pwrite64): Likewise.
* sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
(__libc_pwritev): Likewise.
* sysdeps/sysv/linux/generic/wordsize-32/pwritev64.c
(__libc_pwritev64): Likewise.
* sysdeps/unix/sysv/linux/i386/fcntl.c (__libc_fcntl): Likewise.
* sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c
(sync_file_range): Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c (fallocate):
Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c (fallocate64):
Likewise.
* sysdeps/unix/sysv/linux/mips/pread.c (__libc_pread): Likewise.
* sysdeps/unix/sysv/linux/mips/pread64.c (__libc_pread64): Likewise.
* sysdeps/unix/sysv/linux/mips/pwrite.c (__libc_pwrite): Likewise.
* sysdeps/unix/sysv/linux/mips/pwrite64.c (__libc_pwrite64): Likewise.
* sysdeps/unix/sysv/linux/msgrcv.c (__libc_msgrcv): Likewise.
* sysdeps/unix/sysv/linux/msgsnd.c (__libc_msgsnd): Likewise.
* sysdeps/unix/sysv/linux/open64.c (__libc_open64): Likewise.
* sysdeps/unix/sysv/linux/openat.c (__libc_openat): Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c (__libc_pread):
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
(__libc_read64): Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c (__libc_write):
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c (__libc_write64):
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c (__libc_fcntl):
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/pread.c (__libc_pread):
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/pread64.c
(__libc_pread64): Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/pwrite.c (__libc_pwrite):
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/pwrite64.c
(__libc_pwrite64): Likewise.
* sysdeps/sysv/linux/powerpc/powerpc64/sync_file_range.c
(sync_file_range): Likewise.
* sysdeps/unix/sysv/linux/ppoll.c (ppoll): Likewise.
* sysdeps/unix/sysv/linux/pread.c (__libc_pread): Likewise.
* sysdeps/unix/sysv/linux/pread64.c (__libc_pread64): Likewise.
* sysdeps/unix/sysv/linux/preadv.c (__libc_preadv): Likewise.
* sysdeps/unix/sysv/linux/pselect.c (__pselect): Likewise.
* sysdeps/unix/sysv/linux/pwrite.c (__libc_pwrite): Likewise.
* sysdeps/unix/sysv/linux/pwrite64.c (__libc_pwrite64): Likewise.
* sysdeps/unix/sysv/linux/pwritev.c (PWRITEV): Likewise.
* sysdeps/unix/sysv/linux/readv.c (__libc_readv): Likewise.
* sysdeps/unix/sysv/linux/recvmmsg.c (recvmmsg): Likewise.
* sysdeps/unix/sysv/linux/sendmmsg.c (sendmmsg): Likewise.
* sysdeps/unix/sysv/linux/sh/pread.c (__libc_pread): Likewise.
* sysdeps/unix/sysv/linux/sh/pread64.c (__libc_pread64): Likewise.
* sysdeps/unix/sysv/linux/sh/pwrite.c (__libc_pwrite): Likewise.
* sysdeps/unix/sysv/linux/sh/pwrite64.c (__libc_pwrite64): Likewise.
* sysdeps/unix/sysv/linux/sigsuspend.c (__sigsuspend): Likewise.
* sysdeps/unix/sysv/linux/sigtimedwait.c (__sigtimedwait): Likewise.
* sysdeps/unix/sysv/linux/sigwaitinfo.c (__sigwaitinfo): Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c (__libc_msgrcv):
Likewise.
* sysdeps/unix/sysv/linux/sync_file_range.c (sync_file_range):
Likewise.
* sysdeps/unix/sysv/linux/tcdrain.c (__libc_tcdrain): Likewise.
* sysdeps/unix/sysv/linux/timer_routines.c (timer_helper_thread):
Likewise.
* sysdeps/unix/sysv/linux/wait.c (__libc_wait): Likewise.
* sysdeps/unix/sysv/linux/waitid.c (__waitid): Likewise.
* sysdeps/unix/sysv/linux/waitpid.c (__libc_waitpid): Likewise.
* sysdeps/unix/sysv/linux/wordsize-64/fallocate.c (fallocate):
Likewise.
* sysdeps/unix/sysv/linux/wordsize-64/preadv.c (preadv): Likewise.
* sysdeps/unix/sysv/linux/wordsize-64/pwritev.c (pwritev): Likewise.
* sysdeps/unix/sysv/linux/writev.c (__libc_writev): Likewise.
* sysdeps/unix/sysv/linux/x86_64/recv.c (__libc_recv): Likewise.
* sysdeps/unix/sysv/linux/x86_64/send.c (__libc_send): Likewise.
--
Comments
Ping (this is a refactor patch).
On 20-05-2015 11:10, Adhemerval Zanella wrote:
> Hi
>
> This patch is another of the required adjustments for the fix for bz12683
> (Race conditions in pthread cancellation) and the idea is to remove
> LIBC_CANCEL_ASYNC/LIBC_CANCEL_RESET explicit usage.
>
> This patch changes the way cancellation entrypoints are defined to
> instead call the macro SYSCALL_CANCEL. An usual cancellation definition
> is defined as:
>
> if (SINGLE_THREAD_P)
> return INLINE_SYSCALL (syscall, NARGS, args...)
>
> int oldtype = LIBC_CANCEL_ASYNC ();
>
> return INLINE_SYSCALL (syscall, NARGS, args...)
>
> LIBC_CANCEL_RESET (oldtype);
>
> And it is rewrited as just:
>
> SYSCALL_CANCEL (syscall, args...)
>
> Tested on i386, x86_64, powerpc32, powerpc64le, arm, and aarch64.
>
> --
>
> * sysdeps/unix/sysdep.h [SYSCALL_CANCEL]: New macro: define
> cancellable syscalls.
> (SYS_ify): Add guard to no redefine it.
> (INLINE_SYSCALL): Likewise.
> * sysdeps/unix/sysv/linux/accept4.c (accept4): Remove
> LIBC_CANCEL_ASYNC/INLINE_SYSCALL/LIBC_CANCEL_RESET and use
> SYSCALL_CANCEL instead.
> * sysdeps/unix/sysv/linux/alpha/fdatasync.c (__fdatasync): Likewise.
> * sysdeps/unix/sysv/linux/arm/pread.c (__libc_pread): Likewise.
> * sysdeps/unix/sysv/linux/arm/pread64.c (__libc_pread64): Likewise.
> * sysdeps/unix/sysv/linux/arm/pwrite.c (__libc_pwrite): Likewise.
> * sysdeps/unix/sysv/linux/arm/pwrite64.c (__libc_pwrite64): Likewise.
> * sysdeps/unix/sysv/linux/epoll_pwait.c (epoll_pwait): Likewise.
> * sysdeps/unix/sysv/linux/fallocate.c (fallocate): Likewise.
> * sysdeps/unix/sysv/linux/fallocate64.c (fallocate64): Likewise.
> * sysdeps/unix/sysv/linux/generic/open.c (__libc_open): Likewise.
> * sysdeps/unix/sysv/linux/generic/open64.c (__libc_open64): Likewise.
> * sysdeps/unix/sysv/linux/generic/pause.c (__libc_pause): Likewise.
> * sysdeps/unix/sysv/linux/generic/poll.c (__poll): Likewise.
> * sysdeps/unix/sysv/linux/generic/recv.c (__libc_recv): Likewise.
> * sysdeps/unix/sysv/linux/generic/select.c (__select): Likewise.
> * sysdeps/unix/sysv/linux/generic/send.c (__libc_send): Likewise.
> * sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c (__libc_pread):
> Likewise.
> * sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
> (__libc_pread64): Likewise.
> * sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
> (__libc_preadv): Likewise.
> * sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
> (__libc_readv64): Likewise.
> * sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c
> (__libc_pwrite): Likewise.
> * sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c
> (__libc_pwrite64): Likewise.
> * sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
> (__libc_pwritev): Likewise.
> * sysdeps/sysv/linux/generic/wordsize-32/pwritev64.c
> (__libc_pwritev64): Likewise.
> * sysdeps/unix/sysv/linux/i386/fcntl.c (__libc_fcntl): Likewise.
> * sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c
> (sync_file_range): Likewise.
> * sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c (fallocate):
> Likewise.
> * sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c (fallocate64):
> Likewise.
> * sysdeps/unix/sysv/linux/mips/pread.c (__libc_pread): Likewise.
> * sysdeps/unix/sysv/linux/mips/pread64.c (__libc_pread64): Likewise.
> * sysdeps/unix/sysv/linux/mips/pwrite.c (__libc_pwrite): Likewise.
> * sysdeps/unix/sysv/linux/mips/pwrite64.c (__libc_pwrite64): Likewise.
> * sysdeps/unix/sysv/linux/msgrcv.c (__libc_msgrcv): Likewise.
> * sysdeps/unix/sysv/linux/msgsnd.c (__libc_msgsnd): Likewise.
> * sysdeps/unix/sysv/linux/open64.c (__libc_open64): Likewise.
> * sysdeps/unix/sysv/linux/openat.c (__libc_openat): Likewise.
> * sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c (__libc_pread):
> Likewise.
> * sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
> (__libc_read64): Likewise.
> * sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c (__libc_write):
> Likewise.
> * sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c (__libc_write64):
> Likewise.
> * sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c (__libc_fcntl):
> Likewise.
> * sysdeps/unix/sysv/linux/powerpc/powerpc64/pread.c (__libc_pread):
> Likewise.
> * sysdeps/unix/sysv/linux/powerpc/powerpc64/pread64.c
> (__libc_pread64): Likewise.
> * sysdeps/unix/sysv/linux/powerpc/powerpc64/pwrite.c (__libc_pwrite):
> Likewise.
> * sysdeps/unix/sysv/linux/powerpc/powerpc64/pwrite64.c
> (__libc_pwrite64): Likewise.
> * sysdeps/sysv/linux/powerpc/powerpc64/sync_file_range.c
> (sync_file_range): Likewise.
> * sysdeps/unix/sysv/linux/ppoll.c (ppoll): Likewise.
> * sysdeps/unix/sysv/linux/pread.c (__libc_pread): Likewise.
> * sysdeps/unix/sysv/linux/pread64.c (__libc_pread64): Likewise.
> * sysdeps/unix/sysv/linux/preadv.c (__libc_preadv): Likewise.
> * sysdeps/unix/sysv/linux/pselect.c (__pselect): Likewise.
> * sysdeps/unix/sysv/linux/pwrite.c (__libc_pwrite): Likewise.
> * sysdeps/unix/sysv/linux/pwrite64.c (__libc_pwrite64): Likewise.
> * sysdeps/unix/sysv/linux/pwritev.c (PWRITEV): Likewise.
> * sysdeps/unix/sysv/linux/readv.c (__libc_readv): Likewise.
> * sysdeps/unix/sysv/linux/recvmmsg.c (recvmmsg): Likewise.
> * sysdeps/unix/sysv/linux/sendmmsg.c (sendmmsg): Likewise.
> * sysdeps/unix/sysv/linux/sh/pread.c (__libc_pread): Likewise.
> * sysdeps/unix/sysv/linux/sh/pread64.c (__libc_pread64): Likewise.
> * sysdeps/unix/sysv/linux/sh/pwrite.c (__libc_pwrite): Likewise.
> * sysdeps/unix/sysv/linux/sh/pwrite64.c (__libc_pwrite64): Likewise.
> * sysdeps/unix/sysv/linux/sigsuspend.c (__sigsuspend): Likewise.
> * sysdeps/unix/sysv/linux/sigtimedwait.c (__sigtimedwait): Likewise.
> * sysdeps/unix/sysv/linux/sigwaitinfo.c (__sigwaitinfo): Likewise.
> * sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c (__libc_msgrcv):
> Likewise.
> * sysdeps/unix/sysv/linux/sync_file_range.c (sync_file_range):
> Likewise.
> * sysdeps/unix/sysv/linux/tcdrain.c (__libc_tcdrain): Likewise.
> * sysdeps/unix/sysv/linux/timer_routines.c (timer_helper_thread):
> Likewise.
> * sysdeps/unix/sysv/linux/wait.c (__libc_wait): Likewise.
> * sysdeps/unix/sysv/linux/waitid.c (__waitid): Likewise.
> * sysdeps/unix/sysv/linux/waitpid.c (__libc_waitpid): Likewise.
> * sysdeps/unix/sysv/linux/wordsize-64/fallocate.c (fallocate):
> Likewise.
> * sysdeps/unix/sysv/linux/wordsize-64/preadv.c (preadv): Likewise.
> * sysdeps/unix/sysv/linux/wordsize-64/pwritev.c (pwritev): Likewise.
> * sysdeps/unix/sysv/linux/writev.c (__libc_writev): Likewise.
> * sysdeps/unix/sysv/linux/x86_64/recv.c (__libc_recv): Likewise.
> * sysdeps/unix/sysv/linux/x86_64/send.c (__libc_send): Likewise.
>
> --
>
> diff --git a/sysdeps/unix/sysdep.h b/sysdeps/unix/sysdep.h
> index 5fa6580..52dad58 100644
> --- a/sysdeps/unix/sysdep.h
> +++ b/sysdeps/unix/sysdep.h
> @@ -24,6 +24,27 @@
> #define SYSCALL__(name, args) PSEUDO (__##name, name, args)
> #define SYSCALL(name, args) PSEUDO (name, name, args)
>
> +/* Cancellation macros. */
> +#define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,n,...) n
> +#define __SYSCALL_NARGS(...) \
> + __SYSCALL_NARGS_X (__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1, 0,)
> +
> +#define SYSCALL_CANCEL(name, ...) \
> + ({ \
> + long int sc_ret; \
> + if (SINGLE_THREAD_P) \
> + sc_ret = INLINE_SYSCALL (name, __SYSCALL_NARGS(__VA_ARGS__), \
> + __VA_ARGS__); \
> + else \
> + { \
> + int sc_cancel_oldtype = LIBC_CANCEL_ASYNC (); \
> + sc_ret = INLINE_SYSCALL (name, __SYSCALL_NARGS (__VA_ARGS__), \
> + __VA_ARGS__); \
> + LIBC_CANCEL_RESET (sc_cancel_oldtype); \
> + } \
> + sc_ret; \
> + })
> +
> /* Machine-dependent sysdep.h files are expected to define the macro
> PSEUDO (function_name, syscall_name) to emit assembly code to define the
> C-callable function FUNCTION_NAME to do system call SYSCALL_NAME.
> @@ -31,7 +52,9 @@
> an instruction such that "MOVE(r1, r0)" works. ret should be defined
> as the return instruction. */
>
> +#ifndef SYS_ify
> #define SYS_ify(syscall_name) SYS_##syscall_name
> +#endif
>
> /* Terminate a system call named SYM. This is used on some platforms
> to generate correct debugging information. */
> @@ -47,4 +70,6 @@
>
> /* Wrappers around system calls should normally inline the system call code.
> But sometimes it is not possible or implemented and we use this code. */
> +#ifndef INLINE_SYSCALL
> #define INLINE_SYSCALL(name, nr, args...) __syscall_##name (args)
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/accept4.c b/sysdeps/unix/sysv/linux/accept4.c
> index 8e70b81..59293f9 100644
> --- a/sysdeps/unix/sysv/linux/accept4.c
> +++ b/sysdeps/unix/sysv/linux/accept4.c
> @@ -37,17 +37,7 @@
> int
> accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags)
> {
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (accept4, 4, fd, addr.__sockaddr__, addr_len, flags);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - int result = INLINE_SYSCALL (accept4, 4, fd, addr.__sockaddr__, addr_len,
> - flags);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (accept4, fd, addr.__sockaddr__, addr_len, flags);
> }
> #elif defined __NR_socketcall
> # include <socketcall.h>
> diff --git a/sysdeps/unix/sysv/linux/alpha/fdatasync.c b/sysdeps/unix/sysv/linux/alpha/fdatasync.c
> index c9424e2..c8b711e 100644
> --- a/sysdeps/unix/sysv/linux/alpha/fdatasync.c
> +++ b/sysdeps/unix/sysv/linux/alpha/fdatasync.c
> @@ -26,39 +26,23 @@
>
> #include <kernel-features.h>
>
> -static int
> -do_fdatasync (int fd)
> +int
> +__fdatasync (int fd)
> {
> #ifdef __ASSUME_FDATASYNC
> - return INLINE_SYSCALL (fdatasync, 1, fd);
> + return SYSCALL_CANCEL (fdatasync, fd);
> #elif defined __NR_fdatasync
> static int __have_no_fdatasync;
>
> if (!__builtin_expect (__have_no_fdatasync, 0))
> {
> - int result = INLINE_SYSCALL (fdatasync, 1, fd);
> + int result = SYSCALL_CANCEL (fdatasync, fd);
> if (__builtin_expect (result, 0) != -1 || errno != ENOSYS)
> return result;
>
> __have_no_fdatasync = 1;
> }
> #endif
> - return INLINE_SYSCALL (fsync, 1, fd);
> -}
> -
> -int
> -__fdatasync (int fd)
> -{
> - if (SINGLE_THREAD_P)
> - return do_fdatasync (fd);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - int result = do_fdatasync (fd);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (fsync, fd);
> }
> -
> weak_alias (__fdatasync, fdatasync)
> diff --git a/sysdeps/unix/sysv/linux/arm/pread.c b/sysdeps/unix/sysv/linux/arm/pread.c
> index 64bc0a1..91b3c66 100644
> --- a/sysdeps/unix/sysv/linux/arm/pread.c
> +++ b/sysdeps/unix/sysv/linux/arm/pread.c
> @@ -26,28 +26,10 @@
> ssize_t
> __libc_pread (int fd, void *buf, size_t count, off_t offset)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - {
> - /* In the ARM EABI, 64-bit values are aligned to even/odd register
> - pairs for syscalls. */
> - result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR (offset >> 31, offset));
> -
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> /* In the ARM EABI, 64-bit values are aligned to even/odd register
> pairs for syscalls. */
> - result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR (offset >> 31, offset));
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pread64, fd, buf, count, 0,
> + __LONG_LONG_PAIR (offset >> 31, offset));
> }
>
> strong_alias (__libc_pread, __pread)
> diff --git a/sysdeps/unix/sysv/linux/arm/pread64.c b/sysdeps/unix/sysv/linux/arm/pread64.c
> index 7860699..ca71feb 100644
> --- a/sysdeps/unix/sysv/linux/arm/pread64.c
> +++ b/sysdeps/unix/sysv/linux/arm/pread64.c
> @@ -26,30 +26,11 @@
> ssize_t
> __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - {
> - /* In the ARM EABI, 64-bit values are aligned to even/odd register
> - pairs for syscalls. */
> - result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> -
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> /* In the ARM EABI, 64-bit values are aligned to even/odd register
> pairs for syscalls. */
> - result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pread64, fd, buf, count, 0,
> + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> + (off_t) (offset & 0xffffffff)));
> }
>
> weak_alias (__libc_pread64, __pread64)
> diff --git a/sysdeps/unix/sysv/linux/arm/pwrite.c b/sysdeps/unix/sysv/linux/arm/pwrite.c
> index 11a963c..e22e112 100644
> --- a/sysdeps/unix/sysv/linux/arm/pwrite.c
> +++ b/sysdeps/unix/sysv/linux/arm/pwrite.c
> @@ -26,28 +26,10 @@
> ssize_t
> __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - {
> - /* In the ARM EABI, 64-bit values are aligned to even/odd register
> - pairs for syscalls. */
> - result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR (offset >> 31, offset));
> -
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> /* In the ARM EABI, 64-bit values are aligned to even/odd register
> pairs for syscalls. */
> - result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR (offset >> 31, offset));
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pwrite64, fd, buf, count, 0,
> + __LONG_LONG_PAIR (offset >> 31, offset));
> }
>
> strong_alias (__libc_pwrite, __pwrite)
> diff --git a/sysdeps/unix/sysv/linux/arm/pwrite64.c b/sysdeps/unix/sysv/linux/arm/pwrite64.c
> index 9cb67ff..b63fbc8 100644
> --- a/sysdeps/unix/sysv/linux/arm/pwrite64.c
> +++ b/sysdeps/unix/sysv/linux/arm/pwrite64.c
> @@ -26,30 +26,11 @@
> ssize_t
> __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - {
> - /* In the ARM EABI, 64-bit values are aligned to even/odd register
> - pairs for syscalls. */
> - result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> -
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> /* In the ARM EABI, 64-bit values are aligned to even/odd register
> pairs for syscalls. */
> - result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pwrite64, fd, buf, count, 0,
> + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> + (off_t) (offset & 0xffffffff)));
> }
>
> weak_alias (__libc_pwrite64, __pwrite64)
> diff --git a/sysdeps/unix/sysv/linux/epoll_pwait.c b/sysdeps/unix/sysv/linux/epoll_pwait.c
> index 65fefec..0e39013 100644
> --- a/sysdeps/unix/sysv/linux/epoll_pwait.c
> +++ b/sysdeps/unix/sysv/linux/epoll_pwait.c
> @@ -39,18 +39,8 @@ int epoll_pwait (int epfd, struct epoll_event *events,
> int maxevents, int timeout,
> const sigset_t *set)
> {
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (epoll_pwait, 6, epfd, events, maxevents, timeout,
> - set, _NSIG / 8);
> -
> - 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;
> + return SYSCALL_CANCEL (epoll_pwait, epfd, events, maxevents,
> + timeout, set, _NSIG / 8);
> }
>
> #else
> diff --git a/sysdeps/unix/sysv/linux/fallocate.c b/sysdeps/unix/sysv/linux/fallocate.c
> index e9668bf..f3de90c 100644
> --- a/sysdeps/unix/sysv/linux/fallocate.c
> +++ b/sysdeps/unix/sysv/linux/fallocate.c
> @@ -25,21 +25,9 @@ int
> fallocate (int fd, int mode, __off_t offset, __off_t len)
> {
> #ifdef __NR_fallocate
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (fallocate, 6, fd, mode,
> - __LONG_LONG_PAIR (offset >> 31, offset),
> - __LONG_LONG_PAIR (len >> 31, len));
> -
> - int result;
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (fallocate, 6, fd, mode,
> - __LONG_LONG_PAIR (offset >> 31, offset),
> - __LONG_LONG_PAIR (len >> 31, len));
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (fallocate, fd, mode,
> + __LONG_LONG_PAIR (offset >> 31, offset),
> + __LONG_LONG_PAIR (len >> 31, len));
> #else
> __set_errno (ENOSYS);
> return -1;
> diff --git a/sysdeps/unix/sysv/linux/fallocate64.c b/sysdeps/unix/sysv/linux/fallocate64.c
> index 96acb28..191fa57 100644
> --- a/sysdeps/unix/sysv/linux/fallocate64.c
> +++ b/sysdeps/unix/sysv/linux/fallocate64.c
> @@ -25,25 +25,11 @@ int
> fallocate64 (int fd, int mode, __off64_t offset, __off64_t len)
> {
> #ifdef __NR_fallocate
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (fallocate, 6, fd, mode,
> - __LONG_LONG_PAIR ((long int) (offset >> 32),
> - (long int) offset),
> - __LONG_LONG_PAIR ((long int) (len >> 32),
> - (long int) len));
> -
> - int result;
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (fallocate, 6, fd, mode,
> - __LONG_LONG_PAIR ((long int) (offset >> 32),
> - (long int) offset),
> - __LONG_LONG_PAIR ((long int) (len >> 32),
> - (long int) len));
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (fallocate, fd, mode,
> + __LONG_LONG_PAIR ((long int) (offset >> 32),
> + (long int) offset),
> + __LONG_LONG_PAIR ((long int) (len >> 32),
> + (long int) len));
> #else
> __set_errno (ENOSYS);
> return -1;
> diff --git a/sysdeps/unix/sysv/linux/generic/open.c b/sysdeps/unix/sysv/linux/generic/open.c
> index 289f57a..66cc2ed 100644
> --- a/sysdeps/unix/sysv/linux/generic/open.c
> +++ b/sysdeps/unix/sysv/linux/generic/open.c
> @@ -37,16 +37,7 @@ __libc_open (const char *file, int oflag, ...)
> va_end (arg);
> }
>
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (openat, 4, AT_FDCWD, file, oflag, mode);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - int result = INLINE_SYSCALL (openat, 4, AT_FDCWD, file, oflag, mode);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (openat, AT_FDCWD, file, oflag, mode);
> }
> libc_hidden_def (__libc_open)
>
> diff --git a/sysdeps/unix/sysv/linux/generic/open64.c b/sysdeps/unix/sysv/linux/generic/open64.c
> index 374e41c..402bc7c 100644
> --- a/sysdeps/unix/sysv/linux/generic/open64.c
> +++ b/sysdeps/unix/sysv/linux/generic/open64.c
> @@ -37,18 +37,7 @@ __libc_open64 (const char *file, int oflag, ...)
> va_end (arg);
> }
>
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (openat, 4, AT_FDCWD, file,
> - oflag | O_LARGEFILE, mode);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - int result = INLINE_SYSCALL (openat, 4, AT_FDCWD, file,
> - oflag | O_LARGEFILE, mode);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (openat, AT_FDCWD, file, oflag | O_LARGEFILE, mode);
> }
> weak_alias (__libc_open64, __open64)
> libc_hidden_weak (__open64)
> diff --git a/sysdeps/unix/sysv/linux/generic/pause.c b/sysdeps/unix/sysv/linux/generic/pause.c
> index 7966df2..45d3a0e 100644
> --- a/sysdeps/unix/sysv/linux/generic/pause.c
> +++ b/sysdeps/unix/sysv/linux/generic/pause.c
> @@ -23,41 +23,17 @@
> /* Suspend the process until a signal arrives.
> This always returns -1 and sets errno to EINTR. */
>
> -static int
> -__syscall_pause (void)
> +int
> +__libc_pause (void)
> {
> sigset_t set;
>
> int rc =
> - INLINE_SYSCALL (rt_sigprocmask, 4, SIG_BLOCK, NULL, &set, _NSIG / 8);
> + SYSCALL_CANCEL (rt_sigprocmask, SIG_BLOCK, NULL, &set, _NSIG / 8);
> if (rc == 0)
> - rc = INLINE_SYSCALL (rt_sigsuspend, 2, &set, _NSIG / 8);
> + rc = SYSCALL_CANCEL (rt_sigsuspend, &set, _NSIG / 8);
>
> return rc;
> }
>
> -int
> -__libc_pause (void)
> -{
> - if (SINGLE_THREAD_P)
> - return __syscall_pause ();
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - int result = __syscall_pause ();
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> -}
> weak_alias (__libc_pause, pause)
> -
> -#ifndef NO_CANCELLATION
> -# include <not-cancel.h>
> -
> -int
> -__pause_nocancel (void)
> -{
> - return __syscall_pause ();
> -}
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/generic/poll.c b/sysdeps/unix/sysv/linux/generic/poll.c
> index 7ef42f3..2a95796 100644
> --- a/sysdeps/unix/sysv/linux/generic/poll.c
> +++ b/sysdeps/unix/sysv/linux/generic/poll.c
> @@ -35,16 +35,7 @@ __poll (struct pollfd *fds, nfds_t nfds, int timeout)
> timeout_ts_p = &timeout_ts;
> }
>
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout_ts_p, NULL, 0);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - int result = INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout_ts_p, NULL, 0);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (ppoll, fds, nfds, timeout_ts_p, NULL, 0);
> }
> libc_hidden_def (__poll)
> weak_alias (__poll, poll)
> diff --git a/sysdeps/unix/sysv/linux/generic/recv.c b/sysdeps/unix/sysv/linux/generic/recv.c
> index d827b3e..3786172 100644
> --- a/sysdeps/unix/sysv/linux/generic/recv.c
> +++ b/sysdeps/unix/sysv/linux/generic/recv.c
> @@ -24,22 +24,8 @@
> ssize_t
> __libc_recv (int sockfd, void *buffer, size_t len, int flags)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - result = INLINE_SYSCALL (recvfrom, 6, sockfd, buffer, len, flags,
> - NULL, NULL);
> - else
> - {
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (recvfrom, 6, sockfd, buffer, len, flags,
> - NULL, NULL);
> -
> - LIBC_CANCEL_RESET (oldtype);
> - }
> -
> - return result;
> + return SYSCALL_CANCEL (recvfrom, sockfd, buffer, len, flags,
> + NULL, NULL);
> }
> strong_alias (__libc_recv, __recv)
> weak_alias (__libc_recv, recv)
> diff --git a/sysdeps/unix/sysv/linux/generic/select.c b/sysdeps/unix/sysv/linux/generic/select.c
> index 455c308..f7f1e18 100644
> --- a/sysdeps/unix/sysv/linux/generic/select.c
> +++ b/sysdeps/unix/sysv/linux/generic/select.c
> @@ -42,20 +42,8 @@ __select(int nfds, fd_set *readfds,
> tsp = &ts;
> }
>
> - if (SINGLE_THREAD_P)
> - {
> - result = INLINE_SYSCALL (pselect6, 6, nfds, readfds, writefds, exceptfds,
> - tsp, NULL);
> - }
> - else
> - {
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (pselect6, 6, nfds, readfds, writefds, exceptfds,
> - tsp, NULL);
> -
> - LIBC_CANCEL_RESET (oldtype);
> - }
> + result = SYSCALL_CANCEL (pselect6, nfds, readfds, writefds, exceptfds, tsp,
> + NULL);
>
> if (timeout)
> {
> diff --git a/sysdeps/unix/sysv/linux/generic/send.c b/sysdeps/unix/sysv/linux/generic/send.c
> index dfbdc09..fed6961 100644
> --- a/sysdeps/unix/sysv/linux/generic/send.c
> +++ b/sysdeps/unix/sysv/linux/generic/send.c
> @@ -24,20 +24,7 @@
> ssize_t
> __libc_send (int sockfd, const void *buffer, size_t len, int flags)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - result = INLINE_SYSCALL (sendto, 6, sockfd, buffer, len, flags, NULL, 0);
> - else
> - {
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (sendto, 6, sockfd, buffer, len, flags, NULL, 0);
> -
> - LIBC_CANCEL_RESET (oldtype);
> - }
> -
> - return result;
> + return SYSCALL_CANCEL (sendto, sockfd, buffer, len, flags, NULL, 0);
> }
> strong_alias (__libc_send, __send)
> weak_alias (__libc_send, send)
> diff --git a/sysdeps/unix/sysv/linux/generic/sysdep.h b/sysdeps/unix/sysv/linux/generic/sysdep.h
> index 160804c..11da9d2 100644
> --- a/sysdeps/unix/sysv/linux/generic/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/generic/sysdep.h
> @@ -18,6 +18,7 @@
>
> #include <bits/wordsize.h>
> #include <kernel-features.h>
> +#include <sysdeps/unix/sysdep.h>
>
> /* Provide the common name to allow more code reuse. */
> #define __NR__llseek __NR_llseek
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c
> index ad97e97..6f9703c 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c
> @@ -25,28 +25,13 @@
> #include <sysdep-cancel.h>
> #include <sys/syscall.h>
>
> -static ssize_t
> -do_pread (int fd, void *buf, size_t count, off_t offset)
> +ssize_t
> +__libc_pread (int fd, void *buf, size_t count, off_t offset)
> {
> assert (sizeof (offset) == 4);
> - return INLINE_SYSCALL (pread64, __ALIGNMENT_COUNT (5, 6), fd,
> + return SYSCALL_CANCEL (pread64, fd,
> buf, count, __ALIGNMENT_ARG
> __LONG_LONG_PAIR (offset >> 31, offset));
> }
> -
> -ssize_t
> -__libc_pread (int fd, void *buf, size_t count, off_t offset)
> -{
> - if (SINGLE_THREAD_P)
> - return do_pread (fd, buf, count, offset);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = do_pread (fd, buf, count, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> -}
> strong_alias (__libc_pread, __pread)
> weak_alias (__libc_pread, pread)
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
> index 7250893..a3f8ec1 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
> @@ -24,29 +24,11 @@
> #include <sysdep-cancel.h>
> #include <sys/syscall.h>
>
> -static ssize_t
> -do_pread64 (int fd, void *buf, size_t count, off64_t offset)
> -{
> - return INLINE_SYSCALL (pread64, __ALIGNMENT_COUNT (5, 6), fd,
> - buf, count, __ALIGNMENT_ARG
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> -}
> -
> -
> ssize_t
> __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
> {
> - if (SINGLE_THREAD_P)
> - return do_pread64 (fd, buf, count, offset);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = do_pread64 (fd, buf, count, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pread64, fd, buf, count, __ALIGNMENT_ARG
> + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> + (off_t) (offset & 0xffffffff)));
> }
> -
> weak_alias (__libc_pread64, __pread64) weak_alias (__libc_pread64, pread64)
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
> index 9a1832a..d127fee 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
> @@ -26,28 +26,13 @@
> #include <sysdep-cancel.h>
> #include <sys/syscall.h>
>
> -static ssize_t
> -do_preadv (int fd, const struct iovec *vector, int count, off_t offset)
> +ssize_t
> +__libc_preadv (int fd, const struct iovec *vector, int count, off_t offset)
> {
> assert (sizeof (offset) == 4);
> - return INLINE_SYSCALL (preadv, __ALIGNMENT_COUNT (5, 6), fd,
> + return SYSCALL_CANCEL (preadv, fd,
> vector, count, __ALIGNMENT_ARG
> __LONG_LONG_PAIR (offset >> 31, offset));
> }
> -
> -ssize_t
> -__libc_preadv (int fd, const struct iovec *vector, int count, off_t offset)
> -{
> - if (SINGLE_THREAD_P)
> - return do_preadv (fd, vector, count, offset);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = do_preadv (fd, vector, count, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> -}
> strong_alias (__libc_preadv, __preadv)
> weak_alias (__libc_preadv, preadv)
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
> index df1c010..7e7ebf7 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
> @@ -25,30 +25,14 @@
> #include <sysdep-cancel.h>
> #include <sys/syscall.h>
>
> -static ssize_t
> -do_preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
> +ssize_t
> +__libc_preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
> {
> - return INLINE_SYSCALL (preadv, __ALIGNMENT_COUNT (5, 6), fd,
> + return SYSCALL_CANCEL (preadv, fd,
> vector, count, __ALIGNMENT_ARG
> __LONG_LONG_PAIR ((off_t) (offset >> 32),
> (off_t) (offset & 0xffffffff)));
> }
>
> -
> -ssize_t
> -__libc_preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
> -{
> - if (SINGLE_THREAD_P)
> - return do_preadv64 (fd, vector, count, offset);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = do_preadv64 (fd, vector, count, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> -}
> -
> strong_alias (__libc_preadv64, __preadv64)
> weak_alias (__libc_preadv64, preadv64)
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c
> index e897c7d..2f0f7a1 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c
> @@ -25,29 +25,12 @@
> #include <sysdep-cancel.h>
> #include <sys/syscall.h>
>
> -static ssize_t
> -do_pwrite (int fd, const void *buf, size_t count, off_t offset)
> -{
> - assert (sizeof (offset) == 4);
> - return INLINE_SYSCALL (pwrite64, __ALIGNMENT_COUNT (5, 6), fd,
> - buf, count, __ALIGNMENT_ARG
> - __LONG_LONG_PAIR (offset >> 31, offset));
> -}
> -
> -
> ssize_t
> __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
> {
> - if (SINGLE_THREAD_P)
> - return do_pwrite (fd, buf, count, offset);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = do_pwrite (fd, buf, count, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + assert (sizeof (offset) == 4);
> + return SYSCALL_CANCEL (pwrite64, fd, buf, count, __ALIGNMENT_ARG
> + __LONG_LONG_PAIR (offset >> 31, offset));
> }
> strong_alias (__libc_pwrite, __pwrite)
> weak_alias (__libc_pwrite, pwrite)
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c
> index 3ac1339..f222016 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c
> @@ -24,30 +24,12 @@
> #include <sysdep-cancel.h>
> #include <sys/syscall.h>
>
> -static ssize_t
> -do_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
> -{
> - return INLINE_SYSCALL (pwrite64, __ALIGNMENT_COUNT (5, 6), fd,
> - buf, count, __ALIGNMENT_ARG
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> -}
> -
> -
> ssize_t
> __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
> {
> - if (SINGLE_THREAD_P)
> - return do_pwrite64 (fd, buf, count, offset);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = do_pwrite64 (fd, buf, count, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pwrite64, fd, buf, count, __ALIGNMENT_ARG
> + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> + (off_t) (offset & 0xffffffff)));
> }
> -
> weak_alias (__libc_pwrite64, __pwrite64)
> libc_hidden_weak (__pwrite64) weak_alias (__libc_pwrite64, pwrite64)
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
> index db1e4cb..273b0ff 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
> @@ -26,29 +26,12 @@
> #include <sysdep-cancel.h>
> #include <sys/syscall.h>
>
> -static ssize_t
> -do_pwritev (int fd, const struct iovec *vector, int count, off_t offset)
> -{
> - assert (sizeof (offset) == 4);
> - return INLINE_SYSCALL (pwritev, __ALIGNMENT_COUNT (5, 6), fd,
> - vector, count, __ALIGNMENT_ARG
> - __LONG_LONG_PAIR (offset >> 31, offset));
> -}
> -
> -
> ssize_t
> __libc_pwritev (int fd, const struct iovec *vector, int count, off_t offset)
> {
> - if (SINGLE_THREAD_P)
> - return do_pwritev (fd, vector, count, offset);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = do_pwritev (fd, vector, count, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + assert (sizeof (offset) == 4);
> + return SYSCALL_CANCEL (pwritev, fd, vector, count, __ALIGNMENT_ARG
> + __LONG_LONG_PAIR (offset >> 31, offset));
> }
> strong_alias (__libc_pwritev, __pwritev)
> weak_alias (__libc_pwritev, pwritev)
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c
> index eb85e07..9d3fa75 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c
> @@ -25,31 +25,14 @@
> #include <sysdep-cancel.h>
> #include <sys/syscall.h>
>
> -static ssize_t
> -do_pwritev64 (int fd, const struct iovec *vector, int count, off64_t offset)
> -{
> - return INLINE_SYSCALL (pwritev, __ALIGNMENT_COUNT (5, 6), fd,
> - vector, count, __ALIGNMENT_ARG
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> -}
> -
> -
> ssize_t
> __libc_pwritev64 (int fd, const struct iovec *vector, int count,
> off64_t offset)
> {
> - if (SINGLE_THREAD_P)
> - return do_pwritev64 (fd, vector, count, offset);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = do_pwritev64 (fd, vector, count, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pwritev, fd,
> + vector, count, __ALIGNMENT_ARG
> + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> + (off_t) (offset & 0xffffffff)));
> }
> -
> strong_alias (__libc_pwritev64, pwritev64)
> weak_alias (__libc_pwritev64, __pwritev64)
> diff --git a/sysdeps/unix/sysv/linux/i386/fcntl.c b/sysdeps/unix/sysv/linux/i386/fcntl.c
> index 9132c5a..56f4bd1 100644
> --- a/sysdeps/unix/sysv/linux/i386/fcntl.c
> +++ b/sysdeps/unix/sysv/linux/i386/fcntl.c
> @@ -49,16 +49,10 @@ __libc_fcntl (int fd, int cmd, ...)
> arg = va_arg (ap, void *);
> va_end (ap);
>
> - if (SINGLE_THREAD_P || (cmd != F_SETLKW && cmd != F_SETLKW64))
> + if ((cmd != F_SETLKW) && (cmd != F_SETLKW64))
> return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
>
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - int result = INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (fcntl64, fd, cmd, arg);
> }
> libc_hidden_def (__libc_fcntl)
>
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c b/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c
> index 3c91d15..b79e44d 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c
> @@ -28,23 +28,10 @@
> int
> sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
> {
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (sync_file_range, 7, fd, 0,
> - __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> - __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
> - flags);
> -
> - int result;
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (sync_file_range, 7, fd, 0,
> - __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> - __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
> - flags);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (sync_file_range, fd, 0,
> + __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> + __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
> + flags);
> }
> #else
> int
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c
> index 2331cec..ce29a0e 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c
> @@ -25,17 +25,7 @@ int
> fallocate (int fd, int mode, __off_t offset, __off_t len)
> {
> #ifdef __NR_fallocate
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
> -
> - int result;
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (fallocate, fd, mode, offset, len);
> #else
> __set_errno (ENOSYS);
> return -1;
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c
> index d3ed5d1..077127e 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c
> @@ -25,17 +25,7 @@ int
> fallocate64 (int fd, int mode, __off64_t offset, __off64_t len)
> {
> #ifdef __NR_fallocate
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
> -
> - int result;
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (fallocate, fd, mode, offset, len);
> #else
> __set_errno (ENOSYS);
> return -1;
> diff --git a/sysdeps/unix/sysv/linux/mips/pread.c b/sysdeps/unix/sysv/linux/mips/pread.c
> index a7b1618..0bd712d 100644
> --- a/sysdeps/unix/sysv/linux/mips/pread.c
> +++ b/sysdeps/unix/sysv/linux/mips/pread.c
> @@ -38,35 +38,16 @@
> ssize_t
> __libc_pread (int fd, void *buf, size_t count, off_t offset)
> {
> - ssize_t result;
> -
> #if _MIPS_SIM != _ABI64
> assert (sizeof (offset) == 4);
> #endif
>
> - if (SINGLE_THREAD_P)
> - {
> -#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> - result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
> -#else
> - result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR (offset >> 31, offset));
> -#endif
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> #if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> - result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
> + return SYSCALL_CANCEL (pread, fd, buf, count, offset);
> #else
> - result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR (offset >> 31, offset));
> + return SYSCALL_CANCEL (pread, fd, buf, count, 0,
> + __LONG_LONG_PAIR (offset >> 31, offset));
> #endif
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> }
>
> strong_alias (__libc_pread, __pread)
> diff --git a/sysdeps/unix/sysv/linux/mips/pread64.c b/sysdeps/unix/sysv/linux/mips/pread64.c
> index ad948aa..3ed100b 100644
> --- a/sysdeps/unix/sysv/linux/mips/pread64.c
> +++ b/sysdeps/unix/sysv/linux/mips/pread64.c
> @@ -37,34 +37,13 @@
> ssize_t
> __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
> {
> - ssize_t result;
> -
> -
> - if (SINGLE_THREAD_P)
> - {
> #if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> - result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
> + return SYSCALL_CANCEL (pread, fd, buf, count, offset);
> #else
> - result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> + return SYSCALL_CANCEL (pread, fd, buf, count, 0,
> + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> + (off_t) (offset & 0xffffffff)));
> #endif
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> - result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
> -#else
> - result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> -#endif
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> }
>
> weak_alias (__libc_pread64, __pread64)
> diff --git a/sysdeps/unix/sysv/linux/mips/pwrite.c b/sysdeps/unix/sysv/linux/mips/pwrite.c
> index 2c38e04..f4d71d4 100644
> --- a/sysdeps/unix/sysv/linux/mips/pwrite.c
> +++ b/sysdeps/unix/sysv/linux/mips/pwrite.c
> @@ -38,35 +38,16 @@
> ssize_t
> __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
> {
> - ssize_t result;
> -
> #if _MIPS_SIM != _ABI64
> assert (sizeof (offset) == 4);
> #endif
>
> - if (SINGLE_THREAD_P)
> - {
> -#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> - result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
> -#else
> - result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR (offset >> 31, offset));
> -#endif
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> #if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> - result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
> + return SYSCALL_CANCEL (pwrite, fd, buf, count, offset);
> #else
> - result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR (offset >> 31, offset));
> + return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
> + __LONG_LONG_PAIR (offset >> 31, offset));
> #endif
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> }
>
> strong_alias (__libc_pwrite, __pwrite)
> diff --git a/sysdeps/unix/sysv/linux/mips/pwrite64.c b/sysdeps/unix/sysv/linux/mips/pwrite64.c
> index 504c88a..ac0dc40 100644
> --- a/sysdeps/unix/sysv/linux/mips/pwrite64.c
> +++ b/sysdeps/unix/sysv/linux/mips/pwrite64.c
> @@ -37,34 +37,13 @@
> ssize_t
> __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - {
> #if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> - result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
> + return SYSCALL_CANCEL (pwrite, fd, buf, count, offset);
> #else
> - result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> + return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
> + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> + (off_t) (offset & 0xffffffff)));
> #endif
> -
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> - result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
> -#else
> - result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> -#endif
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> }
>
> weak_alias (__libc_pwrite64, __pwrite64)
> diff --git a/sysdeps/unix/sysv/linux/msgrcv.c b/sysdeps/unix/sysv/linux/msgrcv.c
> index 1c3698c..660ff29 100644
> --- a/sysdeps/unix/sysv/linux/msgrcv.c
> +++ b/sysdeps/unix/sysv/linux/msgrcv.c
> @@ -43,16 +43,6 @@ __libc_msgrcv (int msqid, void *msgp, size_t msgsz, long int msgtyp,
> tmp.msgp = msgp;
> tmp.msgtyp = msgtyp;
>
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (ipc, 5, IPCOP_msgrcv, msqid, msgsz, msgflg, &tmp);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = INLINE_SYSCALL (ipc, 5, IPCOP_msgrcv, msqid, msgsz, msgflg,
> - &tmp);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (ipc, IPCOP_msgrcv, msqid, msgsz, msgflg, &tmp);
> }
> weak_alias (__libc_msgrcv, msgrcv)
> diff --git a/sysdeps/unix/sysv/linux/msgsnd.c b/sysdeps/unix/sysv/linux/msgsnd.c
> index d548aab..dfed539 100644
> --- a/sysdeps/unix/sysv/linux/msgsnd.c
> +++ b/sysdeps/unix/sysv/linux/msgsnd.c
> @@ -26,17 +26,7 @@
> int
> __libc_msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg)
> {
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (ipc, 5, IPCOP_msgsnd, msqid, msgsz,
> - msgflg, (void *) msgp);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - int result = INLINE_SYSCALL (ipc, 5, IPCOP_msgsnd, msqid, msgsz,
> - msgflg, (void *) msgp);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (ipc, IPCOP_msgsnd, msqid, msgsz, msgflg,
> + (void *) msgp);
> }
> weak_alias (__libc_msgsnd, msgsnd)
> diff --git a/sysdeps/unix/sysv/linux/open64.c b/sysdeps/unix/sysv/linux/open64.c
> index d3ab813..b90294a 100644
> --- a/sysdeps/unix/sysv/linux/open64.c
> +++ b/sysdeps/unix/sysv/linux/open64.c
> @@ -36,16 +36,7 @@ __libc_open64 (const char *file, int oflag, ...)
> va_end (arg);
> }
>
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (open, 3, file, oflag | O_LARGEFILE, mode);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - int result = INLINE_SYSCALL (open, 3, file, oflag | O_LARGEFILE, mode);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (open, file, oflag | O_LARGEFILE, mode);
> }
> weak_alias (__libc_open64, __open64)
> libc_hidden_weak (__open64)
> diff --git a/sysdeps/unix/sysv/linux/openat.c b/sysdeps/unix/sysv/linux/openat.c
> index 30d8e6e..6777123 100644
> --- a/sysdeps/unix/sysv/linux/openat.c
> +++ b/sysdeps/unix/sysv/linux/openat.c
> @@ -68,16 +68,7 @@ __OPENAT (int fd, const char *file, int oflag, ...)
> va_end (arg);
> }
>
> - if (SINGLE_THREAD_P)
> - return OPENAT_NOT_CANCEL (fd, file, oflag, mode);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - int res = OPENAT_NOT_CANCEL (fd, file, oflag, mode);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return res;
> + return SYSCALL_CANCEL (openat, fd, file, oflag, mode);
> }
> libc_hidden_def (__OPENAT)
> weak_alias (__OPENAT, OPENAT)
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c
> index 10763f5..f6b7f43 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c
> @@ -26,26 +26,8 @@
> ssize_t
> __libc_pread (int fd, void *buf, size_t count, off_t offset)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - {
> - /* On PPC32 64bit values are aligned in odd/even register pairs. */
> - result = INLINE_SYSCALL (pread, 6, fd, buf, count,
> - 0, offset >> 31, offset);
> -
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> /* On PPC32 64bit values are aligned in odd/even register pairs. */
> - result = INLINE_SYSCALL (pread, 6, fd, buf, count,
> - 0, offset >> 31, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pread, fd, buf, count, 0, offset >> 31, offset);
> }
>
> strong_alias (__libc_pread, __pread)
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
> index f3dc7e5..75ee34b 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
> @@ -26,28 +26,9 @@
> ssize_t
> __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - {
> - /* On PPC32 64bit values are aligned in odd/even register pairs. */
> - result = INLINE_SYSCALL (pread, 6, fd, buf, count,
> - 0, (long) (offset >> 32),
> - (long) offset);
> -
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> /* On PPC32 64bit values are aligned in odd/even register pairs. */
> - result = INLINE_SYSCALL (pread, 6, fd, buf, count,
> - 0, (long) (offset >> 32),
> - (long) offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pread, fd, buf, count, 0, (long) (offset >> 32),
> + (long) offset);
> }
>
> weak_alias (__libc_pread64, __pread64)
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c
> index 65109ed..fc822d7 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c
> @@ -27,26 +27,8 @@
> ssize_t
> __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - {
> - /* On PPC32 64bit values are aligned in odd/even register pairs. */
> - result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
> - 0, offset >> 31, offset);
> -
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> /* On PPC32 64bit values are aligned in odd/even register pairs. */
> - result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
> - 0, offset >> 31, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pwrite, fd, buf, count, 0, offset >> 31, offset);
> }
>
> strong_alias (__libc_pwrite, __pwrite)
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c
> index 77749c9..dbeaed8 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c
> @@ -26,28 +26,9 @@
> ssize_t
> __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - {
> /* On PPC32 64bit values are aligned in odd/even register pairs. */
> - result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
> - 0, (long) (offset >> 32),
> - (long) offset);
> -
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - /* On PPC32 64bit values are aligned in odd/even register pairs. */
> - result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
> - 0, (long) (offset >> 32),
> - (long) offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pwrite, fd, buf, count, 0, (long) (offset >> 32),
> + (long) offset);
> }
>
> weak_alias (__libc_pwrite64, __pwrite64)
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
> index a4f90b6..69031ba 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
> @@ -53,16 +53,10 @@ __libc_fcntl (int fd, int cmd, ...)
> if (cmd >= F_GETLK64 && cmd <= F_SETLKW64)
> cmd -= F_GETLK64 - F_GETLK;
>
> - if (SINGLE_THREAD_P || cmd != F_SETLKW)
> + if (cmd != F_SETLKW)
> return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
>
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - int result = INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (fcntl, fd, cmd, arg);
> }
> libc_hidden_def (__libc_fcntl)
>
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sync_file_range.c b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sync_file_range.c
> index 18bb0dd..9f46458 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sync_file_range.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sync_file_range.c
> @@ -28,17 +28,7 @@
> int
> sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
> {
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (sync_file_range2, 4, fd, flags, from, to);
> -
> - int result;
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (sync_file_range2, 4, fd, flags, from, to);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (sync_file_range2, fd, flags, from, to);
> }
> #else
> int
> diff --git a/sysdeps/unix/sysv/linux/ppoll.c b/sysdeps/unix/sysv/linux/ppoll.c
> index 6e83424..77a2e7e 100644
> --- a/sysdeps/unix/sysv/linux/ppoll.c
> +++ b/sysdeps/unix/sysv/linux/ppoll.c
> @@ -47,17 +47,7 @@ ppoll (struct pollfd *fds, nfds_t nfds, const struct timespec *timeout,
>
> int result;
>
> - if (SINGLE_THREAD_P)
> - result = INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout, sigmask, _NSIG / 8);
> - else
> - {
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout, sigmask,
> - _NSIG / 8);
> -
> - LIBC_CANCEL_RESET (oldtype);
> - }
> + result = SYSCALL_CANCEL (ppoll, fds, nfds, timeout, sigmask, _NSIG / 8);
>
> # ifndef __ASSUME_PPOLL
> if (result == -1 && errno == ENOSYS)
> diff --git a/sysdeps/unix/sysv/linux/pread.c b/sysdeps/unix/sysv/linux/pread.c
> index 5c1b174..09389e4 100644
> --- a/sysdeps/unix/sysv/linux/pread.c
> +++ b/sysdeps/unix/sysv/linux/pread.c
> @@ -32,36 +32,17 @@
> #endif
>
>
> -static ssize_t
> -#ifdef NO_CANCELLATION
> -inline __attribute ((always_inline))
> -#endif
> -do_pread (int fd, void *buf, size_t count, off_t offset)
> +ssize_t
> +__libc_pread (int fd, void *buf, size_t count, off_t offset)
> {
> ssize_t result;
>
> assert (sizeof (offset) == 4);
> - result = INLINE_SYSCALL (pread, 5, fd, buf, count,
> + result = SYSCALL_CANCEL (pread, fd, buf, count,
> __LONG_LONG_PAIR (offset >> 31, offset));
>
> return result;
> }
>
> -
> -ssize_t
> -__libc_pread (int fd, void *buf, size_t count, off_t offset)
> -{
> - if (SINGLE_THREAD_P)
> - return do_pread (fd, buf, count, offset);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = do_pread (fd, buf, count, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> -}
> -
> strong_alias (__libc_pread, __pread)
> weak_alias (__libc_pread, pread)
> diff --git a/sysdeps/unix/sysv/linux/pread64.c b/sysdeps/unix/sysv/linux/pread64.c
> index a8cfb5d..baf2355 100644
> --- a/sysdeps/unix/sysv/linux/pread64.c
> +++ b/sysdeps/unix/sysv/linux/pread64.c
> @@ -31,32 +31,12 @@
> #endif
>
>
> -static ssize_t
> -do_pread64 (int fd, void *buf, size_t count, off64_t offset)
> -{
> - ssize_t result;
> -
> - result = INLINE_SYSCALL (pread, 5, fd, buf, count,
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> -
> - return result;
> -}
> -
> -
> ssize_t
> __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
> {
> - if (SINGLE_THREAD_P)
> - return do_pread64 (fd, buf, count, offset);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = do_pread64 (fd, buf, count, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pread, fd, buf, count,
> + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> + (off_t) (offset & 0xffffffff)));
> }
>
> weak_alias (__libc_pread64, __pread64)
> diff --git a/sysdeps/unix/sysv/linux/preadv.c b/sysdeps/unix/sysv/linux/preadv.c
> index 091f9a7..2d08be4 100644
> --- a/sysdeps/unix/sysv/linux/preadv.c
> +++ b/sysdeps/unix/sysv/linux/preadv.c
> @@ -53,18 +53,8 @@ PREADV (int fd, const struct iovec *vector, int count, OFF_T offset)
> #ifdef __NR_preadv
> ssize_t result;
>
> - if (SINGLE_THREAD_P)
> - result = INLINE_SYSCALL (preadv, 5, fd, vector, count,
> - LO_HI_LONG (offset));
> - else
> - {
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (preadv, 5, fd, vector, count,
> - LO_HI_LONG (offset));
> -
> - LIBC_CANCEL_RESET (oldtype);
> - }
> + result = SYSCALL_CANCEL (preadv, fd, vector, count, LO_HI_LONG (offset));
> +
> # ifdef __ASSUME_PREADV
> return result;
> # endif
> diff --git a/sysdeps/unix/sysv/linux/pselect.c b/sysdeps/unix/sysv/linux/pselect.c
> index f342a13..30d51d7 100644
> --- a/sysdeps/unix/sysv/linux/pselect.c
> +++ b/sysdeps/unix/sysv/linux/pselect.c
> @@ -63,22 +63,11 @@ __pselect (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
>
> #ifndef CALL_PSELECT6
> # define CALL_PSELECT6(nfds, readfds, writefds, exceptfds, timeout, data) \
> - INLINE_SYSCALL (pselect6, 6, nfds, readfds, writefds, exceptfds, \
> - timeout, data)
> + SYSCALL_CANCEL (pselect6, nfds, readfds, writefds, exceptfds, timeout, data)
> #endif
>
> - if (SINGLE_THREAD_P)
> - result = CALL_PSELECT6 (nfds, readfds, writefds, exceptfds, timeout,
> - &data);
> - else
> - {
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = CALL_PSELECT6 (nfds, readfds, writefds, exceptfds, timeout,
> - &data);
> -
> - LIBC_CANCEL_RESET (oldtype);
> - }
> + result = CALL_PSELECT6 (nfds, readfds, writefds, exceptfds, timeout,
> + &data);
>
> # ifndef __ASSUME_PSELECT
> if (result == -1 && errno == ENOSYS)
> diff --git a/sysdeps/unix/sysv/linux/pwrite.c b/sysdeps/unix/sysv/linux/pwrite.c
> index 80c2e22..b77985d 100644
> --- a/sysdeps/unix/sysv/linux/pwrite.c
> +++ b/sysdeps/unix/sysv/linux/pwrite.c
> @@ -32,36 +32,17 @@
> #endif
>
>
> -static ssize_t
> -#ifdef NO_CANCELLATION
> -inline __attribute ((always_inline))
> -#endif
> -do_pwrite (int fd, const void *buf, size_t count, off_t offset)
> +ssize_t
> +__libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
> {
> ssize_t result;
>
> assert (sizeof (offset) == 4);
> - result = INLINE_SYSCALL (pwrite, 5, fd, buf, count,
> + result = SYSCALL_CANCEL (pwrite, fd, buf, count,
> __LONG_LONG_PAIR (offset >> 31, offset));
>
> return result;
> }
>
> -
> -ssize_t
> -__libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
> -{
> - if (SINGLE_THREAD_P)
> - return do_pwrite (fd, buf, count, offset);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = do_pwrite (fd, buf, count, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> -}
> -
> strong_alias (__libc_pwrite, __pwrite)
> weak_alias (__libc_pwrite, pwrite)
> diff --git a/sysdeps/unix/sysv/linux/pwrite64.c b/sysdeps/unix/sysv/linux/pwrite64.c
> index 7fce75a..a5d0fb7 100644
> --- a/sysdeps/unix/sysv/linux/pwrite64.c
> +++ b/sysdeps/unix/sysv/linux/pwrite64.c
> @@ -31,34 +31,13 @@
> #endif
>
>
> -static ssize_t
> -do_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
> -{
> - ssize_t result;
> -
> - result = INLINE_SYSCALL (pwrite, 5, fd, buf, count,
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> -
> - return result;
> -}
> -
> -
> ssize_t
> __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
> {
> - if (SINGLE_THREAD_P)
> - return do_pwrite64 (fd, buf, count, offset);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = do_pwrite64 (fd, buf, count, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pwrite, fd, buf, count,
> + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> + (off_t) (offset & 0xffffffff)));
> }
> -
> weak_alias (__libc_pwrite64, __pwrite64)
> libc_hidden_weak (__pwrite64)
> weak_alias (__libc_pwrite64, pwrite64)
> diff --git a/sysdeps/unix/sysv/linux/pwritev.c b/sysdeps/unix/sysv/linux/pwritev.c
> index 91e58b5..7aa9238 100644
> --- a/sysdeps/unix/sysv/linux/pwritev.c
> +++ b/sysdeps/unix/sysv/linux/pwritev.c
> @@ -53,18 +53,8 @@ PWRITEV (int fd, const struct iovec *vector, int count, OFF_T offset)
> #ifdef __NR_pwritev
> ssize_t result;
>
> - if (SINGLE_THREAD_P)
> - result = INLINE_SYSCALL (pwritev, 5, fd, vector, count,
> - LO_HI_LONG (offset));
> - else
> - {
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (pwritev, 5, fd, vector, count,
> - LO_HI_LONG (offset));
> -
> - LIBC_CANCEL_RESET (oldtype);
> - }
> + result = SYSCALL_CANCEL (pwritev, fd, vector, count, LO_HI_LONG (offset));
> +
> # ifdef __ASSUME_PWRITEV
> return result;
> # endif
> diff --git a/sysdeps/unix/sysv/linux/recvmmsg.c b/sysdeps/unix/sysv/linux/recvmmsg.c
> index 73b3ee0..4063368 100644
> --- a/sysdeps/unix/sysv/linux/recvmmsg.c
> +++ b/sysdeps/unix/sysv/linux/recvmmsg.c
> @@ -37,16 +37,7 @@ int
> recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
> struct timespec *tmo)
> {
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (recvmmsg, 5, fd, vmessages, vlen, flags, tmo);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - int result = INLINE_SYSCALL (recvmmsg, 5, fd, vmessages, vlen, flags, tmo);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags, tmo);
> }
> #elif defined __NR_socketcall
> # include <socketcall.h>
> diff --git a/sysdeps/unix/sysv/linux/sendmmsg.c b/sysdeps/unix/sysv/linux/sendmmsg.c
> index 7bad328..dc0aa75 100644
> --- a/sysdeps/unix/sysv/linux/sendmmsg.c
> +++ b/sysdeps/unix/sysv/linux/sendmmsg.c
> @@ -36,16 +36,7 @@
> int
> __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
> {
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (sendmmsg, 4, fd, vmessages, vlen, flags);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - int result = INLINE_SYSCALL (sendmmsg, 4, fd, vmessages, vlen, flags);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags);
> }
> libc_hidden_def (__sendmmsg)
> weak_alias (__sendmmsg, sendmmsg)
> diff --git a/sysdeps/unix/sysv/linux/sh/pread.c b/sysdeps/unix/sysv/linux/sh/pread.c
> index 9d4b5de..2f926b3 100644
> --- a/sysdeps/unix/sysv/linux/sh/pread.c
> +++ b/sysdeps/unix/sysv/linux/sh/pread.c
> @@ -35,23 +35,8 @@
> ssize_t
> __libc_pread (int fd, void *buf, size_t count, off_t offset)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - {
> - result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR (offset >> 31, offset));
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR (offset >> 31, offset));
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pread, fd, buf, count, 0,
> + __LONG_LONG_PAIR (offset >> 31, offset));
> }
>
> strong_alias (__libc_pread, __pread)
> diff --git a/sysdeps/unix/sysv/linux/sh/pread64.c b/sysdeps/unix/sysv/linux/sh/pread64.c
> index 195eacc..697718d 100644
> --- a/sysdeps/unix/sysv/linux/sh/pread64.c
> +++ b/sysdeps/unix/sysv/linux/sh/pread64.c
> @@ -34,25 +34,9 @@
> ssize_t
> __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - {
> - result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pread, fd, buf, count, 0,
> + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> + (off_t) (offset & 0xffffffff)));
> }
>
> weak_alias (__libc_pread64, __pread64)
> diff --git a/sysdeps/unix/sysv/linux/sh/pwrite.c b/sysdeps/unix/sysv/linux/sh/pwrite.c
> index c187d0a..fcbb7fc 100644
> --- a/sysdeps/unix/sysv/linux/sh/pwrite.c
> +++ b/sysdeps/unix/sysv/linux/sh/pwrite.c
> @@ -35,23 +35,8 @@
> ssize_t
> __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - {
> - result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR (offset >> 31, offset));
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR (offset >> 31, offset));
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
> + __LONG_LONG_PAIR (offset >> 31, offset));
> }
>
> strong_alias (__libc_pwrite, __pwrite)
> diff --git a/sysdeps/unix/sysv/linux/sh/pwrite64.c b/sysdeps/unix/sysv/linux/sh/pwrite64.c
> index 0d15ca2..0c189fe 100644
> --- a/sysdeps/unix/sysv/linux/sh/pwrite64.c
> +++ b/sysdeps/unix/sysv/linux/sh/pwrite64.c
> @@ -34,26 +34,9 @@
> ssize_t
> __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
> {
> - ssize_t result;
> -
> - if (SINGLE_THREAD_P)
> - {
> - result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> -
> - return result;
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> - __LONG_LONG_PAIR ((off_t) (offset >> 32),
> - (off_t) (offset & 0xffffffff)));
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
> + __LONG_LONG_PAIR ((off_t) (offset >> 32),
> + (off_t) (offset & 0xffffffff)));
> }
>
> weak_alias (__libc_pwrite64, __pwrite64)
> diff --git a/sysdeps/unix/sysv/linux/sigsuspend.c b/sysdeps/unix/sysv/linux/sigsuspend.c
> index 89c5d65..9047623 100644
> --- a/sysdeps/unix/sysv/linux/sigsuspend.c
> +++ b/sysdeps/unix/sysv/linux/sigsuspend.c
> @@ -22,38 +22,13 @@
> #include <sysdep-cancel.h>
> #include <sys/syscall.h>
>
> -
> -static inline int __attribute__ ((always_inline))
> -do_sigsuspend (const sigset_t *set)
> -{
> - return INLINE_SYSCALL (rt_sigsuspend, 2, set, _NSIG / 8);
> -}
> -
> /* Change the set of blocked signals to SET,
> wait until a signal arrives, and restore the set of blocked signals. */
> int
> __sigsuspend (const sigset_t *set)
> {
> - if (SINGLE_THREAD_P)
> - return do_sigsuspend (set);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - int result = do_sigsuspend (set);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (rt_sigsuspend, set, _NSIG / 8);
> }
> libc_hidden_def (__sigsuspend)
> weak_alias (__sigsuspend, sigsuspend)
> strong_alias (__sigsuspend, __libc_sigsuspend)
> -
> -#ifndef NO_CANCELLATION
> -int
> -__sigsuspend_nocancel (set)
> - const sigset_t *set;
> -{
> - return do_sigsuspend (set);
> -}
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/sigtimedwait.c b/sysdeps/unix/sysv/linux/sigtimedwait.c
> index 209198e..a2e5b41 100644
> --- a/sysdeps/unix/sysv/linux/sigtimedwait.c
> +++ b/sysdeps/unix/sysv/linux/sigtimedwait.c
> @@ -25,9 +25,9 @@
>
> #ifdef __NR_rt_sigtimedwait
>
> -static int
> -do_sigtimedwait (const sigset_t *set, siginfo_t *info,
> - const struct timespec *timeout)
> +int
> +__sigtimedwait (const sigset_t *set, siginfo_t *info,
> + const struct timespec *timeout)
> {
> #ifdef SIGCANCEL
> sigset_t tmpset;
> @@ -51,8 +51,7 @@ do_sigtimedwait (const sigset_t *set, siginfo_t *info,
>
> /* XXX The size argument hopefully will have to be changed to the
> real size of the user-level sigset_t. */
> - int result = INLINE_SYSCALL (rt_sigtimedwait, 4, set,
> - info, timeout, _NSIG / 8);
> + int result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, timeout, _NSIG / 8);
>
> /* The kernel generates a SI_TKILL code in si_code in case tkill is
> used. tkill is transparently used in raise(). Since having
> @@ -63,26 +62,6 @@ do_sigtimedwait (const sigset_t *set, siginfo_t *info,
>
> return result;
> }
> -
> -
> -/* Return any pending signal or wait for one for the given time. */
> -int
> -__sigtimedwait (const sigset_t *set, siginfo_t *info,
> - const struct timespec *timeout)
> -{
> - if (SINGLE_THREAD_P)
> - return do_sigtimedwait (set, info, timeout);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - /* XXX The size argument hopefully will have to be changed to the
> - real size of the user-level sigset_t. */
> - int result = do_sigtimedwait (set, info, timeout);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> -}
> libc_hidden_def (__sigtimedwait)
> weak_alias (__sigtimedwait, sigtimedwait)
> #else
> diff --git a/sysdeps/unix/sysv/linux/sigwaitinfo.c b/sysdeps/unix/sysv/linux/sigwaitinfo.c
> index fe23c9f..47e6dd6 100644
> --- a/sysdeps/unix/sysv/linux/sigwaitinfo.c
> +++ b/sysdeps/unix/sysv/linux/sigwaitinfo.c
> @@ -27,8 +27,9 @@
>
> #ifdef __NR_rt_sigtimedwait
>
> -static int
> -do_sigwaitinfo (const sigset_t *set, siginfo_t *info)
> +/* Return any pending signal or wait for one for the given time. */
> +int
> +__sigwaitinfo (const sigset_t *set, siginfo_t *info)
> {
> #ifdef SIGCANCEL
> sigset_t tmpset;
> @@ -52,8 +53,7 @@ do_sigwaitinfo (const sigset_t *set, siginfo_t *info)
>
> /* XXX The size argument hopefully will have to be changed to the
> real size of the user-level sigset_t. */
> - int result = INLINE_SYSCALL (rt_sigtimedwait, 4, set,
> - info, NULL, _NSIG / 8);
> + int result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, NULL, _NSIG / 8);
>
> /* The kernel generates a SI_TKILL code in si_code in case tkill is
> used. tkill is transparently used in raise(). Since having
> @@ -65,24 +65,6 @@ do_sigwaitinfo (const sigset_t *set, siginfo_t *info)
> return result;
> }
>
> -
> -/* Return any pending signal or wait for one for the given time. */
> -int
> -__sigwaitinfo (const sigset_t *set, siginfo_t *info)
> -{
> - if (SINGLE_THREAD_P)
> - return do_sigwaitinfo (set, info);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - /* XXX The size argument hopefully will have to be changed to the
> - real size of the user-level sigset_t. */
> - int result = do_sigwaitinfo (set, info);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> -}
> libc_hidden_def (__sigwaitinfo)
> weak_alias (__sigwaitinfo, sigwaitinfo)
> #else
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c b/sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c
> index 8928060..169ac53 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c
> @@ -26,17 +26,7 @@ ssize_t
> __libc_msgrcv (int msqid, void *msgp, size_t msgsz, long int msgtyp,
> int msgflg)
> {
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (ipc, 6, IPCOP_msgrcv, msqid, msgsz, msgflg,
> - msgp, msgtyp);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = INLINE_SYSCALL (ipc, 6, IPCOP_msgrcv, msqid, msgsz, msgflg,
> - msgp, msgtyp);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (ipc, IPCOP_msgrcv, msqid, msgsz, msgflg,
> + msgp, msgtyp);
> }
> weak_alias (__libc_msgrcv, msgrcv)
> diff --git a/sysdeps/unix/sysv/linux/sync_file_range.c b/sysdeps/unix/sysv/linux/sync_file_range.c
> index c07ece0..2ea6dcf 100644
> --- a/sysdeps/unix/sysv/linux/sync_file_range.c
> +++ b/sysdeps/unix/sysv/linux/sync_file_range.c
> @@ -28,43 +28,18 @@
> int
> sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
> {
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (sync_file_range, 6, fd,
> - __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> - __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
> - flags);
> -
> - int result;
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (sync_file_range, 6, fd,
> - __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> - __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
> - flags);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (sync_file_range, fd,
> + __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> + __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
> + flags);
> }
> #elif defined __NR_sync_file_range2
> int
> sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
> {
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (sync_file_range2, 6, fd, flags,
> - __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> - __LONG_LONG_PAIR ((long) (to >> 32), (long) to));
> -
> - int result;
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (sync_file_range2, 6, fd, flags,
> - __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> - __LONG_LONG_PAIR ((long) (to >> 32), (long) to));
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (sync_file_range2, fd, flags,
> + __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> + __LONG_LONG_PAIR ((long) (to >> 32), (long) to));
> }
> #else
> int
> diff --git a/sysdeps/unix/sysv/linux/tcdrain.c b/sysdeps/unix/sysv/linux/tcdrain.c
> index c0f2e1d..f60dd4d 100644
> --- a/sysdeps/unix/sysv/linux/tcdrain.c
> +++ b/sysdeps/unix/sysv/linux/tcdrain.c
> @@ -24,17 +24,7 @@
> int
> __libc_tcdrain (int fd)
> {
> - if (SINGLE_THREAD_P)
> - /* With an argument of 1, TCSBRK for output to be drain. */
> - return INLINE_SYSCALL (ioctl, 3, fd, TCSBRK, 1);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> /* With an argument of 1, TCSBRK for output to be drain. */
> - int result = INLINE_SYSCALL (ioctl, 3, fd, TCSBRK, 1);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (ioctl, fd, TCSBRK, 1);
> }
> weak_alias (__libc_tcdrain, tcdrain)
> diff --git a/sysdeps/unix/sysv/linux/timer_routines.c b/sysdeps/unix/sysv/linux/timer_routines.c
> index 4401a8b..4cf6eca 100644
> --- a/sysdeps/unix/sysv/linux/timer_routines.c
> +++ b/sysdeps/unix/sysv/linux/timer_routines.c
> @@ -20,7 +20,7 @@
> #include <setjmp.h>
> #include <signal.h>
> #include <stdbool.h>
> -#include <sysdep.h>
> +#include <sysdep-cancel.h>
> #include <nptl/pthreadP.h>
> #include "kernel-posix-timers.h"
>
> @@ -84,14 +84,9 @@ timer_helper_thread (void *arg)
> /* sigwaitinfo cannot be used here, since it deletes
> SIGCANCEL == SIGTIMER from the set. */
>
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> /* XXX The size argument hopefully will have to be changed to the
> real size of the user-level sigset_t. */
> - int result = INLINE_SYSCALL (rt_sigtimedwait, 4, &ss, &si, NULL,
> - _NSIG / 8);
> -
> - LIBC_CANCEL_RESET (oldtype);
> + int result = SYSCALL_CANCEL (rt_sigtimedwait, &ss, &si, NULL, _NSIG / 8);
>
> if (result > 0)
> {
> diff --git a/sysdeps/unix/sysv/linux/wait.c b/sysdeps/unix/sysv/linux/wait.c
> index 029d975..5b76c7c 100644
> --- a/sysdeps/unix/sysv/linux/wait.c
> +++ b/sysdeps/unix/sysv/linux/wait.c
> @@ -26,17 +26,8 @@
> pid_t
> __libc_wait (__WAIT_STATUS_DEFN stat_loc)
> {
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (wait4, 4, WAIT_ANY, stat_loc, 0,
> - (struct rusage *) NULL);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - pid_t result = INLINE_SYSCALL (wait4, 4, WAIT_ANY, stat_loc, 0,
> + pid_t result = SYSCALL_CANCEL (wait4, WAIT_ANY, stat_loc, 0,
> (struct rusage *) NULL);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> return result;
> }
>
> diff --git a/sysdeps/unix/sysv/linux/waitid.c b/sysdeps/unix/sysv/linux/waitid.c
> index 12d5702..71d3a5a 100644
> --- a/sysdeps/unix/sysv/linux/waitid.c
> +++ b/sysdeps/unix/sysv/linux/waitid.c
> @@ -19,15 +19,14 @@
> #include <stddef.h>
> #include <errno.h>
> #include <sys/wait.h>
> -#include <sysdep.h>
> +#include <sysdep-cancel.h>
>
> -static inline int
> -do_waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options)
> +int
> +__waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options)
> {
> /* The unused fifth argument is a `struct rusage *' that we could
> pass if we were using waitid to simulate wait3/wait4. */
> - return INLINE_SYSCALL (waitid, 5, idtype, id, infop, options, NULL);
> + return SYSCALL_CANCEL (waitid, idtype, id, infop, options, NULL);
> }
> -#define NO_DO_WAITID
> -
> -#include "sysdeps/posix/waitid.c"
> +weak_alias (__waitid, waitid)
> +strong_alias (__waitid, __libc_waitid)
> diff --git a/sysdeps/unix/sysv/linux/waitpid.c b/sysdeps/unix/sysv/linux/waitpid.c
> index 0d780da..59d0c9e 100644
> --- a/sysdeps/unix/sysv/linux/waitpid.c
> +++ b/sysdeps/unix/sysv/linux/waitpid.c
> @@ -23,26 +23,11 @@
> __pid_t
> __waitpid (__pid_t pid, int *stat_loc, int options)
> {
> - if (SINGLE_THREAD_P)
> - {
> #ifdef __NR_waitpid
> - return INLINE_SYSCALL (waitpid, 3, pid, stat_loc, options);
> + return SYSCALL_CANCEL (waitpid, pid, stat_loc, options);
> #else
> - return INLINE_SYSCALL (wait4, 4, pid, stat_loc, options, NULL);
> + return SYSCALL_CANCEL (wait4, pid, stat_loc, options, NULL);
> #endif
> - }
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -#ifdef __NR_waitpid
> - int result = INLINE_SYSCALL (waitpid, 3, pid, stat_loc, options);
> -#else
> - int result = INLINE_SYSCALL (wait4, 4, pid, stat_loc, options, NULL);
> -#endif
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> }
> libc_hidden_def (__waitpid)
> weak_alias (__waitpid, waitpid)
> diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c b/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c
> index c723fef..627ac2a 100644
> --- a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c
> +++ b/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c
> @@ -25,17 +25,7 @@ int
> fallocate (int fd, int mode, __off_t offset, __off_t len)
> {
> #ifdef __NR_fallocate
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
> -
> - int result;
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (fallocate, fd, mode, offset, len);
> #else
> __set_errno (ENOSYS);
> return -1;
> diff --git a/sysdeps/unix/sysv/linux/wordsize-64/preadv.c b/sysdeps/unix/sysv/linux/wordsize-64/preadv.c
> index 9b3ae70..5e22c4b 100644
> --- a/sysdeps/unix/sysv/linux/wordsize-64/preadv.c
> +++ b/sysdeps/unix/sysv/linux/wordsize-64/preadv.c
> @@ -38,16 +38,7 @@ preadv (int fd, const struct iovec *vector, int count, off_t offset)
> #ifdef __NR_preadv
> ssize_t result;
>
> - if (SINGLE_THREAD_P)
> - result = INLINE_SYSCALL (preadv, 4, fd, vector, count, offset);
> - else
> - {
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (preadv, 4, fd, vector, count, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> - }
> + result = SYSCALL_CANCEL (preadv, fd, vector, count, offset);
> # ifdef __ASSUME_PREADV
> return result;
> # endif
> diff --git a/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c b/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c
> index 960c8c0..ccf96dd 100644
> --- a/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c
> +++ b/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c
> @@ -38,16 +38,7 @@ pwritev (int fd, const struct iovec *vector, int count, off_t offset)
> #ifdef __NR_pwritev
> ssize_t result;
>
> - if (SINGLE_THREAD_P)
> - result = INLINE_SYSCALL (pwritev, 4, fd, vector, count, offset);
> - else
> - {
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - result = INLINE_SYSCALL (pwritev, 4, fd, vector, count, offset);
> -
> - LIBC_CANCEL_RESET (oldtype);
> - }
> + result = SYSCALL_CANCEL (pwritev, fd, vector, count, offset);
> # ifdef __ASSUME_PWRITEV
> return result;
> # endif
> diff --git a/sysdeps/unix/sysv/linux/x86_64/recv.c b/sysdeps/unix/sysv/linux/x86_64/recv.c
> index 7b956a5..995d11d 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/recv.c
> +++ b/sysdeps/unix/sysv/linux/x86_64/recv.c
> @@ -25,16 +25,7 @@
> ssize_t
> __libc_recv (int fd, void *buf, size_t n, int flags)
> {
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (recvfrom, 6, fd, buf, n, flags, NULL, NULL);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = INLINE_SYSCALL (recvfrom, 6, fd, buf, n, flags, NULL, NULL);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (recvfrom, fd, buf, n, flags, NULL, NULL);
> }
>
> weak_alias (__libc_recv, __recv)
> diff --git a/sysdeps/unix/sysv/linux/x86_64/send.c b/sysdeps/unix/sysv/linux/x86_64/send.c
> index c8dadfa..864a8d5 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/send.c
> +++ b/sysdeps/unix/sysv/linux/x86_64/send.c
> @@ -23,17 +23,7 @@
> ssize_t
> __libc_send (int fd, const void *buf, size_t n, int flags)
> {
> - if (SINGLE_THREAD_P)
> - return INLINE_SYSCALL (sendto, 6, fd, buf, n, flags, NULL, (size_t) 0);
> -
> - int oldtype = LIBC_CANCEL_ASYNC ();
> -
> - ssize_t result = INLINE_SYSCALL (sendto, 6, fd, buf, n, flags, NULL,
> - (size_t) 0);
> -
> - LIBC_CANCEL_RESET (oldtype);
> -
> - return result;
> + return SYSCALL_CANCEL (sendto, fd, buf, n, flags, NULL, (size_t) 0);
> }
>
> weak_alias (__libc_send, __send)
>
On Wed, May 20, 2015 at 11:10:37AM -0300, Adhemerval Zanella wrote:
> Hi
>
> This patch is another of the required adjustments for the fix for bz12683
> (Race conditions in pthread cancellation) and the idea is to remove
> LIBC_CANCEL_ASYNC/LIBC_CANCEL_RESET explicit usage.
>
> This patch changes the way cancellation entrypoints are defined to
> instead call the macro SYSCALL_CANCEL. An usual cancellation definition
> is defined as:
>
> if (SINGLE_THREAD_P)
> return INLINE_SYSCALL (syscall, NARGS, args...)
>
> int oldtype = LIBC_CANCEL_ASYNC ();
>
> return INLINE_SYSCALL (syscall, NARGS, args...)
>
> LIBC_CANCEL_RESET (oldtype);
>
> And it is rewrited as just:
>
> SYSCALL_CANCEL (syscall, args...)
Looks fine to me.
Siddhesh
On Wed, May 20, 2015 at 11:10:37AM -0300, Adhemerval Zanella wrote:
> Hi
>
> This patch is another of the required adjustments for the fix for bz12683
> (Race conditions in pthread cancellation) and the idea is to remove
> LIBC_CANCEL_ASYNC/LIBC_CANCEL_RESET explicit usage.
>
> This patch changes the way cancellation entrypoints are defined to
> instead call the macro SYSCALL_CANCEL. An usual cancellation definition
> is defined as:
>
> if (SINGLE_THREAD_P)
> return INLINE_SYSCALL (syscall, NARGS, args...)
>
> int oldtype = LIBC_CANCEL_ASYNC ();
>
> return INLINE_SYSCALL (syscall, NARGS, args...)
>
> LIBC_CANCEL_RESET (oldtype);
>
> And it is rewrited as just:
>
> SYSCALL_CANCEL (syscall, args...)
I haven't reviewed the patch in detail but it looks exactly right in
concept. Happy to see this moving forward!
Rich
@@ -24,6 +24,27 @@
#define SYSCALL__(name, args) PSEUDO (__##name, name, args)
#define SYSCALL(name, args) PSEUDO (name, name, args)
+/* Cancellation macros. */
+#define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,n,...) n
+#define __SYSCALL_NARGS(...) \
+ __SYSCALL_NARGS_X (__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1, 0,)
+
+#define SYSCALL_CANCEL(name, ...) \
+ ({ \
+ long int sc_ret; \
+ if (SINGLE_THREAD_P) \
+ sc_ret = INLINE_SYSCALL (name, __SYSCALL_NARGS(__VA_ARGS__), \
+ __VA_ARGS__); \
+ else \
+ { \
+ int sc_cancel_oldtype = LIBC_CANCEL_ASYNC (); \
+ sc_ret = INLINE_SYSCALL (name, __SYSCALL_NARGS (__VA_ARGS__), \
+ __VA_ARGS__); \
+ LIBC_CANCEL_RESET (sc_cancel_oldtype); \
+ } \
+ sc_ret; \
+ })
+
/* Machine-dependent sysdep.h files are expected to define the macro
PSEUDO (function_name, syscall_name) to emit assembly code to define the
C-callable function FUNCTION_NAME to do system call SYSCALL_NAME.
@@ -31,7 +52,9 @@
an instruction such that "MOVE(r1, r0)" works. ret should be defined
as the return instruction. */
+#ifndef SYS_ify
#define SYS_ify(syscall_name) SYS_##syscall_name
+#endif
/* Terminate a system call named SYM. This is used on some platforms
to generate correct debugging information. */
@@ -47,4 +70,6 @@
/* Wrappers around system calls should normally inline the system call code.
But sometimes it is not possible or implemented and we use this code. */
+#ifndef INLINE_SYSCALL
#define INLINE_SYSCALL(name, nr, args...) __syscall_##name (args)
+#endif
@@ -37,17 +37,7 @@
int
accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags)
{
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (accept4, 4, fd, addr.__sockaddr__, addr_len, flags);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int result = INLINE_SYSCALL (accept4, 4, fd, addr.__sockaddr__, addr_len,
- flags);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (accept4, fd, addr.__sockaddr__, addr_len, flags);
}
#elif defined __NR_socketcall
# include <socketcall.h>
@@ -26,39 +26,23 @@
#include <kernel-features.h>
-static int
-do_fdatasync (int fd)
+int
+__fdatasync (int fd)
{
#ifdef __ASSUME_FDATASYNC
- return INLINE_SYSCALL (fdatasync, 1, fd);
+ return SYSCALL_CANCEL (fdatasync, fd);
#elif defined __NR_fdatasync
static int __have_no_fdatasync;
if (!__builtin_expect (__have_no_fdatasync, 0))
{
- int result = INLINE_SYSCALL (fdatasync, 1, fd);
+ int result = SYSCALL_CANCEL (fdatasync, fd);
if (__builtin_expect (result, 0) != -1 || errno != ENOSYS)
return result;
__have_no_fdatasync = 1;
}
#endif
- return INLINE_SYSCALL (fsync, 1, fd);
-}
-
-int
-__fdatasync (int fd)
-{
- if (SINGLE_THREAD_P)
- return do_fdatasync (fd);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int result = do_fdatasync (fd);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (fsync, fd);
}
-
weak_alias (__fdatasync, fdatasync)
@@ -26,28 +26,10 @@
ssize_t
__libc_pread (int fd, void *buf, size_t count, off_t offset)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- {
- /* In the ARM EABI, 64-bit values are aligned to even/odd register
- pairs for syscalls. */
- result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR (offset >> 31, offset));
-
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
/* In the ARM EABI, 64-bit values are aligned to even/odd register
pairs for syscalls. */
- result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR (offset >> 31, offset));
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pread64, fd, buf, count, 0,
+ __LONG_LONG_PAIR (offset >> 31, offset));
}
strong_alias (__libc_pread, __pread)
@@ -26,30 +26,11 @@
ssize_t
__libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- {
- /* In the ARM EABI, 64-bit values are aligned to even/odd register
- pairs for syscalls. */
- result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
-
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
/* In the ARM EABI, 64-bit values are aligned to even/odd register
pairs for syscalls. */
- result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pread64, fd, buf, count, 0,
+ __LONG_LONG_PAIR ((off_t) (offset >> 32),
+ (off_t) (offset & 0xffffffff)));
}
weak_alias (__libc_pread64, __pread64)
@@ -26,28 +26,10 @@
ssize_t
__libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- {
- /* In the ARM EABI, 64-bit values are aligned to even/odd register
- pairs for syscalls. */
- result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR (offset >> 31, offset));
-
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
/* In the ARM EABI, 64-bit values are aligned to even/odd register
pairs for syscalls. */
- result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR (offset >> 31, offset));
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pwrite64, fd, buf, count, 0,
+ __LONG_LONG_PAIR (offset >> 31, offset));
}
strong_alias (__libc_pwrite, __pwrite)
@@ -26,30 +26,11 @@
ssize_t
__libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- {
- /* In the ARM EABI, 64-bit values are aligned to even/odd register
- pairs for syscalls. */
- result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
-
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
/* In the ARM EABI, 64-bit values are aligned to even/odd register
pairs for syscalls. */
- result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pwrite64, fd, buf, count, 0,
+ __LONG_LONG_PAIR ((off_t) (offset >> 32),
+ (off_t) (offset & 0xffffffff)));
}
weak_alias (__libc_pwrite64, __pwrite64)
@@ -39,18 +39,8 @@ int epoll_pwait (int epfd, struct epoll_event *events,
int maxevents, int timeout,
const sigset_t *set)
{
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (epoll_pwait, 6, epfd, events, maxevents, timeout,
- set, _NSIG / 8);
-
- 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;
+ return SYSCALL_CANCEL (epoll_pwait, epfd, events, maxevents,
+ timeout, set, _NSIG / 8);
}
#else
@@ -25,21 +25,9 @@ int
fallocate (int fd, int mode, __off_t offset, __off_t len)
{
#ifdef __NR_fallocate
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (fallocate, 6, fd, mode,
- __LONG_LONG_PAIR (offset >> 31, offset),
- __LONG_LONG_PAIR (len >> 31, len));
-
- int result;
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (fallocate, 6, fd, mode,
- __LONG_LONG_PAIR (offset >> 31, offset),
- __LONG_LONG_PAIR (len >> 31, len));
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (fallocate, fd, mode,
+ __LONG_LONG_PAIR (offset >> 31, offset),
+ __LONG_LONG_PAIR (len >> 31, len));
#else
__set_errno (ENOSYS);
return -1;
@@ -25,25 +25,11 @@ int
fallocate64 (int fd, int mode, __off64_t offset, __off64_t len)
{
#ifdef __NR_fallocate
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (fallocate, 6, fd, mode,
- __LONG_LONG_PAIR ((long int) (offset >> 32),
- (long int) offset),
- __LONG_LONG_PAIR ((long int) (len >> 32),
- (long int) len));
-
- int result;
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (fallocate, 6, fd, mode,
- __LONG_LONG_PAIR ((long int) (offset >> 32),
- (long int) offset),
- __LONG_LONG_PAIR ((long int) (len >> 32),
- (long int) len));
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (fallocate, fd, mode,
+ __LONG_LONG_PAIR ((long int) (offset >> 32),
+ (long int) offset),
+ __LONG_LONG_PAIR ((long int) (len >> 32),
+ (long int) len));
#else
__set_errno (ENOSYS);
return -1;
@@ -37,16 +37,7 @@ __libc_open (const char *file, int oflag, ...)
va_end (arg);
}
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (openat, 4, AT_FDCWD, file, oflag, mode);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int result = INLINE_SYSCALL (openat, 4, AT_FDCWD, file, oflag, mode);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (openat, AT_FDCWD, file, oflag, mode);
}
libc_hidden_def (__libc_open)
@@ -37,18 +37,7 @@ __libc_open64 (const char *file, int oflag, ...)
va_end (arg);
}
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (openat, 4, AT_FDCWD, file,
- oflag | O_LARGEFILE, mode);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int result = INLINE_SYSCALL (openat, 4, AT_FDCWD, file,
- oflag | O_LARGEFILE, mode);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (openat, AT_FDCWD, file, oflag | O_LARGEFILE, mode);
}
weak_alias (__libc_open64, __open64)
libc_hidden_weak (__open64)
@@ -23,41 +23,17 @@
/* Suspend the process until a signal arrives.
This always returns -1 and sets errno to EINTR. */
-static int
-__syscall_pause (void)
+int
+__libc_pause (void)
{
sigset_t set;
int rc =
- INLINE_SYSCALL (rt_sigprocmask, 4, SIG_BLOCK, NULL, &set, _NSIG / 8);
+ SYSCALL_CANCEL (rt_sigprocmask, SIG_BLOCK, NULL, &set, _NSIG / 8);
if (rc == 0)
- rc = INLINE_SYSCALL (rt_sigsuspend, 2, &set, _NSIG / 8);
+ rc = SYSCALL_CANCEL (rt_sigsuspend, &set, _NSIG / 8);
return rc;
}
-int
-__libc_pause (void)
-{
- if (SINGLE_THREAD_P)
- return __syscall_pause ();
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int result = __syscall_pause ();
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
-}
weak_alias (__libc_pause, pause)
-
-#ifndef NO_CANCELLATION
-# include <not-cancel.h>
-
-int
-__pause_nocancel (void)
-{
- return __syscall_pause ();
-}
-#endif
@@ -35,16 +35,7 @@ __poll (struct pollfd *fds, nfds_t nfds, int timeout)
timeout_ts_p = &timeout_ts;
}
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout_ts_p, NULL, 0);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int result = INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout_ts_p, NULL, 0);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (ppoll, fds, nfds, timeout_ts_p, NULL, 0);
}
libc_hidden_def (__poll)
weak_alias (__poll, poll)
@@ -24,22 +24,8 @@
ssize_t
__libc_recv (int sockfd, void *buffer, size_t len, int flags)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- result = INLINE_SYSCALL (recvfrom, 6, sockfd, buffer, len, flags,
- NULL, NULL);
- else
- {
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (recvfrom, 6, sockfd, buffer, len, flags,
- NULL, NULL);
-
- LIBC_CANCEL_RESET (oldtype);
- }
-
- return result;
+ return SYSCALL_CANCEL (recvfrom, sockfd, buffer, len, flags,
+ NULL, NULL);
}
strong_alias (__libc_recv, __recv)
weak_alias (__libc_recv, recv)
@@ -42,20 +42,8 @@ __select(int nfds, fd_set *readfds,
tsp = &ts;
}
- if (SINGLE_THREAD_P)
- {
- result = INLINE_SYSCALL (pselect6, 6, nfds, readfds, writefds, exceptfds,
- tsp, NULL);
- }
- else
- {
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (pselect6, 6, nfds, readfds, writefds, exceptfds,
- tsp, NULL);
-
- LIBC_CANCEL_RESET (oldtype);
- }
+ result = SYSCALL_CANCEL (pselect6, nfds, readfds, writefds, exceptfds, tsp,
+ NULL);
if (timeout)
{
@@ -24,20 +24,7 @@
ssize_t
__libc_send (int sockfd, const void *buffer, size_t len, int flags)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- result = INLINE_SYSCALL (sendto, 6, sockfd, buffer, len, flags, NULL, 0);
- else
- {
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (sendto, 6, sockfd, buffer, len, flags, NULL, 0);
-
- LIBC_CANCEL_RESET (oldtype);
- }
-
- return result;
+ return SYSCALL_CANCEL (sendto, sockfd, buffer, len, flags, NULL, 0);
}
strong_alias (__libc_send, __send)
weak_alias (__libc_send, send)
@@ -18,6 +18,7 @@
#include <bits/wordsize.h>
#include <kernel-features.h>
+#include <sysdeps/unix/sysdep.h>
/* Provide the common name to allow more code reuse. */
#define __NR__llseek __NR_llseek
@@ -25,28 +25,13 @@
#include <sysdep-cancel.h>
#include <sys/syscall.h>
-static ssize_t
-do_pread (int fd, void *buf, size_t count, off_t offset)
+ssize_t
+__libc_pread (int fd, void *buf, size_t count, off_t offset)
{
assert (sizeof (offset) == 4);
- return INLINE_SYSCALL (pread64, __ALIGNMENT_COUNT (5, 6), fd,
+ return SYSCALL_CANCEL (pread64, fd,
buf, count, __ALIGNMENT_ARG
__LONG_LONG_PAIR (offset >> 31, offset));
}
-
-ssize_t
-__libc_pread (int fd, void *buf, size_t count, off_t offset)
-{
- if (SINGLE_THREAD_P)
- return do_pread (fd, buf, count, offset);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = do_pread (fd, buf, count, offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
-}
strong_alias (__libc_pread, __pread)
weak_alias (__libc_pread, pread)
@@ -24,29 +24,11 @@
#include <sysdep-cancel.h>
#include <sys/syscall.h>
-static ssize_t
-do_pread64 (int fd, void *buf, size_t count, off64_t offset)
-{
- return INLINE_SYSCALL (pread64, __ALIGNMENT_COUNT (5, 6), fd,
- buf, count, __ALIGNMENT_ARG
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
-}
-
-
ssize_t
__libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
{
- if (SINGLE_THREAD_P)
- return do_pread64 (fd, buf, count, offset);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = do_pread64 (fd, buf, count, offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pread64, fd, buf, count, __ALIGNMENT_ARG
+ __LONG_LONG_PAIR ((off_t) (offset >> 32),
+ (off_t) (offset & 0xffffffff)));
}
-
weak_alias (__libc_pread64, __pread64) weak_alias (__libc_pread64, pread64)
@@ -26,28 +26,13 @@
#include <sysdep-cancel.h>
#include <sys/syscall.h>
-static ssize_t
-do_preadv (int fd, const struct iovec *vector, int count, off_t offset)
+ssize_t
+__libc_preadv (int fd, const struct iovec *vector, int count, off_t offset)
{
assert (sizeof (offset) == 4);
- return INLINE_SYSCALL (preadv, __ALIGNMENT_COUNT (5, 6), fd,
+ return SYSCALL_CANCEL (preadv, fd,
vector, count, __ALIGNMENT_ARG
__LONG_LONG_PAIR (offset >> 31, offset));
}
-
-ssize_t
-__libc_preadv (int fd, const struct iovec *vector, int count, off_t offset)
-{
- if (SINGLE_THREAD_P)
- return do_preadv (fd, vector, count, offset);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = do_preadv (fd, vector, count, offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
-}
strong_alias (__libc_preadv, __preadv)
weak_alias (__libc_preadv, preadv)
@@ -25,30 +25,14 @@
#include <sysdep-cancel.h>
#include <sys/syscall.h>
-static ssize_t
-do_preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
+ssize_t
+__libc_preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
{
- return INLINE_SYSCALL (preadv, __ALIGNMENT_COUNT (5, 6), fd,
+ return SYSCALL_CANCEL (preadv, fd,
vector, count, __ALIGNMENT_ARG
__LONG_LONG_PAIR ((off_t) (offset >> 32),
(off_t) (offset & 0xffffffff)));
}
-
-ssize_t
-__libc_preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
-{
- if (SINGLE_THREAD_P)
- return do_preadv64 (fd, vector, count, offset);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = do_preadv64 (fd, vector, count, offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
-}
-
strong_alias (__libc_preadv64, __preadv64)
weak_alias (__libc_preadv64, preadv64)
@@ -25,29 +25,12 @@
#include <sysdep-cancel.h>
#include <sys/syscall.h>
-static ssize_t
-do_pwrite (int fd, const void *buf, size_t count, off_t offset)
-{
- assert (sizeof (offset) == 4);
- return INLINE_SYSCALL (pwrite64, __ALIGNMENT_COUNT (5, 6), fd,
- buf, count, __ALIGNMENT_ARG
- __LONG_LONG_PAIR (offset >> 31, offset));
-}
-
-
ssize_t
__libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
{
- if (SINGLE_THREAD_P)
- return do_pwrite (fd, buf, count, offset);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = do_pwrite (fd, buf, count, offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ assert (sizeof (offset) == 4);
+ return SYSCALL_CANCEL (pwrite64, fd, buf, count, __ALIGNMENT_ARG
+ __LONG_LONG_PAIR (offset >> 31, offset));
}
strong_alias (__libc_pwrite, __pwrite)
weak_alias (__libc_pwrite, pwrite)
@@ -24,30 +24,12 @@
#include <sysdep-cancel.h>
#include <sys/syscall.h>
-static ssize_t
-do_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
-{
- return INLINE_SYSCALL (pwrite64, __ALIGNMENT_COUNT (5, 6), fd,
- buf, count, __ALIGNMENT_ARG
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
-}
-
-
ssize_t
__libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
{
- if (SINGLE_THREAD_P)
- return do_pwrite64 (fd, buf, count, offset);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = do_pwrite64 (fd, buf, count, offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pwrite64, fd, buf, count, __ALIGNMENT_ARG
+ __LONG_LONG_PAIR ((off_t) (offset >> 32),
+ (off_t) (offset & 0xffffffff)));
}
-
weak_alias (__libc_pwrite64, __pwrite64)
libc_hidden_weak (__pwrite64) weak_alias (__libc_pwrite64, pwrite64)
@@ -26,29 +26,12 @@
#include <sysdep-cancel.h>
#include <sys/syscall.h>
-static ssize_t
-do_pwritev (int fd, const struct iovec *vector, int count, off_t offset)
-{
- assert (sizeof (offset) == 4);
- return INLINE_SYSCALL (pwritev, __ALIGNMENT_COUNT (5, 6), fd,
- vector, count, __ALIGNMENT_ARG
- __LONG_LONG_PAIR (offset >> 31, offset));
-}
-
-
ssize_t
__libc_pwritev (int fd, const struct iovec *vector, int count, off_t offset)
{
- if (SINGLE_THREAD_P)
- return do_pwritev (fd, vector, count, offset);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = do_pwritev (fd, vector, count, offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ assert (sizeof (offset) == 4);
+ return SYSCALL_CANCEL (pwritev, fd, vector, count, __ALIGNMENT_ARG
+ __LONG_LONG_PAIR (offset >> 31, offset));
}
strong_alias (__libc_pwritev, __pwritev)
weak_alias (__libc_pwritev, pwritev)
@@ -25,31 +25,14 @@
#include <sysdep-cancel.h>
#include <sys/syscall.h>
-static ssize_t
-do_pwritev64 (int fd, const struct iovec *vector, int count, off64_t offset)
-{
- return INLINE_SYSCALL (pwritev, __ALIGNMENT_COUNT (5, 6), fd,
- vector, count, __ALIGNMENT_ARG
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
-}
-
-
ssize_t
__libc_pwritev64 (int fd, const struct iovec *vector, int count,
off64_t offset)
{
- if (SINGLE_THREAD_P)
- return do_pwritev64 (fd, vector, count, offset);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = do_pwritev64 (fd, vector, count, offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pwritev, fd,
+ vector, count, __ALIGNMENT_ARG
+ __LONG_LONG_PAIR ((off_t) (offset >> 32),
+ (off_t) (offset & 0xffffffff)));
}
-
strong_alias (__libc_pwritev64, pwritev64)
weak_alias (__libc_pwritev64, __pwritev64)
@@ -49,16 +49,10 @@ __libc_fcntl (int fd, int cmd, ...)
arg = va_arg (ap, void *);
va_end (ap);
- if (SINGLE_THREAD_P || (cmd != F_SETLKW && cmd != F_SETLKW64))
+ if ((cmd != F_SETLKW) && (cmd != F_SETLKW64))
return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int result = INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (fcntl64, fd, cmd, arg);
}
libc_hidden_def (__libc_fcntl)
@@ -28,23 +28,10 @@
int
sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
{
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (sync_file_range, 7, fd, 0,
- __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
- __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
- flags);
-
- int result;
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (sync_file_range, 7, fd, 0,
- __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
- __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
- flags);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (sync_file_range, fd, 0,
+ __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
+ __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
+ flags);
}
#else
int
@@ -25,17 +25,7 @@ int
fallocate (int fd, int mode, __off_t offset, __off_t len)
{
#ifdef __NR_fallocate
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
-
- int result;
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (fallocate, fd, mode, offset, len);
#else
__set_errno (ENOSYS);
return -1;
@@ -25,17 +25,7 @@ int
fallocate64 (int fd, int mode, __off64_t offset, __off64_t len)
{
#ifdef __NR_fallocate
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
-
- int result;
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (fallocate, fd, mode, offset, len);
#else
__set_errno (ENOSYS);
return -1;
@@ -38,35 +38,16 @@
ssize_t
__libc_pread (int fd, void *buf, size_t count, off_t offset)
{
- ssize_t result;
-
#if _MIPS_SIM != _ABI64
assert (sizeof (offset) == 4);
#endif
- if (SINGLE_THREAD_P)
- {
-#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
- result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
-#else
- result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR (offset >> 31, offset));
-#endif
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
- result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
+ return SYSCALL_CANCEL (pread, fd, buf, count, offset);
#else
- result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR (offset >> 31, offset));
+ return SYSCALL_CANCEL (pread, fd, buf, count, 0,
+ __LONG_LONG_PAIR (offset >> 31, offset));
#endif
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
}
strong_alias (__libc_pread, __pread)
@@ -37,34 +37,13 @@
ssize_t
__libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
{
- ssize_t result;
-
-
- if (SINGLE_THREAD_P)
- {
#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
- result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
+ return SYSCALL_CANCEL (pread, fd, buf, count, offset);
#else
- result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
+ return SYSCALL_CANCEL (pread, fd, buf, count, 0,
+ __LONG_LONG_PAIR ((off_t) (offset >> 32),
+ (off_t) (offset & 0xffffffff)));
#endif
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
-#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
- result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
-#else
- result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
-#endif
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
}
weak_alias (__libc_pread64, __pread64)
@@ -38,35 +38,16 @@
ssize_t
__libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
{
- ssize_t result;
-
#if _MIPS_SIM != _ABI64
assert (sizeof (offset) == 4);
#endif
- if (SINGLE_THREAD_P)
- {
-#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
- result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
-#else
- result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR (offset >> 31, offset));
-#endif
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
- result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
+ return SYSCALL_CANCEL (pwrite, fd, buf, count, offset);
#else
- result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR (offset >> 31, offset));
+ return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
+ __LONG_LONG_PAIR (offset >> 31, offset));
#endif
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
}
strong_alias (__libc_pwrite, __pwrite)
@@ -37,34 +37,13 @@
ssize_t
__libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- {
#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
- result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
+ return SYSCALL_CANCEL (pwrite, fd, buf, count, offset);
#else
- result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
+ return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
+ __LONG_LONG_PAIR ((off_t) (offset >> 32),
+ (off_t) (offset & 0xffffffff)));
#endif
-
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
-#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
- result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
-#else
- result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
-#endif
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
}
weak_alias (__libc_pwrite64, __pwrite64)
@@ -43,16 +43,6 @@ __libc_msgrcv (int msqid, void *msgp, size_t msgsz, long int msgtyp,
tmp.msgp = msgp;
tmp.msgtyp = msgtyp;
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (ipc, 5, IPCOP_msgrcv, msqid, msgsz, msgflg, &tmp);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = INLINE_SYSCALL (ipc, 5, IPCOP_msgrcv, msqid, msgsz, msgflg,
- &tmp);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (ipc, IPCOP_msgrcv, msqid, msgsz, msgflg, &tmp);
}
weak_alias (__libc_msgrcv, msgrcv)
@@ -26,17 +26,7 @@
int
__libc_msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg)
{
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (ipc, 5, IPCOP_msgsnd, msqid, msgsz,
- msgflg, (void *) msgp);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int result = INLINE_SYSCALL (ipc, 5, IPCOP_msgsnd, msqid, msgsz,
- msgflg, (void *) msgp);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (ipc, IPCOP_msgsnd, msqid, msgsz, msgflg,
+ (void *) msgp);
}
weak_alias (__libc_msgsnd, msgsnd)
@@ -36,16 +36,7 @@ __libc_open64 (const char *file, int oflag, ...)
va_end (arg);
}
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (open, 3, file, oflag | O_LARGEFILE, mode);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int result = INLINE_SYSCALL (open, 3, file, oflag | O_LARGEFILE, mode);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (open, file, oflag | O_LARGEFILE, mode);
}
weak_alias (__libc_open64, __open64)
libc_hidden_weak (__open64)
@@ -68,16 +68,7 @@ __OPENAT (int fd, const char *file, int oflag, ...)
va_end (arg);
}
- if (SINGLE_THREAD_P)
- return OPENAT_NOT_CANCEL (fd, file, oflag, mode);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int res = OPENAT_NOT_CANCEL (fd, file, oflag, mode);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return res;
+ return SYSCALL_CANCEL (openat, fd, file, oflag, mode);
}
libc_hidden_def (__OPENAT)
weak_alias (__OPENAT, OPENAT)
@@ -26,26 +26,8 @@
ssize_t
__libc_pread (int fd, void *buf, size_t count, off_t offset)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- {
- /* On PPC32 64bit values are aligned in odd/even register pairs. */
- result = INLINE_SYSCALL (pread, 6, fd, buf, count,
- 0, offset >> 31, offset);
-
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
/* On PPC32 64bit values are aligned in odd/even register pairs. */
- result = INLINE_SYSCALL (pread, 6, fd, buf, count,
- 0, offset >> 31, offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pread, fd, buf, count, 0, offset >> 31, offset);
}
strong_alias (__libc_pread, __pread)
@@ -26,28 +26,9 @@
ssize_t
__libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- {
- /* On PPC32 64bit values are aligned in odd/even register pairs. */
- result = INLINE_SYSCALL (pread, 6, fd, buf, count,
- 0, (long) (offset >> 32),
- (long) offset);
-
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
/* On PPC32 64bit values are aligned in odd/even register pairs. */
- result = INLINE_SYSCALL (pread, 6, fd, buf, count,
- 0, (long) (offset >> 32),
- (long) offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pread, fd, buf, count, 0, (long) (offset >> 32),
+ (long) offset);
}
weak_alias (__libc_pread64, __pread64)
@@ -27,26 +27,8 @@
ssize_t
__libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- {
- /* On PPC32 64bit values are aligned in odd/even register pairs. */
- result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
- 0, offset >> 31, offset);
-
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
/* On PPC32 64bit values are aligned in odd/even register pairs. */
- result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
- 0, offset >> 31, offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pwrite, fd, buf, count, 0, offset >> 31, offset);
}
strong_alias (__libc_pwrite, __pwrite)
@@ -26,28 +26,9 @@
ssize_t
__libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- {
/* On PPC32 64bit values are aligned in odd/even register pairs. */
- result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
- 0, (long) (offset >> 32),
- (long) offset);
-
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- /* On PPC32 64bit values are aligned in odd/even register pairs. */
- result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
- 0, (long) (offset >> 32),
- (long) offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pwrite, fd, buf, count, 0, (long) (offset >> 32),
+ (long) offset);
}
weak_alias (__libc_pwrite64, __pwrite64)
@@ -53,16 +53,10 @@ __libc_fcntl (int fd, int cmd, ...)
if (cmd >= F_GETLK64 && cmd <= F_SETLKW64)
cmd -= F_GETLK64 - F_GETLK;
- if (SINGLE_THREAD_P || cmd != F_SETLKW)
+ if (cmd != F_SETLKW)
return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int result = INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (fcntl, fd, cmd, arg);
}
libc_hidden_def (__libc_fcntl)
@@ -28,17 +28,7 @@
int
sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
{
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (sync_file_range2, 4, fd, flags, from, to);
-
- int result;
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (sync_file_range2, 4, fd, flags, from, to);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (sync_file_range2, fd, flags, from, to);
}
#else
int
@@ -47,17 +47,7 @@ ppoll (struct pollfd *fds, nfds_t nfds, const struct timespec *timeout,
int result;
- if (SINGLE_THREAD_P)
- result = INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout, sigmask, _NSIG / 8);
- else
- {
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout, sigmask,
- _NSIG / 8);
-
- LIBC_CANCEL_RESET (oldtype);
- }
+ result = SYSCALL_CANCEL (ppoll, fds, nfds, timeout, sigmask, _NSIG / 8);
# ifndef __ASSUME_PPOLL
if (result == -1 && errno == ENOSYS)
@@ -32,36 +32,17 @@
#endif
-static ssize_t
-#ifdef NO_CANCELLATION
-inline __attribute ((always_inline))
-#endif
-do_pread (int fd, void *buf, size_t count, off_t offset)
+ssize_t
+__libc_pread (int fd, void *buf, size_t count, off_t offset)
{
ssize_t result;
assert (sizeof (offset) == 4);
- result = INLINE_SYSCALL (pread, 5, fd, buf, count,
+ result = SYSCALL_CANCEL (pread, fd, buf, count,
__LONG_LONG_PAIR (offset >> 31, offset));
return result;
}
-
-ssize_t
-__libc_pread (int fd, void *buf, size_t count, off_t offset)
-{
- if (SINGLE_THREAD_P)
- return do_pread (fd, buf, count, offset);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = do_pread (fd, buf, count, offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
-}
-
strong_alias (__libc_pread, __pread)
weak_alias (__libc_pread, pread)
@@ -31,32 +31,12 @@
#endif
-static ssize_t
-do_pread64 (int fd, void *buf, size_t count, off64_t offset)
-{
- ssize_t result;
-
- result = INLINE_SYSCALL (pread, 5, fd, buf, count,
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
-
- return result;
-}
-
-
ssize_t
__libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
{
- if (SINGLE_THREAD_P)
- return do_pread64 (fd, buf, count, offset);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = do_pread64 (fd, buf, count, offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pread, fd, buf, count,
+ __LONG_LONG_PAIR ((off_t) (offset >> 32),
+ (off_t) (offset & 0xffffffff)));
}
weak_alias (__libc_pread64, __pread64)
@@ -53,18 +53,8 @@ PREADV (int fd, const struct iovec *vector, int count, OFF_T offset)
#ifdef __NR_preadv
ssize_t result;
- if (SINGLE_THREAD_P)
- result = INLINE_SYSCALL (preadv, 5, fd, vector, count,
- LO_HI_LONG (offset));
- else
- {
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (preadv, 5, fd, vector, count,
- LO_HI_LONG (offset));
-
- LIBC_CANCEL_RESET (oldtype);
- }
+ result = SYSCALL_CANCEL (preadv, fd, vector, count, LO_HI_LONG (offset));
+
# ifdef __ASSUME_PREADV
return result;
# endif
@@ -63,22 +63,11 @@ __pselect (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
#ifndef CALL_PSELECT6
# define CALL_PSELECT6(nfds, readfds, writefds, exceptfds, timeout, data) \
- INLINE_SYSCALL (pselect6, 6, nfds, readfds, writefds, exceptfds, \
- timeout, data)
+ SYSCALL_CANCEL (pselect6, nfds, readfds, writefds, exceptfds, timeout, data)
#endif
- if (SINGLE_THREAD_P)
- result = CALL_PSELECT6 (nfds, readfds, writefds, exceptfds, timeout,
- &data);
- else
- {
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = CALL_PSELECT6 (nfds, readfds, writefds, exceptfds, timeout,
- &data);
-
- LIBC_CANCEL_RESET (oldtype);
- }
+ result = CALL_PSELECT6 (nfds, readfds, writefds, exceptfds, timeout,
+ &data);
# ifndef __ASSUME_PSELECT
if (result == -1 && errno == ENOSYS)
@@ -32,36 +32,17 @@
#endif
-static ssize_t
-#ifdef NO_CANCELLATION
-inline __attribute ((always_inline))
-#endif
-do_pwrite (int fd, const void *buf, size_t count, off_t offset)
+ssize_t
+__libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
{
ssize_t result;
assert (sizeof (offset) == 4);
- result = INLINE_SYSCALL (pwrite, 5, fd, buf, count,
+ result = SYSCALL_CANCEL (pwrite, fd, buf, count,
__LONG_LONG_PAIR (offset >> 31, offset));
return result;
}
-
-ssize_t
-__libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
-{
- if (SINGLE_THREAD_P)
- return do_pwrite (fd, buf, count, offset);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = do_pwrite (fd, buf, count, offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
-}
-
strong_alias (__libc_pwrite, __pwrite)
weak_alias (__libc_pwrite, pwrite)
@@ -31,34 +31,13 @@
#endif
-static ssize_t
-do_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
-{
- ssize_t result;
-
- result = INLINE_SYSCALL (pwrite, 5, fd, buf, count,
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
-
- return result;
-}
-
-
ssize_t
__libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
{
- if (SINGLE_THREAD_P)
- return do_pwrite64 (fd, buf, count, offset);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = do_pwrite64 (fd, buf, count, offset);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pwrite, fd, buf, count,
+ __LONG_LONG_PAIR ((off_t) (offset >> 32),
+ (off_t) (offset & 0xffffffff)));
}
-
weak_alias (__libc_pwrite64, __pwrite64)
libc_hidden_weak (__pwrite64)
weak_alias (__libc_pwrite64, pwrite64)
@@ -53,18 +53,8 @@ PWRITEV (int fd, const struct iovec *vector, int count, OFF_T offset)
#ifdef __NR_pwritev
ssize_t result;
- if (SINGLE_THREAD_P)
- result = INLINE_SYSCALL (pwritev, 5, fd, vector, count,
- LO_HI_LONG (offset));
- else
- {
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (pwritev, 5, fd, vector, count,
- LO_HI_LONG (offset));
-
- LIBC_CANCEL_RESET (oldtype);
- }
+ result = SYSCALL_CANCEL (pwritev, fd, vector, count, LO_HI_LONG (offset));
+
# ifdef __ASSUME_PWRITEV
return result;
# endif
@@ -37,16 +37,7 @@ int
recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
struct timespec *tmo)
{
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (recvmmsg, 5, fd, vmessages, vlen, flags, tmo);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int result = INLINE_SYSCALL (recvmmsg, 5, fd, vmessages, vlen, flags, tmo);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags, tmo);
}
#elif defined __NR_socketcall
# include <socketcall.h>
@@ -36,16 +36,7 @@
int
__sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
{
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (sendmmsg, 4, fd, vmessages, vlen, flags);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int result = INLINE_SYSCALL (sendmmsg, 4, fd, vmessages, vlen, flags);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags);
}
libc_hidden_def (__sendmmsg)
weak_alias (__sendmmsg, sendmmsg)
@@ -35,23 +35,8 @@
ssize_t
__libc_pread (int fd, void *buf, size_t count, off_t offset)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- {
- result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR (offset >> 31, offset));
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR (offset >> 31, offset));
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pread, fd, buf, count, 0,
+ __LONG_LONG_PAIR (offset >> 31, offset));
}
strong_alias (__libc_pread, __pread)
@@ -34,25 +34,9 @@
ssize_t
__libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- {
- result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pread, fd, buf, count, 0,
+ __LONG_LONG_PAIR ((off_t) (offset >> 32),
+ (off_t) (offset & 0xffffffff)));
}
weak_alias (__libc_pread64, __pread64)
@@ -35,23 +35,8 @@
ssize_t
__libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- {
- result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR (offset >> 31, offset));
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR (offset >> 31, offset));
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
+ __LONG_LONG_PAIR (offset >> 31, offset));
}
strong_alias (__libc_pwrite, __pwrite)
@@ -34,26 +34,9 @@
ssize_t
__libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
{
- ssize_t result;
-
- if (SINGLE_THREAD_P)
- {
- result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
-
- return result;
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
- __LONG_LONG_PAIR ((off_t) (offset >> 32),
- (off_t) (offset & 0xffffffff)));
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
+ __LONG_LONG_PAIR ((off_t) (offset >> 32),
+ (off_t) (offset & 0xffffffff)));
}
weak_alias (__libc_pwrite64, __pwrite64)
@@ -22,38 +22,13 @@
#include <sysdep-cancel.h>
#include <sys/syscall.h>
-
-static inline int __attribute__ ((always_inline))
-do_sigsuspend (const sigset_t *set)
-{
- return INLINE_SYSCALL (rt_sigsuspend, 2, set, _NSIG / 8);
-}
-
/* Change the set of blocked signals to SET,
wait until a signal arrives, and restore the set of blocked signals. */
int
__sigsuspend (const sigset_t *set)
{
- if (SINGLE_THREAD_P)
- return do_sigsuspend (set);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int result = do_sigsuspend (set);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (rt_sigsuspend, set, _NSIG / 8);
}
libc_hidden_def (__sigsuspend)
weak_alias (__sigsuspend, sigsuspend)
strong_alias (__sigsuspend, __libc_sigsuspend)
-
-#ifndef NO_CANCELLATION
-int
-__sigsuspend_nocancel (set)
- const sigset_t *set;
-{
- return do_sigsuspend (set);
-}
-#endif
@@ -25,9 +25,9 @@
#ifdef __NR_rt_sigtimedwait
-static int
-do_sigtimedwait (const sigset_t *set, siginfo_t *info,
- const struct timespec *timeout)
+int
+__sigtimedwait (const sigset_t *set, siginfo_t *info,
+ const struct timespec *timeout)
{
#ifdef SIGCANCEL
sigset_t tmpset;
@@ -51,8 +51,7 @@ do_sigtimedwait (const sigset_t *set, siginfo_t *info,
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
- int result = INLINE_SYSCALL (rt_sigtimedwait, 4, set,
- info, timeout, _NSIG / 8);
+ int result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, timeout, _NSIG / 8);
/* The kernel generates a SI_TKILL code in si_code in case tkill is
used. tkill is transparently used in raise(). Since having
@@ -63,26 +62,6 @@ do_sigtimedwait (const sigset_t *set, siginfo_t *info,
return result;
}
-
-
-/* Return any pending signal or wait for one for the given time. */
-int
-__sigtimedwait (const sigset_t *set, siginfo_t *info,
- const struct timespec *timeout)
-{
- if (SINGLE_THREAD_P)
- return do_sigtimedwait (set, info, timeout);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- /* XXX The size argument hopefully will have to be changed to the
- real size of the user-level sigset_t. */
- int result = do_sigtimedwait (set, info, timeout);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
-}
libc_hidden_def (__sigtimedwait)
weak_alias (__sigtimedwait, sigtimedwait)
#else
@@ -27,8 +27,9 @@
#ifdef __NR_rt_sigtimedwait
-static int
-do_sigwaitinfo (const sigset_t *set, siginfo_t *info)
+/* Return any pending signal or wait for one for the given time. */
+int
+__sigwaitinfo (const sigset_t *set, siginfo_t *info)
{
#ifdef SIGCANCEL
sigset_t tmpset;
@@ -52,8 +53,7 @@ do_sigwaitinfo (const sigset_t *set, siginfo_t *info)
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
- int result = INLINE_SYSCALL (rt_sigtimedwait, 4, set,
- info, NULL, _NSIG / 8);
+ int result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, NULL, _NSIG / 8);
/* The kernel generates a SI_TKILL code in si_code in case tkill is
used. tkill is transparently used in raise(). Since having
@@ -65,24 +65,6 @@ do_sigwaitinfo (const sigset_t *set, siginfo_t *info)
return result;
}
-
-/* Return any pending signal or wait for one for the given time. */
-int
-__sigwaitinfo (const sigset_t *set, siginfo_t *info)
-{
- if (SINGLE_THREAD_P)
- return do_sigwaitinfo (set, info);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- /* XXX The size argument hopefully will have to be changed to the
- real size of the user-level sigset_t. */
- int result = do_sigwaitinfo (set, info);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
-}
libc_hidden_def (__sigwaitinfo)
weak_alias (__sigwaitinfo, sigwaitinfo)
#else
@@ -26,17 +26,7 @@ ssize_t
__libc_msgrcv (int msqid, void *msgp, size_t msgsz, long int msgtyp,
int msgflg)
{
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (ipc, 6, IPCOP_msgrcv, msqid, msgsz, msgflg,
- msgp, msgtyp);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = INLINE_SYSCALL (ipc, 6, IPCOP_msgrcv, msqid, msgsz, msgflg,
- msgp, msgtyp);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (ipc, IPCOP_msgrcv, msqid, msgsz, msgflg,
+ msgp, msgtyp);
}
weak_alias (__libc_msgrcv, msgrcv)
@@ -28,43 +28,18 @@
int
sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
{
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (sync_file_range, 6, fd,
- __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
- __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
- flags);
-
- int result;
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (sync_file_range, 6, fd,
- __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
- __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
- flags);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (sync_file_range, fd,
+ __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
+ __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
+ flags);
}
#elif defined __NR_sync_file_range2
int
sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
{
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (sync_file_range2, 6, fd, flags,
- __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
- __LONG_LONG_PAIR ((long) (to >> 32), (long) to));
-
- int result;
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (sync_file_range2, 6, fd, flags,
- __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
- __LONG_LONG_PAIR ((long) (to >> 32), (long) to));
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (sync_file_range2, fd, flags,
+ __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
+ __LONG_LONG_PAIR ((long) (to >> 32), (long) to));
}
#else
int
@@ -24,17 +24,7 @@
int
__libc_tcdrain (int fd)
{
- if (SINGLE_THREAD_P)
- /* With an argument of 1, TCSBRK for output to be drain. */
- return INLINE_SYSCALL (ioctl, 3, fd, TCSBRK, 1);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
/* With an argument of 1, TCSBRK for output to be drain. */
- int result = INLINE_SYSCALL (ioctl, 3, fd, TCSBRK, 1);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (ioctl, fd, TCSBRK, 1);
}
weak_alias (__libc_tcdrain, tcdrain)
@@ -20,7 +20,7 @@
#include <setjmp.h>
#include <signal.h>
#include <stdbool.h>
-#include <sysdep.h>
+#include <sysdep-cancel.h>
#include <nptl/pthreadP.h>
#include "kernel-posix-timers.h"
@@ -84,14 +84,9 @@ timer_helper_thread (void *arg)
/* sigwaitinfo cannot be used here, since it deletes
SIGCANCEL == SIGTIMER from the set. */
- int oldtype = LIBC_CANCEL_ASYNC ();
-
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
- int result = INLINE_SYSCALL (rt_sigtimedwait, 4, &ss, &si, NULL,
- _NSIG / 8);
-
- LIBC_CANCEL_RESET (oldtype);
+ int result = SYSCALL_CANCEL (rt_sigtimedwait, &ss, &si, NULL, _NSIG / 8);
if (result > 0)
{
@@ -26,17 +26,8 @@
pid_t
__libc_wait (__WAIT_STATUS_DEFN stat_loc)
{
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (wait4, 4, WAIT_ANY, stat_loc, 0,
- (struct rusage *) NULL);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- pid_t result = INLINE_SYSCALL (wait4, 4, WAIT_ANY, stat_loc, 0,
+ pid_t result = SYSCALL_CANCEL (wait4, WAIT_ANY, stat_loc, 0,
(struct rusage *) NULL);
-
- LIBC_CANCEL_RESET (oldtype);
-
return result;
}
@@ -19,15 +19,14 @@
#include <stddef.h>
#include <errno.h>
#include <sys/wait.h>
-#include <sysdep.h>
+#include <sysdep-cancel.h>
-static inline int
-do_waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options)
+int
+__waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options)
{
/* The unused fifth argument is a `struct rusage *' that we could
pass if we were using waitid to simulate wait3/wait4. */
- return INLINE_SYSCALL (waitid, 5, idtype, id, infop, options, NULL);
+ return SYSCALL_CANCEL (waitid, idtype, id, infop, options, NULL);
}
-#define NO_DO_WAITID
-
-#include "sysdeps/posix/waitid.c"
+weak_alias (__waitid, waitid)
+strong_alias (__waitid, __libc_waitid)
@@ -23,26 +23,11 @@
__pid_t
__waitpid (__pid_t pid, int *stat_loc, int options)
{
- if (SINGLE_THREAD_P)
- {
#ifdef __NR_waitpid
- return INLINE_SYSCALL (waitpid, 3, pid, stat_loc, options);
+ return SYSCALL_CANCEL (waitpid, pid, stat_loc, options);
#else
- return INLINE_SYSCALL (wait4, 4, pid, stat_loc, options, NULL);
+ return SYSCALL_CANCEL (wait4, pid, stat_loc, options, NULL);
#endif
- }
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
-#ifdef __NR_waitpid
- int result = INLINE_SYSCALL (waitpid, 3, pid, stat_loc, options);
-#else
- int result = INLINE_SYSCALL (wait4, 4, pid, stat_loc, options, NULL);
-#endif
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
}
libc_hidden_def (__waitpid)
weak_alias (__waitpid, waitpid)
@@ -25,17 +25,7 @@ int
fallocate (int fd, int mode, __off_t offset, __off_t len)
{
#ifdef __NR_fallocate
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
-
- int result;
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (fallocate, fd, mode, offset, len);
#else
__set_errno (ENOSYS);
return -1;
@@ -38,16 +38,7 @@ preadv (int fd, const struct iovec *vector, int count, off_t offset)
#ifdef __NR_preadv
ssize_t result;
- if (SINGLE_THREAD_P)
- result = INLINE_SYSCALL (preadv, 4, fd, vector, count, offset);
- else
- {
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (preadv, 4, fd, vector, count, offset);
-
- LIBC_CANCEL_RESET (oldtype);
- }
+ result = SYSCALL_CANCEL (preadv, fd, vector, count, offset);
# ifdef __ASSUME_PREADV
return result;
# endif
@@ -38,16 +38,7 @@ pwritev (int fd, const struct iovec *vector, int count, off_t offset)
#ifdef __NR_pwritev
ssize_t result;
- if (SINGLE_THREAD_P)
- result = INLINE_SYSCALL (pwritev, 4, fd, vector, count, offset);
- else
- {
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- result = INLINE_SYSCALL (pwritev, 4, fd, vector, count, offset);
-
- LIBC_CANCEL_RESET (oldtype);
- }
+ result = SYSCALL_CANCEL (pwritev, fd, vector, count, offset);
# ifdef __ASSUME_PWRITEV
return result;
# endif
@@ -25,16 +25,7 @@
ssize_t
__libc_recv (int fd, void *buf, size_t n, int flags)
{
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (recvfrom, 6, fd, buf, n, flags, NULL, NULL);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = INLINE_SYSCALL (recvfrom, 6, fd, buf, n, flags, NULL, NULL);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (recvfrom, fd, buf, n, flags, NULL, NULL);
}
weak_alias (__libc_recv, __recv)
@@ -23,17 +23,7 @@
ssize_t
__libc_send (int fd, const void *buf, size_t n, int flags)
{
- if (SINGLE_THREAD_P)
- return INLINE_SYSCALL (sendto, 6, fd, buf, n, flags, NULL, (size_t) 0);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- ssize_t result = INLINE_SYSCALL (sendto, 6, fd, buf, n, flags, NULL,
- (size_t) 0);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return result;
+ return SYSCALL_CANCEL (sendto, fd, buf, n, flags, NULL, (size_t) 0);
}
weak_alias (__libc_send, __send)