mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +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>
|
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
|
||||||
|
@ -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"'
|
||||||
|
@ -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)
|
@ -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. */
|
||||||
|
@ -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
|
||||||
|
@ -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
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user