Message ID | 1501765874-6201-10-git-send-email-adhemerval.zanella@linaro.org |
---|---|
State | Accepted |
Commit | 08d6eb46caf13f46ce052d2be34522068c5a6d33 |
Headers | show |
Series | None | expand |
Since this is a refactor, if no one opposes I will commit it shortly. On 03/08/2017 10:11, Adhemerval Zanella wrote: > This patch consolidates all the non cancellable pause calls to use > the __pause_nocancel identifier. For non cancellable targets it will > be just a macro to call the default respective symbol while on Linux > will be a internal one. > > Checked on x86_64-linux-gnu, x86_64-linux-gnu-x32, and i686-linux-gnu. > > * nptl/pthread_mutex_lock.c (__pthread_mutex_lock_full): Replace > pause_not_cancel with __pause_nocancel. > * sysdeps/generic/not-cancel.h (pause_not_cancel): Remove macro. > (__pause_nocancel): New macro. > * sysdeps/unix/sysv/linux/not-cancel.h (pause_not_cancel): Remove > macro. > (__pause_nocancel): New prototype. > * sysdeps/unix/sysv/linux/pause.c (__pause_nocancel): New function. > --- > ChangeLog | 9 +++++++++ > include/unistd.h | 2 -- > nptl/pthread_mutex_lock.c | 2 +- > sysdeps/generic/not-cancel.h | 2 +- > sysdeps/posix/pause.c | 15 --------------- > sysdeps/unix/sysv/linux/not-cancel.h | 10 ++-------- > sysdeps/unix/sysv/linux/pause.c | 14 +++++++++++++- > 7 files changed, 26 insertions(+), 28 deletions(-) > > diff --git a/ChangeLog b/ChangeLog > index e1df1c1..877c5d9 100644 > --- a/ChangeLog > +++ b/ChangeLog > @@ -1,5 +1,14 @@ > 2017-08-02 Adhemerval Zanella <adhemerval.zanella@linaro.org> > > + * nptl/pthread_mutex_lock.c (__pthread_mutex_lock_full): Replace > + pause_not_cancel with __pause_nocancel. > + * sysdeps/generic/not-cancel.h (pause_not_cancel): Remove macro. > + (__pause_nocancel): New macro. > + * sysdeps/unix/sysv/linux/not-cancel.h (pause_not_cancel): Remove > + macro. > + (__pause_nocancel): New prototype. > + * sysdeps/unix/sysv/linux/pause.c (__pause_nocancel): New function. > + > * login/utmp_file.c (timeout_handler): Replace fcntl_not_cancel with > __fcntl_nocancel. > * sysdeps/generic/not-cancel.h (fcntl_not_cancel): Remove macro. > diff --git a/include/unistd.h b/include/unistd.h > index 7f1c2cc..a5625ed 100644 > --- a/include/unistd.h > +++ b/include/unistd.h > @@ -172,8 +172,6 @@ extern __pid_t __libc_fork (void); > /* Suspend the process until a signal arrives. > This always returns -1 and sets `errno' to EINTR. */ > extern int __libc_pause (void); > -/* Not cancelable variant. */ > -extern int __pause_nocancel (void) attribute_hidden; > > extern int __getlogin_r_loginuid (char *name, size_t namesize) > attribute_hidden; > diff --git a/nptl/pthread_mutex_lock.c b/nptl/pthread_mutex_lock.c > index 8c48503..b158607 100644 > --- a/nptl/pthread_mutex_lock.c > +++ b/nptl/pthread_mutex_lock.c > @@ -428,7 +428,7 @@ __pthread_mutex_lock_full (pthread_mutex_t *mutex) > > /* Delay the thread indefinitely. */ > while (1) > - pause_not_cancel (); > + __pause_nocancel (); > } > > oldval = mutex->__data.__lock; > diff --git a/sysdeps/generic/not-cancel.h b/sysdeps/generic/not-cancel.h > index 3f924c8..f2140c2 100644 > --- a/sysdeps/generic/not-cancel.h > +++ b/sysdeps/generic/not-cancel.h > @@ -38,7 +38,7 @@ > (void) __writev (fd, iov, n) > # define __waitpid_nocancel(pid, stat_loc, options) \ > __waitpid (pid, stat_loc, options) > -#define pause_not_cancel() \ > +#define __pause_nocancel() \ > __pause () > #define nanosleep_not_cancel(requested_time, remaining) \ > __nanosleep (requested_time, remaining) > diff --git a/sysdeps/posix/pause.c b/sysdeps/posix/pause.c > index 7996cd6..53e143d 100644 > --- a/sysdeps/posix/pause.c > +++ b/sysdeps/posix/pause.c > @@ -39,18 +39,3 @@ __libc_pause (void) > weak_alias (__libc_pause, pause) > > LIBC_CANCEL_HANDLED (); /* sigsuspend handles our cancellation. */ > - > -#ifndef NO_CANCELLATION > -# include <not-cancel.h> > - > -int > -__pause_nocancel (void) > -{ > - sigset_t set; > - > - __sigemptyset (&set); > - __sigprocmask (SIG_BLOCK, NULL, &set); > - > - return sigsuspend_not_cancel (&set); > -} > -#endif > diff --git a/sysdeps/unix/sysv/linux/not-cancel.h b/sysdeps/unix/sysv/linux/not-cancel.h > index ad46d62..89c1f46 100644 > --- a/sysdeps/unix/sysv/linux/not-cancel.h > +++ b/sysdeps/unix/sysv/linux/not-cancel.h > @@ -78,14 +78,8 @@ __typeof (waitpid) __waitpid_nocancel; > libc_hidden_proto (__waitpid_nocancel) > > /* Uncancelable pause. */ > -#define pause_not_cancel() \ > - ({ 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; \ > - }) > +__typeof (pause) __pause_nocancel; > +libc_hidden_proto (__pause_nocancel) > > /* Uncancelable nanosleep. */ > #define nanosleep_not_cancel(requested_time, remaining) \ > diff --git a/sysdeps/unix/sysv/linux/pause.c b/sysdeps/unix/sysv/linux/pause.c > index 4ccce9e..ad105d9 100644 > --- a/sysdeps/unix/sysv/linux/pause.c > +++ b/sysdeps/unix/sysv/linux/pause.c > @@ -18,11 +18,12 @@ > > #include <signal.h> > #include <unistd.h> > + > #include <sysdep-cancel.h> > +#include <not-cancel.h> > > /* Suspend the process until a signal arrives. > This always returns -1 and sets errno to EINTR. */ > - > int > __libc_pause (void) > { > @@ -33,3 +34,14 @@ __libc_pause (void) > #endif > } > weak_alias (__libc_pause, pause) > + > +int > +__pause_nocancel (void) > +{ > +#ifdef __NR_pause > + return INLINE_SYSCALL_CALL (pause); > +#else > + return INLINE_SYSCALL_CALL (ppoll, NULL, 0, NULL, NULL); > +#endif > +} > +libc_hidden_def (__pause_nocancel) >
diff --git a/ChangeLog b/ChangeLog index e1df1c1..877c5d9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2017-08-02 Adhemerval Zanella <adhemerval.zanella@linaro.org> + * nptl/pthread_mutex_lock.c (__pthread_mutex_lock_full): Replace + pause_not_cancel with __pause_nocancel. + * sysdeps/generic/not-cancel.h (pause_not_cancel): Remove macro. + (__pause_nocancel): New macro. + * sysdeps/unix/sysv/linux/not-cancel.h (pause_not_cancel): Remove + macro. + (__pause_nocancel): New prototype. + * sysdeps/unix/sysv/linux/pause.c (__pause_nocancel): New function. + * login/utmp_file.c (timeout_handler): Replace fcntl_not_cancel with __fcntl_nocancel. * sysdeps/generic/not-cancel.h (fcntl_not_cancel): Remove macro. diff --git a/include/unistd.h b/include/unistd.h index 7f1c2cc..a5625ed 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -172,8 +172,6 @@ extern __pid_t __libc_fork (void); /* Suspend the process until a signal arrives. This always returns -1 and sets `errno' to EINTR. */ extern int __libc_pause (void); -/* Not cancelable variant. */ -extern int __pause_nocancel (void) attribute_hidden; extern int __getlogin_r_loginuid (char *name, size_t namesize) attribute_hidden; diff --git a/nptl/pthread_mutex_lock.c b/nptl/pthread_mutex_lock.c index 8c48503..b158607 100644 --- a/nptl/pthread_mutex_lock.c +++ b/nptl/pthread_mutex_lock.c @@ -428,7 +428,7 @@ __pthread_mutex_lock_full (pthread_mutex_t *mutex) /* Delay the thread indefinitely. */ while (1) - pause_not_cancel (); + __pause_nocancel (); } oldval = mutex->__data.__lock; diff --git a/sysdeps/generic/not-cancel.h b/sysdeps/generic/not-cancel.h index 3f924c8..f2140c2 100644 --- a/sysdeps/generic/not-cancel.h +++ b/sysdeps/generic/not-cancel.h @@ -38,7 +38,7 @@ (void) __writev (fd, iov, n) # define __waitpid_nocancel(pid, stat_loc, options) \ __waitpid (pid, stat_loc, options) -#define pause_not_cancel() \ +#define __pause_nocancel() \ __pause () #define nanosleep_not_cancel(requested_time, remaining) \ __nanosleep (requested_time, remaining) diff --git a/sysdeps/posix/pause.c b/sysdeps/posix/pause.c index 7996cd6..53e143d 100644 --- a/sysdeps/posix/pause.c +++ b/sysdeps/posix/pause.c @@ -39,18 +39,3 @@ __libc_pause (void) weak_alias (__libc_pause, pause) LIBC_CANCEL_HANDLED (); /* sigsuspend handles our cancellation. */ - -#ifndef NO_CANCELLATION -# include <not-cancel.h> - -int -__pause_nocancel (void) -{ - sigset_t set; - - __sigemptyset (&set); - __sigprocmask (SIG_BLOCK, NULL, &set); - - return sigsuspend_not_cancel (&set); -} -#endif diff --git a/sysdeps/unix/sysv/linux/not-cancel.h b/sysdeps/unix/sysv/linux/not-cancel.h index ad46d62..89c1f46 100644 --- a/sysdeps/unix/sysv/linux/not-cancel.h +++ b/sysdeps/unix/sysv/linux/not-cancel.h @@ -78,14 +78,8 @@ __typeof (waitpid) __waitpid_nocancel; libc_hidden_proto (__waitpid_nocancel) /* Uncancelable pause. */ -#define pause_not_cancel() \ - ({ 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; \ - }) +__typeof (pause) __pause_nocancel; +libc_hidden_proto (__pause_nocancel) /* Uncancelable nanosleep. */ #define nanosleep_not_cancel(requested_time, remaining) \ diff --git a/sysdeps/unix/sysv/linux/pause.c b/sysdeps/unix/sysv/linux/pause.c index 4ccce9e..ad105d9 100644 --- a/sysdeps/unix/sysv/linux/pause.c +++ b/sysdeps/unix/sysv/linux/pause.c @@ -18,11 +18,12 @@ #include <signal.h> #include <unistd.h> + #include <sysdep-cancel.h> +#include <not-cancel.h> /* Suspend the process until a signal arrives. This always returns -1 and sets errno to EINTR. */ - int __libc_pause (void) { @@ -33,3 +34,14 @@ __libc_pause (void) #endif } weak_alias (__libc_pause, pause) + +int +__pause_nocancel (void) +{ +#ifdef __NR_pause + return INLINE_SYSCALL_CALL (pause); +#else + return INLINE_SYSCALL_CALL (ppoll, NULL, 0, NULL, NULL); +#endif +} +libc_hidden_def (__pause_nocancel)