about summary refs log tree commit diff
path: root/nptl/init.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2005-10-01 17:20:34 +0000
committerUlrich Drepper <drepper@redhat.com>2005-10-01 17:20:34 +0000
commitdff9a7a163e9f5e28f36f9a701acf74f8f9d7968 (patch)
treeff9dbb35ab56c666e5d3f2a22bd067a8cf1fd54b /nptl/init.c
parent2ff89ea46f2c817ad7dd5ce5dc0cc1119da861b6 (diff)
downloadglibc-dff9a7a163e9f5e28f36f9a701acf74f8f9d7968.tar.gz
glibc-dff9a7a163e9f5e28f36f9a701acf74f8f9d7968.tar.xz
glibc-dff9a7a163e9f5e28f36f9a701acf74f8f9d7968.zip
2005-10-01 Ulrich Drepper <drepper@redhat.com>
            Jakub Jelinek  <jakub@redhat.com>

	* descr.h: Define SETXID_BIT and SETXID_BITMASK.  Adjust
	CANCEL_RESTMASK.
	(struct pthread): Move specific_used field to avoid padding.
	Add setxid_futex field.
	* init.c (sighandler_setxid): Reset setxid flag and release the
	setxid futex.
	* allocatestack.c (setxid_signal_thread): New function.  Broken
	out of the bodies of the two loops in __nptl_setxid.  For undetached
	threads check whether they are exiting and if yes, don't send a signal.
	(__nptl_setxid): Simplify loops by using setxid_signal_thread.
	* pthread_create.c (start_thread): For undetached threads, check
	whether setxid bit is set.  If yes, wait until signal has been
	processed.

	* allocatestack.c (STACK_VARIABLES): Initialize them.
	* pthread_create.c (__pthread_create_2_1): Initialize pd.
Diffstat (limited to 'nptl/init.c')
-rw-r--r--nptl/init.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/nptl/init.c b/nptl/init.c
index 86745af8d1..de704122d1 100644
--- a/nptl/init.c
+++ b/nptl/init.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -211,6 +211,15 @@ sighandler_setxid (int sig, siginfo_t *si, void *ctx)
 
   if (atomic_decrement_val (&__xidcmd->cntr) == 0)
     lll_futex_wake (&__xidcmd->cntr, 1);
+
+  /* Reset the SETXID flag.  */
+  struct pthread *self = THREAD_SELF;
+  int flags = THREAD_GETMEM (self, cancelhandling);
+  THREAD_SETMEM (self, cancelhandling, flags & ~SETXID_BITMASK);
+
+  /* And release the futex.  */
+  self->setxid_futex = 1;
+  lll_futex_wake (&self->setxid_futex, 1);
 }