summaryrefslogtreecommitdiff
path: root/nptl
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@redhat.com>2010-04-06 11:15:58 +0200
committerAndreas Schwab <schwab@redhat.com>2010-04-06 11:15:58 +0200
commit32e5e786daa69be1f153f01cd428ac18634bb7bc (patch)
treeea6947f2380e156ea6ba91f5fa17a67a46304947 /nptl
parentb44389edf1a88c6607a6c365bd8d884aee2edead (diff)
parent2e7c805d5ec1f0d2f46354bca65b1feffa7af63b (diff)
Merge remote branch 'origin/master' into fedora/master
Diffstat (limited to 'nptl')
-rw-r--r--nptl/ChangeLog22
-rw-r--r--nptl/pthread_cond_timedwait.c12
-rw-r--r--nptl/pthread_create.c30
-rw-r--r--nptl/sysdeps/pthread/Makefile12
-rw-r--r--nptl/sysdeps/pthread/createthread.c19
-rw-r--r--nptl/sysdeps/pthread/rt-unwind-resume.c1
-rw-r--r--nptl/sysdeps/pthread/unwind-resume.c65
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);
-}