Skip to content

Commit

Permalink
Update.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Ulrich Drepper committed Jun 15, 2003
1 parent 1fde494 commit 7a11479
Show file tree
Hide file tree
Showing 31 changed files with 360 additions and 61 deletions.
29 changes: 29 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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):
Expand Down
4 changes: 4 additions & 0 deletions io/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 4 additions & 0 deletions misc/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
22 changes: 22 additions & 0 deletions nptl/ChangeLog
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
3 changes: 2 additions & 1 deletion nptl/sysdeps/pthread/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
122 changes: 122 additions & 0 deletions nptl/sysdeps/pthread/librt-cancellation.c
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down
2 changes: 1 addition & 1 deletion nptl/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down
2 changes: 1 addition & 1 deletion nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down
2 changes: 1 addition & 1 deletion nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down
2 changes: 1 addition & 1 deletion nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions nptl/sysdeps/unix/sysv/linux/timer_create.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down
9 changes: 9 additions & 0 deletions posix/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
3 changes: 3 additions & 0 deletions rt/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
6 changes: 6 additions & 0 deletions signal/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions stdlib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
5 changes: 4 additions & 1 deletion sysdeps/generic/lockf.c
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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);
}
5 changes: 4 additions & 1 deletion sysdeps/generic/pselect.c
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -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);

Expand Down
3 changes: 3 additions & 0 deletions sysdeps/posix/sigpause.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
3 changes: 3 additions & 0 deletions sysdeps/posix/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading

0 comments on commit 7a11479

Please sign in to comment.