mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 02:40:08 +00:00
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:
parent
a7fbedff76
commit
88499a87ce
13
ChangeLog
13
ChangeLog
@ -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>
|
||||
|
||||
* sysdeps/x86_64/multiarch/memcmp.S (__GI_memcmp): Correct
|
||||
|
@ -221,7 +221,6 @@ CFLAGS-spawnp.c = -fexceptions
|
||||
CFLAGS-spawnp.os = -fomit-frame-pointer
|
||||
CFLAGS-spawni.c = -fexceptions
|
||||
CFLAGS-spawni.os = -fomit-frame-pointer
|
||||
CFLAGS-pause.c = -fexceptions
|
||||
CFLAGS-glob.c = $(uses-callbacks) -fexceptions
|
||||
CFLAGS-glob64.c = $(uses-callbacks) -fexceptions
|
||||
CFLAGS-getconf.c = -DGETCONF_DIR='"$(libexecdir)/getconf"'
|
||||
|
@ -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, NULL, 0, NULL, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
weak_alias (__libc_pause, pause)
|
@ -32,6 +32,10 @@
|
||||
# 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. */
|
||||
# undef __NR_pause
|
||||
#endif
|
||||
|
||||
/* sparc only supports ipc syscall. */
|
||||
|
@ -9,6 +9,5 @@ sysdep_routines += __start_context
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),nptl)
|
||||
CFLAGS-pause.c += -fexceptions
|
||||
CFLAGS-sigsuspend.c += -fexceptions
|
||||
endif
|
||||
|
@ -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>
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user