2003-06-15  Ulrich Drepper  <drepper@redhat.com>

	Fix cancellation point handling wrt exception based cleanup.
	* io/Makefile: Compile fcntl.c, poll.c, and lockf.c with exceptions.
	* misc/Makefile: Compile pselect.c, readv.c, writev.c, and usleep.c
	with exceptions.
	* posix/Makefile: Compile pread.c, pread64.c, pwrite.c, pwrite64.c,
	sleep.c, wait.c, waitid.c, and waitpid.c with exceptions.
	* rt/Makefile: Compile aio_suspend.c and clock_nanosleep.c with
	exceptions.
	* signal/Makefile: Compile sigpause.c, sigsuspend.c, sigtimedwait.c,
	sigwait.c, and sigwaitinfo.c with exceptions.
	* stdlib/Makefile: Compile system.c with exceptions.
	* sysvipc/Makefile: Compile msgrcv.c and msgsnd.c with exceptions.
	* termios/Makefile: Compile tcdrain.c with exceptions.
	* sysdeps/generic/lockf.c: Add comment explaining the cancellation
	situation.
	* sysdeps/generic/pselect.c: Likewise.
	* sysdeps/posix/sigpause.c: Likewise.
	* sysdeps/posix/system.c: Likewise.
	* sysdeps/posix/waitid.c: Likewise.
	* sysdeps/unix/sysv/linux/sleep.c: Likewise.
	* sysdeps/unix/sysv/linux/usleep.c: Likewise.
	* sysdeps/unix/sysv/linux/i386/sysdep.h: Major rewrite of
	INTERNAL_SYSCALL to not use push inside asm statement so that
	unwind info is correct around the syscall.
	* sysdeps/unix/clock_nanosleep.c: Add cancellation support.
	* sysdeps/unix/sysv/linux/clock_nanosleep.c: Likewise.
This commit is contained in:
Ulrich Drepper 2003-06-15 21:22:26 +00:00
parent 1fde494e69
commit 7a1147946e
31 changed files with 360 additions and 61 deletions

View File

@ -1,3 +1,32 @@
2003-06-15 Ulrich Drepper <drepper@redhat.com>
Fix cancellation point handling wrt exception based cleanup.
* io/Makefile: Compile fcntl.c, poll.c, and lockf.c with exceptions.
* misc/Makefile: Compile pselect.c, readv.c, writev.c, and usleep.c
with exceptions.
* posix/Makefile: Compile pread.c, pread64.c, pwrite.c, pwrite64.c,
sleep.c, wait.c, waitid.c, and waitpid.c with exceptions.
* rt/Makefile: Compile aio_suspend.c and clock_nanosleep.c with
exceptions.
* signal/Makefile: Compile sigpause.c, sigsuspend.c, sigtimedwait.c,
sigwait.c, and sigwaitinfo.c with exceptions.
* stdlib/Makefile: Compile system.c with exceptions.
* sysvipc/Makefile: Compile msgrcv.c and msgsnd.c with exceptions.
* termios/Makefile: Compile tcdrain.c with exceptions.
* sysdeps/generic/lockf.c: Add comment explaining the cancellation
situation.
* sysdeps/generic/pselect.c: Likewise.
* sysdeps/posix/sigpause.c: Likewise.
* sysdeps/posix/system.c: Likewise.
* sysdeps/posix/waitid.c: Likewise.
* sysdeps/unix/sysv/linux/sleep.c: Likewise.
* sysdeps/unix/sysv/linux/usleep.c: Likewise.
* sysdeps/unix/sysv/linux/i386/sysdep.h: Major rewrite of
INTERNAL_SYSCALL to not use push inside asm statement so that
unwind info is correct around the syscall.
* sysdeps/unix/clock_nanosleep.c: Add cancellation support.
* sysdeps/unix/sysv/linux/clock_nanosleep.c: Likewise.
2003-06-15 Andreas Jaeger <aj@suse.de>
* sysdeps/x86_64/dl-machine.h (ELF_MACHINE_RUNTIME_TRAMPOLINE):

View File

@ -64,6 +64,10 @@ distribute := ftwtest-sh
include ../Rules
CFLAGS-fts.c = -Wno-uninitialized
CFLAGS-fcntl.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-poll.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-lockf.c = -fexceptions
CFLAGS-test-stat.c = -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
CFLAGS-test-lfs.c = -D_LARGEFILE64_SOURCE

View File

@ -77,6 +77,10 @@ tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch
CFLAGS-tsearch.c = $(exceptions)
CFLAGS-lsearch.c = $(exceptions)
CFLAGS-pselect.c = -fexceptions
CFLAGS-readv.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-writev.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-usleep.c = -fexceptions
include ../Rules

View File

@ -1,3 +1,25 @@
2003-06-15 Ulrich Drepper <drepper@redhat.com>
* pthreadP.h (LIBC_CANCEL_ASYNC): Also define for librt.
(LIBC_CANCEL_RESET): Likewise.
Declare __librt_enable_asynccancel and __librt_disable_asynccancel.
* sysdeps/pthread/Makefile (librt-sysdep_routines): Add
librt-cancellation.
(CFLAGS-libcrt-cancellation.c): Define.
* sysdeps/pthread/librt-cancellation.c: New file.
* sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Define all the nice
macros also when compiling librt.
* sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/timer_create.c: Add prototype for
compat_timer_create.
2003-06-14 Ulrich Drepper <drepper@redhat.com>
* sysdeps/pthread/posix-timer.h (timespec_compare): Always inline.

View File

@ -26,8 +26,9 @@ libpthread-sysdep_routines += errno-loc
endif
ifeq ($(subdir),rt)
librt-sysdep_routines += timer_routines
librt-sysdep_routines += timer_routines librt-cancellation
CPPFLAGS-timer_routines.c = -I../nptl
CFLAGS-librt-cancellation.c += -fexceptions -fasynchronous-unwind-tables
ifeq (yes,$(build-shared))
$(objpfx)tst-timer: $(objpfx)librt.so $(shared-thread-library)

View File

@ -0,0 +1,122 @@
/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <setjmp.h>
#include <signal.h>
#include <stdlib.h>
#include "pthreadP.h"
#include "atomic.h"
#ifdef IS_IN_librt
/* The next two functions are similar to pthread_setcanceltype() but
more specialized for the use in the cancelable functions like write().
They do not need to check parameters etc. */
int
attribute_hidden
__librt_enable_asynccancel (void)
{
struct pthread *self = THREAD_SELF;
int oldval = THREAD_GETMEM (self, cancelhandling);
while (1)
{
int newval = oldval | CANCELTYPE_BITMASK;
if (__builtin_expect ((oldval & CANCELED_BITMASK) != 0, 0))
{
/* If we are already exiting stop right here. */
if ((oldval & EXITING_BITMASK) != 0)
break;
int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling,
newval, oldval);
if (__builtin_expect (curval != oldval, 0))
{
/* Somebody else modified the word, try again. */
oldval = curval;
continue;
}
THREAD_SETMEM (self, result, PTHREAD_CANCELED);
__do_cancel ();
/* NOTREACHED */
}
int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval,
oldval);
if (__builtin_expect (curval == oldval, 1))
break;
/* Prepare the next round. */
oldval = curval;
}
return oldval;
}
void
internal_function attribute_hidden
__librt_disable_asynccancel (int oldtype)
{
/* If asynchronous cancellation was enabled before we do not have
anything to do. */
if (oldtype & CANCELTYPE_BITMASK)
return;
struct pthread *self = THREAD_SELF;
int oldval = THREAD_GETMEM (self, cancelhandling);
while (1)
{
int newval = oldval & ~CANCELTYPE_BITMASK;
if (newval == oldval)
break;
int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval,
oldval);
if (__builtin_expect (curval == oldval, 1))
break;
/* Prepare the next round. */
oldval = curval;
}
}
/* XXX Hack ahead. In librt we currently do not have access to a
function equivalent to __pthread_unwind. Therefore we just raise a
signal. */
void
attribute_hidden
__pthread_unwind (__pthread_unwind_buf_t *buf)
{
INTERNAL_SYSCALL_DECL (err);
while (1)
INTERNAL_SYSCALL (tkill, err, 2, THREAD_GETMEM (THREAD_SELF, tid),
SIGCANCEL);
}
#endif

View File

@ -23,7 +23,7 @@
# include <nptl/pthreadP.h>
#endif
#if !defined NOT_IN_libc || defined IS_IN_libpthread
#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \

View File

@ -23,7 +23,7 @@
# include <nptl/pthreadP.h>
#endif
#if !defined NOT_IN_libc || defined IS_IN_libpthread
#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \

View File

@ -24,7 +24,7 @@
# include <nptl/pthreadP.h>
#endif
#if !defined NOT_IN_libc || defined IS_IN_libpthread
#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \

View File

@ -24,7 +24,7 @@
# include <nptl/pthreadP.h>
#endif
#if !defined NOT_IN_libc || defined IS_IN_libpthread
#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \

View File

@ -23,7 +23,7 @@
# include <nptl/pthreadP.h>
#endif
#if !defined NOT_IN_libc || defined IS_IN_libpthread
#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \

View File

@ -23,7 +23,7 @@
# include <nptl/pthreadP.h>
#endif
#if !defined NOT_IN_libc || defined IS_IN_libpthread
#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \

View File

@ -22,7 +22,7 @@
# include <nptl/pthreadP.h>
#endif
#if !defined NOT_IN_libc || defined IS_IN_libpthread
#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
# define _IMM12 #-12
# define _IMM16 #-16

View File

@ -32,6 +32,8 @@
#ifdef __NR_timer_create
# ifndef __ASSUME_POSIX_TIMERS
static int compat_timer_create (clockid_t clock_id, struct sigevent *evp,
timer_t *timerid);
# define timer_create static compat_timer_create
# include <nptl/sysdeps/pthread/timer_create.c>
# undef timer_create

View File

@ -23,7 +23,7 @@
# include <nptl/pthreadP.h>
#endif
#if !defined NOT_IN_libc || defined IS_IN_libpthread
#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \

View File

@ -118,6 +118,15 @@ endif
CFLAGS-regex.c = -Wno-strict-prototypes
CFLAGS-getaddrinfo.c = -DRESOLVER
CFLAGS-pread.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-pread64.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-pwrite.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-pwrite64.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-sleep.c = -fexceptions
CFLAGS-wait.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-waitid.c = -fexceptions
CFLAGS-waitpid.c = -fexceptions -fasynchronous-unwind-tables
tstgetopt-ARGS = -a -b -cfoobar --required foobar --optional=bazbug \
--none random --col --color --colour

View File

@ -49,6 +49,9 @@ distribute := aio_misc.h
include ../Rules
CFLAGS-aio_suspend.c = -fexceptions
CFLAGS-clock_nanosleep.c = -fexceptions -fasynchronous-unwind-tables
# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
# This ensures they will load libc.so for needed symbols if loaded by
# a statically-linked program that hasn't already loaded it.

View File

@ -44,3 +44,9 @@ distribute := sigsetops.h testrtsig.h sigset-cvt-mask.h
include ../Rules
CFLAGS-sigpause.c = -fexceptions
CFLAGS-sigsuspend.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-sigtimedwait.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-sigwait.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-sigwaitinfo.c = -fexceptions -fasynchronous-unwind-tables

View File

@ -82,6 +82,7 @@ generated += isomac isomac.out
CFLAGS-bsearch.c = $(exceptions)
CFLAGS-msort.c = $(exceptions)
CFLAGS-qsort.c = $(exceptions)
CFLAGS-system.c = -fexceptions
include ../Makeconfig

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1994, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
/* Copyright (C) 1994,1996,1997,1998,2000,2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -67,5 +67,8 @@ lockf (int fd, int cmd, off_t len)
return -1;
}
/* lockf() is a cancellation point but so is fcntl() if F_SETLKW is
used. Therefore we don't have to care about cancellation here,
the fcntl() function will take care of it. */
return __fcntl (fd, cmd, &fl);
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996, 1997, 1998, 2001, 2002 Free Software Foundation, Inc.
/* Copyright (C) 1996,1997,1998,2001,2002,2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@ -50,6 +50,9 @@ do_pselect (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
if (sigmask != NULL)
__sigprocmask (SIG_SETMASK, sigmask, &savemask);
/* Note the pselect() is a cancellation point. But since we call
select() which itself is a cancellation point we do not have
to do anything here. */
retval = __select (nfds, readfds, writefds, exceptfds,
timeout != NULL ? &tval : NULL);

View File

@ -40,6 +40,9 @@ do_sigpause (int sig_or_mask, int is_sig)
else if (sigset_set_old_mask (&set, sig_or_mask) < 0)
return -1;
/* Note the sigpause() is a cancellation point. But since we call
sigsuspend() which itself is a cancellation point we do not have
to do anything here. */
return __sigsuspend (&set);
}

View File

@ -162,6 +162,9 @@ do_system (const char *line)
}
while (child != pid);
#else
/* Note the system() is a cancellation point. But since we call
waitpid() which itself is a cancellation point we do not
have to do anything here. */
if (TEMP_FAILURE_RETRY (__waitpid (pid, &status, 0)) != pid)
status = -1;
#endif

View File

@ -1,5 +1,5 @@
/* Pseudo implementation of waitid.
Copyright (C) 1997, 1998, 2002 Free Software Foundation, Inc.
Copyright (C) 1997, 1998, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1997.
@ -66,6 +66,9 @@ do_waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options)
return -1;
}
/* Note the waitid() is a cancellation point. But since we call
waitpid() which itself is a cancellation point we do not have
to do anything here. */
child = __waitpid (pid, &status, options);
if (child == -1)

View File

@ -21,7 +21,7 @@
#include <errno.h>
#include <time.h>
#include <hp-timing.h>
#include <sysdep-cancel.h>
#if HP_TIMING_AVAIL
# define CPUCLOCK_P(clock) \
@ -94,5 +94,15 @@ clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
/* Not supported. */
return ENOTSUP;
return __builtin_expect (nanosleep (req, rem), 0) ? errno : 0;
if (SINGLE_THREAD_P)
return __builtin_expect (nanosleep (req, rem), 0) ? errno : 0;
/* More than one thread running, enable cancellation. */
int oldstate = LIBC_CANCEL_ASYNC ();
int result = __builtin_expect (nanosleep (req, rem), 0) ? errno : 0;
LIBC_CANCEL_RESET (oldstate);
return result;
}

View File

@ -18,7 +18,7 @@
#include <time.h>
#include <sysdep.h>
#include <sysdep-cancel.h>
#include "kernel-features.h"
@ -32,7 +32,18 @@ clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
INTERNAL_SYSCALL_DECL (err);
int r;
r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, req, rem);
if (SINGLE_THREAD_P)
r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, req, rem);
else
{
int oldstate = LIBC_CANCEL_ASYNC ();
r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, req,
rem);
LIBC_CANCEL_RESET (oldstate);
}
return (INTERNAL_SYSCALL_ERROR_P (r, err)
? INTERNAL_SYSCALL_ERRNO (r, err) : 0);
}
@ -48,15 +59,20 @@ extern int __libc_missing_posix_timers attribute_hidden;
if (!__libc_missing_posix_timers) \
{ \
INTERNAL_SYSCALL_DECL (err); \
\
int oldstate = LIBC_CANCEL_ASYNC (); \
\
int r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, \
req, rem); \
\
LIBC_CANCEL_RESET (oldstate); \
\
if (!INTERNAL_SYSCALL_ERROR_P (r, err)) \
return 0; \
\
if (INTERNAL_SYSCALL_ERRNO (r, err) != ENOSYS) \
return INTERNAL_SYSCALL_ERRNO (r, err); \
\
\
__libc_missing_posix_timers = 1; \
}
# endif

View File

@ -297,7 +297,7 @@ asm (".L__X'%ebx = 1\n\t"
".macro bpushl name reg\n\t"
".if 1 - \\name\n\t"
".if 2 - \\name\n\t"
"pushl %ebx\n\t"
"error\n\t"
".else\n\t"
"xchgl \\reg, %ebx\n\t"
".endif\n\t"
@ -306,18 +306,11 @@ asm (".L__X'%ebx = 1\n\t"
".macro bpopl name reg\n\t"
".if 1 - \\name\n\t"
".if 2 - \\name\n\t"
"popl %ebx\n\t"
"error\n\t"
".else\n\t"
"xchgl \\reg, %ebx\n\t"
".endif\n\t"
".endif\n\t"
".endm\n\t"
".macro bmovl name reg\n\t"
".if 1 - \\name\n\t"
".if 2 - \\name\n\t"
"movl \\reg, %ebx\n\t"
".endif\n\t"
".endif\n\t"
".endm\n\t");
/* Define a macro which expands inline into the wrapper code for a system
@ -342,7 +335,8 @@ asm (".L__X'%ebx = 1\n\t"
# ifdef SHARED
# define INTERNAL_SYSCALL(name, err, nr, args...) \
({ \
unsigned int resultvar; \
register unsigned int resultvar; \
EXTRAVAR_##nr \
asm volatile ( \
LOADARGS_##nr \
"movl %1, %%eax\n\t" \
@ -355,7 +349,8 @@ asm (".L__X'%ebx = 1\n\t"
# else
# define INTERNAL_SYSCALL(name, err, nr, args...) \
({ \
unsigned int resultvar; \
register unsigned int resultvar; \
EXTRAVAR_##nr \
asm volatile ( \
LOADARGS_##nr \
"movl %1, %%eax\n\t" \
@ -368,11 +363,12 @@ asm (".L__X'%ebx = 1\n\t"
#else
# define INTERNAL_SYSCALL(name, err, nr, args...) \
({ \
unsigned int resultvar; \
register unsigned int resultvar; \
EXTRAVAR_##nr \
asm volatile ( \
LOADARGS_##nr \
"movl %1, %%eax\n\t" \
"int $0x80\n\t" \
"int $0x80\n\t" \
RESTOREARGS_##nr \
: "=a" (resultvar) \
: "i" (__NR_##name) ASMFMT_##nr(args) : "memory", "cc"); \
@ -390,44 +386,92 @@ asm (".L__X'%ebx = 1\n\t"
#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val))
#define LOADARGS_0
#if defined I386_USE_SYSENTER && defined SHARED
# define LOADARGS_1 \
"bpushl .L__X'%k3, %k3\n\t" \
"bmovl .L__X'%k3, %k3\n\t"
#ifdef __PIC__
# if defined I386_USE_SYSENTER
# define LOADARGS_1 \
"bpushl .L__X'%k3, %k3\n\t"
# define LOADARGS_5 \
"movl %%ebx, %4\n\t" \
"movl %3, %%ebx\n\t"
# else
# define LOADARGS_1 \
"bpushl .L__X'%k2, %k2\n\t"
# define LOADARGS_5 \
"movl %%ebx, %3\n\t" \
"movl %2, %%ebx\n\t"
# endif
# define LOADARGS_2 LOADARGS_1
# define LOADARGS_3 \
"xchgl %%ebx, %%edi\n\t"
# define LOADARGS_4 LOADARGS_3
#else
# define LOADARGS_1 \
"bpushl .L__X'%k2, %k2\n\t" \
"bmovl .L__X'%k2, %k2\n\t"
# define LOADARGS_1
# define LOADARGS_2
# define LOADARGS_3
# define LOADARGS_4
# define LOADARGS_5
#endif
#define LOADARGS_2 LOADARGS_1
#define LOADARGS_3 LOADARGS_1
#define LOADARGS_4 LOADARGS_1
#define LOADARGS_5 LOADARGS_1
#define RESTOREARGS_0
#if defined I386_USE_SYSENTER && defined SHARED
# define RESTOREARGS_1 \
#ifdef __PIC__
# if defined I386_USE_SYSENTER && defined SHARED
# define RESTOREARGS_1 \
"bpopl .L__X'%k3, %k3\n\t"
#else
# define RESTOREARGS_1 \
# define RESTOREARGS_5 \
"movl %4, %%ebx"
# else
# define RESTOREARGS_1 \
"bpopl .L__X'%k2, %k2\n\t"
# define RESTOREARGS_5 \
"movl %3, %%ebx"
# endif
# define RESTOREARGS_2 RESTOREARGS_1
# define RESTOREARGS_3 \
"xchgl %%edi, %%ebx\n\t"
# define RESTOREARGS_4 RESTOREARGS_3
#else
# define RESTOREARGS_1
# define RESTOREARGS_2
# define RESTOREARGS_3
# define RESTOREARGS_4
# define RESTOREARGS_5
#endif
#define RESTOREARGS_2 RESTOREARGS_1
#define RESTOREARGS_3 RESTOREARGS_1
#define RESTOREARGS_4 RESTOREARGS_1
#define RESTOREARGS_5 RESTOREARGS_1
#define ASMFMT_0()
#define ASMFMT_1(arg1) \
, "acdSD" (arg1)
#define ASMFMT_2(arg1, arg2) \
#ifdef __PIC__
# define ASMFMT_1(arg1) \
, "cd" (arg1)
# define ASMFMT_2(arg1, arg2) \
, "d" (arg1), "c" (arg2)
#define ASMFMT_3(arg1, arg2, arg3) \
, "aSD" (arg1), "c" (arg2), "d" (arg3)
#define ASMFMT_4(arg1, arg2, arg3, arg4) \
, "aD" (arg1), "c" (arg2), "d" (arg3), "S" (arg4)
#define ASMFMT_5(arg1, arg2, arg3, arg4, arg5) \
, "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5)
# define ASMFMT_3(arg1, arg2, arg3) \
, "D" (arg1), "c" (arg2), "d" (arg3)
# define ASMFMT_4(arg1, arg2, arg3, arg4) \
, "D" (arg1), "c" (arg2), "d" (arg3), "S" (arg4)
# define ASMFMT_5(arg1, arg2, arg3, arg4, arg5) \
, "0" (arg1), "m" (_xv), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5)
#else
# define ASMFMT_1(arg1) \
, "b" (arg1)
# define ASMFMT_2(arg1, arg2) \
, "b" (arg1), "c" (arg2)
# define ASMFMT_3(arg1, arg2, arg3) \
, "b" (arg1), "c" (arg2), "d" (arg3)
# define ASMFMT_4(arg1, arg2, arg3, arg4) \
, "b" (arg1), "c" (arg2), "d" (arg3), "S" (arg4)
# define ASMFMT_5(arg1, arg2, arg3, arg4, arg5) \
, "b" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5)
#endif
#define EXTRAVAR_0
#define EXTRAVAR_1
#define EXTRAVAR_2
#define EXTRAVAR_3
#define EXTRAVAR_4
#ifdef __PIC__
# define EXTRAVAR_5 int _xv;
#else
# define EXTRAVAR_5
#endif
#endif /* __ASSEMBLER__ */

View File

@ -1,5 +1,5 @@
/* Implementation of the POSIX sleep function using nanosleep.
Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998, 1999, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@ -64,6 +64,9 @@ __sleep (unsigned int seconds)
return -1;
}
/* Note the sleep() is a cancellation point. But since we call
nanosleep() which itself is a cancellation point we do not
have to do anything here. */
if (oact.sa_handler == SIG_IGN)
{
/* We should leave SIGCHLD blocked. */

View File

@ -1,5 +1,5 @@
/* Implementation of the BSD usleep function using nanosleep.
Copyright (C) 1996, 1997, 1999, 2001 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1999, 2001, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@ -27,5 +27,8 @@ usleep (useconds_t useconds)
struct timespec ts = { .tv_sec = (long int) (useconds / 1000000),
.tv_nsec = (long int) (useconds % 1000000) * 1000ul };
/* Note the usleep() is a cancellation point. But since we call
nanosleep() which itself is a cancellation point we do not have
to do anything here. */
return __nanosleep (&ts, NULL);
}

View File

@ -30,3 +30,6 @@ routines := ftok \
shmat shmdt shmget shmctl
include ../Rules
CFLAGS-msgrcv.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-msgsnd.c = -fexceptions -fasynchronous-unwind-tables

View File

@ -1,4 +1,4 @@
# Copyright (C) 1991, 1992, 1993, 1995, 1997 Free Software Foundation, Inc.
# Copyright (C) 1991,1992,1993,1995,1997,2003 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@ -28,3 +28,5 @@ routines := speed cfsetspeed tcsetattr tcgetattr tcgetpgrp tcsetpgrp \
tcdrain tcflow tcflush tcsendbrk cfmakeraw tcgetsid
include ../Rules
CFLAGS-tcdrain.c = -fexceptions -fasynchronous-unwind-tables