r3463 - glibc-package/trunk/debian/patches/any
Author: aurel32
Date: 2009-05-08 10:11:01 +0000 (Fri, 08 May 2009)
New Revision: 3463
Modified:
glibc-package/trunk/debian/patches/any/local-revert-3270.diff
Log:
Actually reverse the patch
Modified: glibc-package/trunk/debian/patches/any/local-revert-3270.diff
===================================================================
--- glibc-package/trunk/debian/patches/any/local-revert-3270.diff 2009-05-08 09:58:28 UTC (rev 3462)
+++ glibc-package/trunk/debian/patches/any/local-revert-3270.diff 2009-05-08 10:11:01 UTC (rev 3463)
@@ -1,197 +1,199 @@
---- a/nptl/init.c (révision 5284)
-+++ b/nptl/init.c (révision 5285)
-@@ -221,12 +221,21 @@
+Revert PR ntpl/3270
+
+--- a/nptl/init.c (revision 5285)
++++ b/nptl/init.c (revision 5284)
+@@ -221,21 +221,12 @@
/* 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);
+- int flags, newval;
+- do
+- {
+- flags = THREAD_GETMEM (self, cancelhandling);
+- newval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling,
+- flags & ~SETXID_BITMASK, flags);
+- }
+- while (flags != newval);
++ 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, LLL_PRIVATE);
-+
-+ if (atomic_decrement_val (&__xidcmd->cntr) == 0)
-+ lll_futex_wake (&__xidcmd->cntr, 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 @@
+--- a/nptl/allocatestack.c (revision 5285)
++++ b/nptl/allocatestack.c (revision 5284)
+@@ -904,54 +904,23 @@
static void
internal_function
--setxid_signal_thread (struct xid_command *cmdp, struct pthread *t)
-+setxid_mark_thread (struct xid_command *cmdp, struct pthread *t)
+-setxid_mark_thread (struct xid_command *cmdp, struct pthread *t)
++setxid_signal_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;
+-
+- /* Don't let the thread exit before the setxid handler runs. */
+- t->setxid_futex = 0;
+-
+- do
++ if (! IS_DETACHED (t))
{
-- int ch;
-- do
-- {
-- ch = t->cancelhandling;
-+ ch = t->cancelhandling;
+- ch = t->cancelhandling;
++ int ch;
++ do
++ {
++ 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;
+- /* If the thread is exiting right now, ignore it. */
+- if ((ch & EXITING_BITMASK) != 0)
+- return;
++ /* 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));
}
-+ while (atomic_compare_and_exchange_bool_acq (&t->cancelhandling,
-+ ch | SETXID_BITMASK, ch));
-+}
+- 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;
-+
+-
+-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 @@
+@@ -967,14 +936,8 @@
val = INTERNAL_SYSCALL (tkill, err, 2, t->tid, SIGSETXID);
#endif
-+ /* If this failed, it must have had not started yet or else exited. */
+- /* 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;
+- {
+- atomic_increment (&cmdp->cntr);
+- return 1;
+- }
+- else
+- return 0;
++ atomic_increment (&cmdp->cntr);
}
-@@ -945,6 +982,7 @@
+@@ -982,7 +945,6 @@
attribute_hidden
__nptl_setxid (struct xid_command *cmdp)
{
-+ int signalled;
+- int signalled;
int result;
lll_lock (stack_cache_lock, LLL_PRIVATE);
-@@ -961,7 +999,7 @@
+@@ -999,7 +961,7 @@
if (t == self)
continue;
-- setxid_signal_thread (cmdp, t);
-+ setxid_mark_thread (cmdp, t);
+- setxid_mark_thread (cmdp, t);
++ setxid_signal_thread (cmdp, t);
}
/* Now the list with threads using user-allocated stacks. */
-@@ -971,16 +1009,63 @@
+@@ -1009,63 +971,16 @@
if (t == self)
continue;
-- setxid_signal_thread (cmdp, t);
-+ setxid_mark_thread (cmdp, t);
+- setxid_mark_thread (cmdp, t);
++ setxid_signal_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
+- /* 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
++ int cur = cmdp->cntr;
++ while (cur != 0)
{
-- 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;
-+ }
+- 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;
+- }
++ lll_futex_wait (&cmdp->cntr, cur, LLL_PRIVATE);
++ cur = cmdp->cntr;
}
-+ while (signalled != 0);
+- 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);
-+ }
-+
+- /* 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);
Reply to: