posix: Consolidate Linux pause syscall

This patch consolidates the pause Linux implementation on
sysdeps/unix/sysv/linux/pause.c.  If defined the pause syscall
(__NR_pause) will be used, other ppoll with 0 arguments will be
used instead.

It has the small advantage of generic pause implementation with
uses rt_sigprocmask plus rt_sigsuspend because it requires only
one syscall and the pause is done atomically regarding signal
handling (for instance, pause may not be interrupted if the
signal arrives between the rt_sigprocmask and rt_sigsuspend
syscall).

Checked on i686-linux-gnu, x86_64-linux-gnu, x86_64-linux-gnux32,
arch64-linux-gnu, arm-linux-gnueabihf, powerpc64le-linux-gnu,
sparc64-linux-gnu, and sparcv9-linux-gnu.

	* sysdeps/unix/sysv/linux/generic/pause.c: Remove file.
	* sysdeps/unix/sysv/linux/sparc/sparc64/pause.c: Likewise.
	* sysdeps/unix/sysv/linux/sparc/kernel-features.h [__arch64__]
	(__NR_pause): Undefine.
	* sysdeps/unix/sysv/linux/pause.c: New file.
	* sysdeps/unix/sysv/linux/syscalls.list: Remove pause from
	auto-generation list.
This commit is contained in:
Adhemerval Zanella 2016-11-21 17:26:35 -02:00
parent a7fbedff76
commit 88499a87ce
7 changed files with 24 additions and 23 deletions

View File

@ -1,3 +1,16 @@
2017-05-18 Adhemerval Zanella <adhemerval.zanella@linaro.org>
* sysdeps/unix/sysv/linux/generic/pause.c: Remove file.
* sysdeps/unix/sysv/linux/sparc/sparc64/pause.c: Likewise.
* sysdeps/unix/sysv/linux/sparc/kernel-features.h [__arch64__]
(__NR_pause): Undefine.
* sysdeps/unix/sysv/linux/pause.c: New file.
* sysdeps/unix/sysv/linux/syscalls.list: Remove pause from
auto-generation list.
* sysdeps/unix/sysv/linux/sparc/sparc64/Makefile (CFLAGS-pause.c):
Remove rule.
* posix/Makefile (CFLAGS-pause.c): Remove redundant rule.
2017-05-18 H.J. Lu <hongjiu.lu@intel.com> 2017-05-18 H.J. Lu <hongjiu.lu@intel.com>
* sysdeps/x86_64/multiarch/memcmp.S (__GI_memcmp): Correct * sysdeps/x86_64/multiarch/memcmp.S (__GI_memcmp): Correct

View File

@ -221,7 +221,6 @@ CFLAGS-spawnp.c = -fexceptions
CFLAGS-spawnp.os = -fomit-frame-pointer CFLAGS-spawnp.os = -fomit-frame-pointer
CFLAGS-spawni.c = -fexceptions CFLAGS-spawni.c = -fexceptions
CFLAGS-spawni.os = -fomit-frame-pointer CFLAGS-spawni.os = -fomit-frame-pointer
CFLAGS-pause.c = -fexceptions
CFLAGS-glob.c = $(uses-callbacks) -fexceptions CFLAGS-glob.c = $(uses-callbacks) -fexceptions
CFLAGS-glob64.c = $(uses-callbacks) -fexceptions CFLAGS-glob64.c = $(uses-callbacks) -fexceptions
CFLAGS-getconf.c = -DGETCONF_DIR='"$(libexecdir)/getconf"' CFLAGS-getconf.c = -DGETCONF_DIR='"$(libexecdir)/getconf"'

View File

@ -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. 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 The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public modify it under the terms of the GNU Lesser General Public
@ -26,14 +26,10 @@
int int
__libc_pause (void) __libc_pause (void)
{ {
sigset_t set; #ifdef __NR_pause
return SYSCALL_CANCEL (pause);
int rc = #else
SYSCALL_CANCEL (rt_sigprocmask, SIG_BLOCK, NULL, &set, _NSIG / 8); return SYSCALL_CANCEL (ppoll, NULL, 0, NULL, NULL);
if (rc == 0) #endif
rc = SYSCALL_CANCEL (rt_sigsuspend, &set, _NSIG / 8);
return rc;
} }
weak_alias (__libc_pause, pause) weak_alias (__libc_pause, pause)

View File

@ -32,6 +32,10 @@
# undef __ASSUME_ACCEPT_SYSCALL # undef __ASSUME_ACCEPT_SYSCALL
# undef __ASSUME_CONNECT_SYSCALL # undef __ASSUME_CONNECT_SYSCALL
# undef __ASSUME_RECVFROM_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. */
# undef __NR_pause
#endif #endif
/* sparc only supports ipc syscall. */ /* sparc only supports ipc syscall. */

View File

@ -9,6 +9,5 @@ sysdep_routines += __start_context
endif endif
ifeq ($(subdir),nptl) ifeq ($(subdir),nptl)
CFLAGS-pause.c += -fexceptions
CFLAGS-sigsuspend.c += -fexceptions CFLAGS-sigsuspend.c += -fexceptions
endif endif

View File

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

View File

@ -44,7 +44,6 @@ munlock - munlock i:ai munlock
munlockall - munlockall i: munlockall munlockall - munlockall i: munlockall
nanosleep - nanosleep Ci:pp __nanosleep nanosleep nanosleep - nanosleep Ci:pp __nanosleep nanosleep
nfsservctl EXTRA nfsservctl i:ipp nfsservctl nfsservctl EXTRA nfsservctl i:ipp nfsservctl
pause - pause Ci: __libc_pause pause
pipe - pipe i:f __pipe pipe pipe - pipe i:f __pipe pipe
pipe2 - pipe2 i:fi __pipe2 pipe2 pipe2 - pipe2 i:fi __pipe2 pipe2
pivot_root EXTRA pivot_root i:ss pivot_root pivot_root EXTRA pivot_root i:ss pivot_root