Message ID | 1494611894-9282-1-git-send-email-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | [01/13] posix: Consolidate Linux pause syscall | expand |
On 05/12/2017 07:58 PM, Adhemerval Zanella wrote: > +/* sparc64 defines __NR_pause, however it is not supported (ENOSYS). > + Undefine so pause.c can use a correct alternative. */ > +# ifdef __NR_pause > +# undef __NR_pause > +# endif I think you can #undef unconditionally, there isn't a warning for that. + return SYSCALL_CANCEL (ppoll, 0, 0, 0, 0, 0); I think some of the arguments should be NULL instead of 0. I'm not completely sure if an empty ppoll without a timeout has the required semantics, but I can't think of a reason why it would not work. Thanks, Florian
On 12/05/2017 15:15, Florian Weimer wrote: > On 05/12/2017 07:58 PM, Adhemerval Zanella wrote: >> +/* sparc64 defines __NR_pause, however it is not supported (ENOSYS). >> + Undefine so pause.c can use a correct alternative. */ >> +# ifdef __NR_pause >> +# undef __NR_pause >> +# endif > > I think you can #undef unconditionally, there isn't a warning for that. Alright, I will change it. > > + return SYSCALL_CANCEL (ppoll, 0, 0, 0, 0, 0); > > I think some of the arguments should be NULL instead of 0. I will change to SYSCALL_CANCEL (ppoll, NULL, 0, NULL, NULL). > > I'm not completely sure if an empty ppoll without a timeout has the required semantics, but I can't think of a reason why it would not work. I though about Linux syscall with similar semantics regarding signals, but I couldn't find one.
diff --git a/sysdeps/unix/sysv/linux/generic/pause.c b/sysdeps/unix/sysv/linux/pause.c similarity index 75% rename from sysdeps/unix/sysv/linux/generic/pause.c rename to sysdeps/unix/sysv/linux/pause.c index a8b3e33..c6b252a 100644 --- a/sysdeps/unix/sysv/linux/generic/pause.c +++ b/sysdeps/unix/sysv/linux/pause.c @@ -1,6 +1,6 @@ -/* Copyright (C) 2011-2017 Free Software Foundation, Inc. +/* Linux pause syscall implementation. + Copyright (C) 2017 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -26,14 +26,10 @@ int __libc_pause (void) { - sigset_t set; - - int rc = - SYSCALL_CANCEL (rt_sigprocmask, SIG_BLOCK, NULL, &set, _NSIG / 8); - if (rc == 0) - rc = SYSCALL_CANCEL (rt_sigsuspend, &set, _NSIG / 8); - - return rc; +#ifdef __NR_pause + return SYSCALL_CANCEL (pause); +#else + return SYSCALL_CANCEL (ppoll, 0, 0, 0, 0, 0); +#endif } - weak_alias (__libc_pause, pause) diff --git a/sysdeps/unix/sysv/linux/sparc/kernel-features.h b/sysdeps/unix/sysv/linux/sparc/kernel-features.h index 72065a0..dd9108b 100644 --- a/sysdeps/unix/sysv/linux/sparc/kernel-features.h +++ b/sysdeps/unix/sysv/linux/sparc/kernel-features.h @@ -32,6 +32,12 @@ # undef __ASSUME_ACCEPT_SYSCALL # undef __ASSUME_CONNECT_SYSCALL # undef __ASSUME_RECVFROM_SYSCALL +#else +/* sparc64 defines __NR_pause, however it is not supported (ENOSYS). + Undefine so pause.c can use a correct alternative. */ +# ifdef __NR_pause +# undef __NR_pause +# endif #endif /* sparc only supports ipc syscall. */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/pause.c b/sysdeps/unix/sysv/linux/sparc/sparc64/pause.c deleted file mode 100644 index e399e7c..0000000 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/pause.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <errno.h> -#include <signal.h> -#include <unistd.h> -#include <sysdep-cancel.h> - -#define __sigprocmask(how, set, oset) \ - INLINE_SYSCALL (rt_sigprocmask, 4, how, set, oset, _NSIG / 8) - -#include <sysdeps/posix/pause.c> diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list index f4abf3e..eab30dd 100644 --- a/sysdeps/unix/sysv/linux/syscalls.list +++ b/sysdeps/unix/sysv/linux/syscalls.list @@ -44,7 +44,6 @@ munlock - munlock i:ai munlock munlockall - munlockall i: munlockall nanosleep - nanosleep Ci:pp __nanosleep nanosleep nfsservctl EXTRA nfsservctl i:ipp nfsservctl -pause - pause Ci: __libc_pause pause pipe - pipe i:f __pipe pipe pipe2 - pipe2 i:fi __pipe2 pipe2 pivot_root EXTRA pivot_root i:ss pivot_root