1
0
mirror of https://sourceware.org/git/glibc.git synced 2026-10-24 01:33:52 +03:00

nptl: Rewrite cancellation macros

This patch changes the way cancellation entrypoints are defined to
instead call the macro SYSCALL_CANCEL.  An usual cnacellation 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...)

The idea is to remove LIBC_CANCEL_ASYNC/LIBC_CANCEL_RESET explicit
usage.

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.
This commit is contained in:
Adhemerval Zanella
2014-09-28 08:46:23 -03:00
committed by Adhemerval Zanella
parent b65d3e5f0f
commit c6bb095eb5
74 changed files with 303 additions and 1161 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)
{

View File

@@ -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)

View File

@@ -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

View File

@@ -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)
{
assert (sizeof (offset) == 4);
return INLINE_SYSCALL (pread64, __ALIGNMENT_COUNT (5, 6), 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;
assert (sizeof (offset) == 4);
return SYSCALL_CANCEL (pread64, fd,
buf, count, __ALIGNMENT_ARG
__LONG_LONG_PAIR (offset >> 31, offset));
}
strong_alias (__libc_pread, __pread)
weak_alias (__libc_pread, pread)

View File

@@ -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)

View File

@@ -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)
{
assert (sizeof (offset) == 4);
return INLINE_SYSCALL (preadv, __ALIGNMENT_COUNT (5, 6), 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;
assert (sizeof (offset) == 4);
return SYSCALL_CANCEL (preadv, fd,
vector, count, __ALIGNMENT_ARG
__LONG_LONG_PAIR (offset >> 31, offset));
}
strong_alias (__libc_preadv, __preadv)
weak_alias (__libc_preadv, preadv)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)