r3462 - in glibc-package/trunk/debian: . patches patches/any
Author: aurel32
Date: 2009-05-08 09:58:28 +0000 (Fri, 08 May 2009)
New Revision: 3462
Added:
glibc-package/trunk/debian/patches/any/local-revert-3270.diff
Modified:
glibc-package/trunk/debian/changelog
glibc-package/trunk/debian/patches/series
Log:
* any/local-revert-3270.diff: new patch to revert fix for PR nptl/3270.
(closes: bug#527541).
Modified: glibc-package/trunk/debian/changelog
===================================================================
--- glibc-package/trunk/debian/changelog 2009-05-07 04:45:39 UTC (rev 3461)
+++ glibc-package/trunk/debian/changelog 2009-05-08 09:58:28 UTC (rev 3462)
@@ -3,9 +3,11 @@
[ Petr Salinger ]
* kfreebsd/local-sysdeps.diff: update to revision 2503 (from glibc-bsd).
- *
+ [ Aurelien Jarno ]
+ * any/local-revert-3270.diff: new patch to revert fix for PR nptl/3270.
+ (closes: bug#527541).
- -- Aurelien Jarno <aurel32@debian.org> Tue, 05 May 2009 15:40:40 +0200
+ -- Aurelien Jarno <aurel32@debian.org> Fri, 08 May 2009 11:57:16 +0200
eglibc (2.9-11) unstable; urgency=low
Added: glibc-package/trunk/debian/patches/any/local-revert-3270.diff
===================================================================
--- glibc-package/trunk/debian/patches/any/local-revert-3270.diff (rev 0)
+++ glibc-package/trunk/debian/patches/any/local-revert-3270.diff 2009-05-08 09:58:28 UTC (rev 3462)
@@ -0,0 +1,197 @@
+--- a/nptl/init.c (révision 5284)
++++ b/nptl/init.c (révision 5285)
+@@ -221,12 +221,21 @@
+
+ /* Reset the SETXID flag. */
+ struct pthread *self = THREAD_SELF;
+- int flags = THREAD_GETMEM (self, cancelhandling);
+- THREAD_SETMEM (self, cancelhandling, flags & ~SETXID_BITMASK);
++ int flags, newval;
++ do
++ {
++ flags = THREAD_GETMEM (self, cancelhandling);
++ newval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling,
++ flags & ~SETXID_BITMASK, flags);
++ }
++ while (flags != newval);
+
+ /* And release the futex. */
+ self->setxid_futex = 1;
+ lll_futex_wake (&self->setxid_futex, 1, LLL_PRIVATE);
++
++ if (atomic_decrement_val (&__xidcmd->cntr) == 0)
++ lll_futex_wake (&__xidcmd->cntr, 1, LLL_PRIVATE);
+ }
+
+
+--- a/nptl/allocatestack.c (révision 5284)
++++ b/nptl/allocatestack.c (révision 5285)
+@@ -904,23 +904,54 @@
+
+ static void
+ internal_function
+-setxid_signal_thread (struct xid_command *cmdp, struct pthread *t)
++setxid_mark_thread (struct xid_command *cmdp, struct pthread *t)
+ {
+- if (! IS_DETACHED (t))
++ int ch;
++
++ /* Don't let the thread exit before the setxid handler runs. */
++ t->setxid_futex = 0;
++
++ do
+ {
+- int ch;
+- do
+- {
+- ch = t->cancelhandling;
++ ch = t->cancelhandling;
+
+- /* If the thread is exiting right now, ignore it. */
+- if ((ch & EXITING_BITMASK) != 0)
+- return;
+- }
+- while (atomic_compare_and_exchange_bool_acq (&t->cancelhandling,
+- ch | SETXID_BITMASK, ch));
++ /* If the thread is exiting right now, ignore it. */
++ if ((ch & EXITING_BITMASK) != 0)
++ return;
+ }
++ while (atomic_compare_and_exchange_bool_acq (&t->cancelhandling,
++ ch | SETXID_BITMASK, ch));
++}
+
++
++static void
++internal_function
++setxid_unmark_thread (struct xid_command *cmdp, struct pthread *t)
++{
++ int ch;
++
++ do
++ {
++ ch = t->cancelhandling;
++ if ((ch & SETXID_BITMASK) == 0)
++ return;
++ }
++ while (atomic_compare_and_exchange_bool_acq (&t->cancelhandling,
++ ch & ~SETXID_BITMASK, ch));
++
++ /* Release the futex just in case. */
++ t->setxid_futex = 1;
++ lll_futex_wake (&t->setxid_futex, 1, LLL_PRIVATE);
++}
++
++
++static int
++internal_function
++setxid_signal_thread (struct xid_command *cmdp, struct pthread *t)
++{
++ if ((t->cancelhandling & SETXID_BITMASK) == 0)
++ return 0;
++
+ int val;
+ INTERNAL_SYSCALL_DECL (err);
+ #if __ASSUME_TGKILL
+@@ -936,8 +967,14 @@
+ val = INTERNAL_SYSCALL (tkill, err, 2, t->tid, SIGSETXID);
+ #endif
+
++ /* If this failed, it must have had not started yet or else exited. */
+ if (!INTERNAL_SYSCALL_ERROR_P (val, err))
+- atomic_increment (&cmdp->cntr);
++ {
++ atomic_increment (&cmdp->cntr);
++ return 1;
++ }
++ else
++ return 0;
+ }
+
+
+@@ -945,6 +982,7 @@
+ attribute_hidden
+ __nptl_setxid (struct xid_command *cmdp)
+ {
++ int signalled;
+ int result;
+ lll_lock (stack_cache_lock, LLL_PRIVATE);
+
+@@ -961,7 +999,7 @@
+ if (t == self)
+ continue;
+
+- setxid_signal_thread (cmdp, t);
++ setxid_mark_thread (cmdp, t);
+ }
+
+ /* Now the list with threads using user-allocated stacks. */
+@@ -971,16 +1009,63 @@
+ if (t == self)
+ continue;
+
+- setxid_signal_thread (cmdp, t);
++ setxid_mark_thread (cmdp, t);
+ }
+
+- int cur = cmdp->cntr;
+- while (cur != 0)
++ /* Iterate until we don't succeed in signalling anyone. That means
++ we have gotten all running threads, and their children will be
++ automatically correct once started. */
++ do
+ {
+- lll_futex_wait (&cmdp->cntr, cur, LLL_PRIVATE);
+- cur = cmdp->cntr;
++ signalled = 0;
++
++ list_for_each (runp, &stack_used)
++ {
++ struct pthread *t = list_entry (runp, struct pthread, list);
++ if (t == self)
++ continue;
++
++ signalled += setxid_signal_thread (cmdp, t);
++ }
++
++ list_for_each (runp, &__stack_user)
++ {
++ struct pthread *t = list_entry (runp, struct pthread, list);
++ if (t == self)
++ continue;
++
++ signalled += setxid_signal_thread (cmdp, t);
++ }
++
++ int cur = cmdp->cntr;
++ while (cur != 0)
++ {
++ lll_futex_wait (&cmdp->cntr, cur, LLL_PRIVATE);
++ cur = cmdp->cntr;
++ }
+ }
++ while (signalled != 0);
+
++ /* Clean up flags, so that no thread blocks during exit waiting
++ for a signal which will never come. */
++ list_for_each (runp, &stack_used)
++ {
++ struct pthread *t = list_entry (runp, struct pthread, list);
++ if (t == self)
++ continue;
++
++ setxid_unmark_thread (cmdp, t);
++ }
++
++ list_for_each (runp, &__stack_user)
++ {
++ struct pthread *t = list_entry (runp, struct pthread, list);
++ if (t == self)
++ continue;
++
++ setxid_unmark_thread (cmdp, t);
++ }
++
+ /* This must be last, otherwise the current thread might not have
+ permissions to send SIGSETXID syscall to the other threads. */
+ INTERNAL_SYSCALL_DECL (err);
Modified: glibc-package/trunk/debian/patches/series
===================================================================
--- glibc-package/trunk/debian/patches/series 2009-05-07 04:45:39 UTC (rev 3461)
+++ glibc-package/trunk/debian/patches/series 2009-05-08 09:58:28 UTC (rev 3462)
@@ -205,3 +205,4 @@
any/submitted-nss-nsswitch.diff
any/submitted-install-map-files.diff
any/submitted-broken-dns.diff
+any/local-revert-3270.diff
Reply to: