From 34caaafd1ae38c9295325a1da491d75a92b205b0 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Wed, 24 Sep 2014 13:38:59 -0300 Subject: Use inline syscalls for non-cancellable versions This patch uses inline calls (through INLINE_SYSCALL macro) to define the non-cancellable functions macros to avoid use of the syscall_nocancel entrypoint. --- ChangeLog | 16 ++++++ sysdeps/unix/sysv/linux/not-cancel.h | 76 ++++++++++++++----------- sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c | 2 +- 3 files changed, 60 insertions(+), 34 deletions(-) diff --git a/ChangeLog b/ChangeLog index cd25f44..89c4bcf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2015-06-04 Adhemerval Zanella + + * sysdeps/unix/sysv/linux/not-cancel.h (open_not_cancel): Rewrite to + be an inline implementation regardless of library is built within. + (open_not_cancel_2): Likewise. + (__read_nocancel): Likewise. + (__write_nocancel): Likewise. + (openat_not_cancel): Likewise. + (openat_not_cancel_3): Likewise. + (openat64_not_cancel): Likewise. + (openat64_not_cancel_3): Likewise. + (__close_nocancel): Likewise. + (pause_not_cancel): Likewise. + (nanosleep_not_cancel): Likewise. + (sigsuspend_not_cancel): Likewise. + 2015-06-04 Torvald Riegel [BZ #14958] diff --git a/sysdeps/unix/sysv/linux/not-cancel.h b/sysdeps/unix/sysv/linux/not-cancel.h index 62d487f..8a358fd 100644 --- a/sysdeps/unix/sysv/linux/not-cancel.h +++ b/sysdeps/unix/sysv/linux/not-cancel.h @@ -17,48 +17,48 @@ License along with the GNU C Library; if not, see . */ +#ifndef NOT_CANCEL_H +# define NOT_CANCEL_H + #include +#include +#include +#include -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) -extern int __open_nocancel (const char *, int, ...) attribute_hidden; -extern int __close_nocancel (int) attribute_hidden; -extern int __read_nocancel (int, void *, size_t) attribute_hidden; -extern int __write_nocancel (int, const void *, size_t) attribute_hidden; -extern pid_t __waitpid_nocancel (pid_t, int *, int) attribute_hidden; -extern int __openat_nocancel (int fd, const char *fname, int oflag, - mode_t mode) attribute_hidden; -extern int __openat64_nocancel (int fd, const char *fname, int oflag, - mode_t mode) attribute_hidden; +/* Uncancelable open. */ +#ifdef __NR_open +# define open_not_cancel(name, flags, mode) \ + INLINE_SYSCALL (open, 3, name, flags, mode) +# define open_not_cancel_2(name, flags) \ + INLINE_SYSCALL (open, 2, name, flags) #else -# define __open_nocancel(name, ...) __open (name, __VA_ARGS__) -# define __close_nocancel(fd) __close (fd) -# define __read_nocancel(fd, buf, len) __read (fd, buf, len) -# define __write_nocancel(fd, buf, len) __write (fd, buf, len) -# define __waitpid_nocancel(pid, stat_loc, options) \ - __waitpid (pid, stat_loc, options) -# define __openat_nocancel(fd, fname, oflag, mode) \ - openat (fd, fname, oflag, mode) -# define __openat64_nocancel(fd, fname, oflag, mode) \ - openat64 (fd, fname, oflag, mode) +# define open_not_cancel(name, flags, mode) \ + INLINE_SYSCALL (openat, 4, AT_FDCWD, name, flags, mode) +# define open_not_cancel_2(name, flags) \ + INLINE_SYSCALL (openat, 3, AT_FDCWD, name, flags) #endif -/* Uncancelable open. */ -#define open_not_cancel(name, flags, mode) \ - __open_nocancel (name, flags, mode) -#define open_not_cancel_2(name, flags) \ - __open_nocancel (name, flags) +/* Uncancelable read. */ +#define __read_nocancel(fd, buf, len) \ + INLINE_SYSCALL (read, 3, fd, buf, len) + +/* Uncancelable write. */ +#define __write_nocancel(fd, buf, len) \ + INLINE_SYSCALL (write, 3, fd, buf, len) /* Uncancelable openat. */ #define openat_not_cancel(fd, fname, oflag, mode) \ - __openat_nocancel (fd, fname, oflag, mode) + INLINE_SYSCALL (openat, 4, fd, fname, oflag, mode) #define openat_not_cancel_3(fd, fname, oflag) \ - __openat_nocancel (fd, fname, oflag, 0) + INLINE_SYSCALL (openat, 3, fd, fname, oflag) #define openat64_not_cancel(fd, fname, oflag, mode) \ - __openat64_nocancel (fd, fname, oflag, mode) + INLINE_SYSCALL (openat, 4, fd, fname, oflag | O_LARGEFILE, mode) #define openat64_not_cancel_3(fd, fname, oflag) \ - __openat64_nocancel (fd, fname, oflag, 0) + INLINE_SYSCALL (openat, 3, fd, fname, oflag | O_LARGEFILE) /* Uncancelable close. */ +#define __close_nocancel(fd) \ + INLINE_SYSCALL (close, 1, fd) #define close_not_cancel(fd) \ __close_nocancel (fd) #define close_not_cancel_no_status(fd) \ @@ -83,17 +83,27 @@ extern int __openat64_nocancel (int fd, const char *fname, int oflag, __fcntl_nocancel (fd, cmd, val) /* Uncancelable waitpid. */ -#define waitpid_not_cancel(pid, stat_loc, options) \ +#define __waitpid_nocancel(pid, stat_loc, options) \ INLINE_SYSCALL (wait4, 4, pid, stat_loc, options, NULL) +#define waitpid_not_cancel(pid, stat_loc, options) \ + __waitpid_nocancel(pid, stat_loc, options) /* Uncancelable pause. */ #define pause_not_cancel() \ - __pause_nocancel () + ({ sigset_t set; \ + int __rc = INLINE_SYSCALL (rt_sigprocmask, 4, SIG_BLOCK, NULL, &set, \ + _NSIG / 8); \ + if (__rc == 0) \ + __rc = INLINE_SYSCALL (rt_sigsuspend, 2, &set, _NSIG / 8); \ + __rc; \ + }) /* Uncancelable nanosleep. */ #define nanosleep_not_cancel(requested_time, remaining) \ - __nanosleep_nocancel (requested_time, remaining) + INLINE_SYSCALL (nanosleep, 2, requested_time, remaining) /* Uncancelable sigsuspend. */ #define sigsuspend_not_cancel(set) \ - __sigsuspend_nocancel (set) + INLINE_SYSCALL (rt_sigsuspend, 2, set, _NSIG / 8) + +#endif /* NOT_CANCEL_H */ diff --git a/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c b/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c index 5b6bb51..3578ea8 100644 --- a/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c +++ b/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c @@ -41,7 +41,7 @@ __get_clockfreq (void) contains at least one line like: timebase : 33333333 We search for this line and convert the number into an integer. */ - int fd = __open_nocancel ("/proc/cpuinfo", O_RDONLY); + int fd = open_not_cancel_2 ("/proc/cpuinfo", O_RDONLY); if (__glibc_likely (fd != -1)) return result; -- cgit v1.1