diff options
Diffstat (limited to 'nptl')
-rw-r--r-- | nptl/ChangeLog | 22 | ||||
-rw-r--r-- | nptl/pthread_cond_timedwait.c | 12 | ||||
-rw-r--r-- | nptl/pthread_create.c | 30 | ||||
-rw-r--r-- | nptl/sysdeps/pthread/Makefile | 12 | ||||
-rw-r--r-- | nptl/sysdeps/pthread/createthread.c | 19 | ||||
-rw-r--r-- | nptl/sysdeps/pthread/rt-unwind-resume.c | 1 | ||||
-rw-r--r-- | nptl/sysdeps/pthread/unwind-resume.c | 65 |
7 files changed, 54 insertions, 107 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog index b5b2d9d3f3..811b0842f4 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,25 @@ +2010-04-05 Thomas Schwinge <thomas@schwinge.name> + + * sysdeps/pthread/unwind-resume.c: Moved to main tree sysdeps/gnu/. + * sysdeps/pthread/rt-unwind-resume.c: Likewise. + * sysdeps/pthread/Makefile: Remove csu section and rt section's + unwind-resume bits, now in main tree sysdeps/gnu/Makefile instead. + +2010-03-23 Luis Machado <luisgpm@br.ibm.com> + + * pthread_cond_timedwait.c: Add check for + HAVE_CLOCK_GETTIME_VSYSCALL to use VDSO whenever possible. + (pthread_cond_timedwait): Use INTERNAL_VSYSCALL instead of + INTERNAL_SYSCALL. + +2010-03-09 Ulrich Drepper <drepper@redhat.com> + + * pthread_create.c (__pthread_create_2_1): If priorities are incorrect + and the call fails wake eventually waiting setxid threads. Don't free + stack here if we try starting a thread. + * sysdeps/pthread/createthread.c (do_clone): Only wake setxid waiter + if the clone call failed. + 2010-03-08 Andreas Schwab <schwab@redhat.com> * pthread_create.c (__pthread_create_2_1): Don't set setxid_futex. diff --git a/nptl/pthread_cond_timedwait.c b/nptl/pthread_cond_timedwait.c index 9d268e911e..7278ec45b0 100644 --- a/nptl/pthread_cond_timedwait.c +++ b/nptl/pthread_cond_timedwait.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004, 2007, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003. @@ -27,6 +27,14 @@ #include <shlib-compat.h> +#ifndef HAVE_CLOCK_GETTIME_VSYSCALL +# undef INTERNAL_VSYSCALL +# define INTERNAL_VSYSCALL INTERNAL_SYSCALL +# undef INLINE_VSYSCALL +# define INLINE_VSYSCALL INLINE_SYSCALL +#else +# include <bits/libc-vdso.h> +#endif /* Cleanup handler, defined in pthread_cond_wait.c. */ extern void __condvar_cleanup (void *arg) @@ -102,7 +110,7 @@ __pthread_cond_timedwait (cond, mutex, abstime) #ifdef __NR_clock_gettime INTERNAL_SYSCALL_DECL (err); int ret; - ret = INTERNAL_SYSCALL (clock_gettime, err, 2, + ret = INTERNAL_VSYSCALL (clock_gettime, err, 2, (cond->__data.__nwaiters & ((1 << COND_NWAITERS_SHIFT) - 1)), &rt); diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index 14e3cf784b..34d83f94ad 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -537,33 +537,23 @@ __pthread_create_2_1 (newthread, attr, start_routine, arg) if (pd->schedparam.sched_priority < minprio || pd->schedparam.sched_priority > maxprio) { - err = EINVAL; - goto errout; + /* Perhaps a thread wants to change the IDs and if waiting + for this stillborn thread. */ + if (__builtin_expect (atomic_exchange_acq (&pd->setxid_futex, 0) + == -2, 0)) + lll_futex_wake (&pd->setxid_futex, 1, LLL_PRIVATE); + + __deallocate_stack (pd); + + return EINVAL; } } /* Pass the descriptor to the caller. */ *newthread = (pthread_t) pd; - /* Remember whether the thread is detached or not. In case of an - error we have to free the stacks of non-detached stillborn - threads. */ - bool is_detached = IS_DETACHED (pd); - /* Start the thread. */ - err = create_thread (pd, iattr, STACK_VARIABLES_ARGS); - if (err != 0) - { - /* Something went wrong. Free the resources. */ - if (!is_detached) - { - errout: - __deallocate_stack (pd); - } - return err; - } - - return 0; + return create_thread (pd, iattr, STACK_VARIABLES_ARGS); } versioned_symbol (libpthread, __pthread_create_2_1, pthread_create, GLIBC_2_1); diff --git a/nptl/sysdeps/pthread/Makefile b/nptl/sysdeps/pthread/Makefile index 72550d74a7..f4d9390d83 100644 --- a/nptl/sysdeps/pthread/Makefile +++ b/nptl/sysdeps/pthread/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 2002,2003,2004,2006 Free Software Foundation, Inc. +# Copyright (C) 2002,2003,2004,2006,2010 Free Software Foundation, Inc. # This file is part of the GNU C Library. # Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -17,21 +17,13 @@ # Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA # 02111-1307 USA. -ifeq ($(subdir),csu) -routines += unwind-resume -shared-only-routines += unwind-resume -CFLAGS-unwind-resume.c += -fexceptions -fasynchronous-unwind-tables -endif - ifeq ($(subdir),nptl) libpthread-sysdep_routines += errno-loc endif ifeq ($(subdir),rt) -librt-sysdep_routines += timer_routines librt-cancellation rt-unwind-resume -librt-shared-only-routines += rt-unwind-resume +librt-sysdep_routines += timer_routines librt-cancellation CFLAGS-librt-cancellation.c += -fexceptions -fasynchronous-unwind-tables -CFLAGS-rt-unwind-resume.c += -fexceptions -fasynchronous-unwind-tables ifeq (yes,$(build-shared)) $(objpfx)tst-timer: $(objpfx)librt.so $(shared-thread-library) diff --git a/nptl/sysdeps/pthread/createthread.c b/nptl/sysdeps/pthread/createthread.c index 3bb3915281..8d96387a9a 100644 --- a/nptl/sysdeps/pthread/createthread.c +++ b/nptl/sysdeps/pthread/createthread.c @@ -75,19 +75,17 @@ do_clone (struct pthread *pd, const struct pthread_attr *attr, int rc = ARCH_CLONE (fct, STACK_VARIABLES_ARGS, clone_flags, pd, &pd->tid, TLS_VALUE, &pd->tid); - /* Allow setxid from now onwards. */ - if (__builtin_expect (atomic_exchange_acq (&pd->setxid_futex, 0) == -2, 0)) - lll_futex_wake (&pd->setxid_futex, 1, LLL_PRIVATE); - if (__builtin_expect (rc == -1, 0)) { atomic_decrement (&__nptl_nthreads); /* Oops, we lied for a second. */ - /* Failed. If the thread is detached, remove the TCB here since - the caller cannot do this. The caller remembered the thread - as detached and cannot reverify that it is not since it must - not access the thread descriptor again. */ - if (IS_DETACHED (pd)) + /* Perhaps a thread wants to change the IDs and if waiting + for this stillborn thread. */ + if (__builtin_expect (atomic_exchange_acq (&pd->setxid_futex, 0) + == -2, 0)) + lll_futex_wake (&pd->setxid_futex, 1, LLL_PRIVATE); + + /* Free the resources. */ __deallocate_stack (pd); /* We have to translate error codes. */ @@ -120,6 +118,9 @@ do_clone (struct pthread *pd, const struct pthread_attr *attr, (void) INTERNAL_SYSCALL (tkill, err2, 2, pd->tid, SIGCANCEL); #endif + /* We do not free the stack here because the canceled thread + itself will do this. */ + return (INTERNAL_SYSCALL_ERROR_P (res, err) ? INTERNAL_SYSCALL_ERRNO (res, err) : 0); diff --git a/nptl/sysdeps/pthread/rt-unwind-resume.c b/nptl/sysdeps/pthread/rt-unwind-resume.c deleted file mode 100644 index 743e675d4d..0000000000 --- a/nptl/sysdeps/pthread/rt-unwind-resume.c +++ /dev/null @@ -1 +0,0 @@ -#include <unwind-resume.c> diff --git a/nptl/sysdeps/pthread/unwind-resume.c b/nptl/sysdeps/pthread/unwind-resume.c deleted file mode 100644 index 69f3e04c43..0000000000 --- a/nptl/sysdeps/pthread/unwind-resume.c +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>. - - 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; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include <dlfcn.h> -#include <stdio.h> -#include <unwind.h> -#include <libgcc_s.h> - -static void (*libgcc_s_resume) (struct _Unwind_Exception *exc); -static _Unwind_Reason_Code (*libgcc_s_personality) - (int, _Unwind_Action, _Unwind_Exception_Class, struct _Unwind_Exception *, - struct _Unwind_Context *); - -static void -init (void) -{ - void *resume, *personality; - void *handle; - - handle = __libc_dlopen (LIBGCC_S_SO); - - if (handle == NULL - || (resume = __libc_dlsym (handle, "_Unwind_Resume")) == NULL - || (personality = __libc_dlsym (handle, "__gcc_personality_v0")) == NULL) - __libc_fatal (LIBGCC_S_SO " must be installed for pthread_cancel to work\n"); - - libgcc_s_resume = resume; - libgcc_s_personality = personality; -} - -void -_Unwind_Resume (struct _Unwind_Exception *exc) -{ - if (__builtin_expect (libgcc_s_resume == NULL, 0)) - init (); - libgcc_s_resume (exc); -} - -_Unwind_Reason_Code -__gcc_personality_v0 (int version, _Unwind_Action actions, - _Unwind_Exception_Class exception_class, - struct _Unwind_Exception *ue_header, - struct _Unwind_Context *context) -{ - if (__builtin_expect (libgcc_s_personality == NULL, 0)) - init (); - return libgcc_s_personality (version, actions, exception_class, - ue_header, context); -} |