Author: gotom
Date: 2005-04-10 04:24:59 +0000 (Sun, 10 Apr 2005)
New Revision: 879

Added:
   glibc-package/trunk/debian/patches/glibc232-pthread-cancellation.dpatch
   glibc-package/trunk/debian/patches/glibc232-tls-crashfix.dpatch
Modified:
   glibc-package/trunk/debian/changelog
   glibc-package/trunk/debian/patches/00list
Log:
    - Jeff Bailey <[EMAIL PROTECTED]>:
      - debian/patches/glibc232-tls-crashfix.dpatch: Fix tls assertion that
        crashes xmms/nvidia.  (Closes: #219352)
      - debian/patches/glibc232-pthread-cancellation.dpatch: Fix pthread
        cancellation bug that causes JVM lockups.  (Closes: #300943)


Modified: glibc-package/trunk/debian/changelog
===================================================================
--- glibc-package/trunk/debian/changelog        2005-04-10 01:22:16 UTC (rev 
878)
+++ glibc-package/trunk/debian/changelog        2005-04-10 04:24:59 UTC (rev 
879)
@@ -18,14 +18,19 @@
     - Bastian Blank <[EMAIL PROTECTED]>:
       - debian/patches/sched-update.dpatch: Update sched_[gs]et_affinity to
         new interface and library version.  Add GLIBC_2.3.4 versioned symbol
-        for new interface. (Closes: #297769)
+        for new interface.  (Closes: #297769)
+    - Jeff Bailey <[EMAIL PROTECTED]>:
+      - debian/patches/glibc232-tls-crashfix.dpatch: Fix tls assertion that
+        crashes xmms/nvidia.  (Closes: #219352)
+      - debian/patches/glibc232-pthread-cancellation.dpatch: Fix pthread
+        cancellation bug that causes JVM lockups.  (Closes: #300943)
     - Lars Wirzenius <[EMAIL PROTECTED]>:
       - debian/local/manpages/iconv.1: Escape hyphens for Unicode
-        environments. (Closes: #292013)
+        environments.  (Closes: #292013)
     - Emilian Nowak <[EMAIL PROTECTED]>:
-      - debian/po/pl.po: Add Polish debconf translation. (Closes: #294444)
+      - debian/po/pl.po: Add Polish debconf translation.  (Closes: #294444)
     - Matti Polla <[EMAIL PROTECTED]>:
-      - debian/po/fi.po: Add Finnish debconf translation. (Closes: #303816)
+      - debian/po/fi.po: Add Finnish debconf translation.  (Closes: #303816)
 
  -- GOTO Masanori <[EMAIL PROTECTED]>  Mon, 14 Feb 2005 09:26:26 +0900
 

Modified: glibc-package/trunk/debian/patches/00list
===================================================================
--- glibc-package/trunk/debian/patches/00list   2005-04-10 01:22:16 UTC (rev 
878)
+++ glibc-package/trunk/debian/patches/00list   2005-04-10 04:24:59 UTC (rev 
879)
@@ -120,3 +120,5 @@
 sched-update
 glibc232-sigsetjmp
 hurd-weak-aliases
+glibc232-pthread-cancellation
+glibc232-tls-crashfix

Added: glibc-package/trunk/debian/patches/glibc232-pthread-cancellation.dpatch
===================================================================
--- glibc-package/trunk/debian/patches/glibc232-pthread-cancellation.dpatch     
2005-04-10 01:22:16 UTC (rev 878)
+++ glibc-package/trunk/debian/patches/glibc232-pthread-cancellation.dpatch     
2005-04-10 04:24:59 UTC (rev 879)
@@ -0,0 +1,322 @@
+#! /bin/sh -e
+
+# All lines beginning with `# DP:' are a description of the patch.
+# DP: Description: Fix pthread cancellation bug, don't cancel when
+#                 CANCELSTATE_BITMASK is used.  This fixes JVM
+#                 lockups problem.
+# DP: Related bugs: #300943
+# DP: Dpatch author: Jeff Bailey
+# DP: Patch author: 
+# DP: Upstream status: In CVS
+# DP: Status Details: 
+# DP: Date: 2005-03-22
+
+PATCHLEVEL=1
+
+if [ $# -ne 2 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+case "$1" in
+    -patch) patch -d "$2" -f --no-backup-if-mismatch -p$PATCHLEVEL < $0;;
+    -unpatch) patch -d "$2" -f --no-backup-if-mismatch -R -p$PATCHLEVEL < $0;;
+    *)
+       echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+       exit 1
+esac
+exit 0
+
+# append the patch here and adjust the -p? flag in the patch calls.
+
+2003-12-19  Jakub Jelinek  <[EMAIL PROTECTED]>
+
+       * libc-cancellation.c (__libc_enable_asynccancel): Don't cancel
+       if CANCELSTATE_BITMASK is set.
+       * sysdeps/pthread/librt-cancellation.c (__librt_enable_asynccancel):
+       Likewise.
+
+       * Makefile (tests): Add tst-cancel22 and tst-cancel23.
+       (tests-reverse): Add tst-cancel23.
+       * tst-cancel22.c: New test.
+       * tst-cancel23.c: New test.
+
+2003-11-05  Jakub Jelinek  <[EMAIL PROTECTED]>
+
+       * unwind.c (FRAME_LEFT): Define.
+       (unwind_stop): Handle old style cleanups here.
+       (__pthread_unwind): Handle old style cleanups only if
+       !HAVE_FORCED_UNWIND.
+
+
+--- libc/nptl/Makefile 19 Dec 2003 01:34:09 -0000      1.132
++++ libc/nptl/Makefile 21 Dec 2003 20:05:16 -0000      1.133
+@@ -215,7 +215,7 @@
+       tst-cancel1 tst-cancel2 tst-cancel3 tst-cancel4 tst-cancel5 \
+       tst-cancel6 tst-cancel7 tst-cancel8 tst-cancel9 tst-cancel10 \
+       tst-cancel11 tst-cancel12 tst-cancel13 tst-cancel14 tst-cancel15 \
+-      tst-cancel16 tst-cancel17 tst-cancel18 \
++      tst-cancel16 tst-cancel17 tst-cancel18 tst-cancel22 tst-cancel23 \
+       tst-cleanup0 tst-cleanup1 tst-cleanup2 tst-cleanup3 \
+       tst-flock1 tst-flock2 \
+       tst-signal1 tst-signal2 tst-signal3 tst-signal4 tst-signal5 \
+@@ -326,7 +326,7 @@ ifeq ($(build-static),yes)
+ tests-static += tst-locale1 tst-locale2
+ endif
+ # These tests are linked with libc before libpthread
+-tests-reverse += tst-cancel5
++tests-reverse += tst-cancel5 tst-cancel23
+ 
+ include ../Rules
+ 
+--- libc/nptl/libc-cancellation.c      2 Jul 2003 05:12:20 -0000       1.9
++++ libc/nptl/libc-cancellation.c      20 Dec 2003 06:31:25 -0000      1.10
+@@ -42,8 +42,9 @@ __libc_enable_asynccancel (void)
+ 
+       if (__builtin_expect ((oldval & CANCELED_BITMASK) != 0, 0))
+       {
+-        /* If we are already exiting stop right here.  */
+-        if ((oldval & EXITING_BITMASK) != 0)
++        /* If we are already exiting or if PTHREAD_CANCEL_DISABLED,
++           stop right here.  */
++        if ((oldval & (EXITING_BITMASK | CANCELSTATE_BITMASK)) != 0)
+           break;
+ 
+         int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling,
+--- libc/nptl/tst-cancel22.c   1 Jan 1970 00:00:00 -0000
++++ libc/nptl/tst-cancel22.c   20 Dec 2003 06:32:20 -0000      1.1
+@@ -0,0 +1,121 @@
++/* Copyright (C) 2003 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Jakub Jelinek <[EMAIL PROTECTED]>, 2003.
++
++   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; if not, write to the Free
++   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++   02111-1307 USA.  */
++
++#include <errno.h>
++#include <pthread.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++
++pthread_barrier_t b;
++int seen;
++
++static void *
++tf (void *arg)
++{
++  int old;
++  int r = pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &old);
++  if (r != 0)
++    {
++      puts ("setcancelstate failed");
++      exit (1);
++    }
++
++  r = pthread_barrier_wait (&b);
++  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
++    {
++      puts ("barrier_wait failed");
++      exit (1);
++    }
++
++  for (int i = 0; i < 10; ++i)
++    {
++      struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 };
++      TEMP_FAILURE_RETRY (nanosleep (&ts, &ts));
++    }
++
++  seen = 1;
++  pthread_setcancelstate (old, NULL);
++
++  struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 };
++  TEMP_FAILURE_RETRY (nanosleep (&ts, &ts));
++
++  exit (1);
++}
++
++
++static int
++do_test (void)
++{
++  if (pthread_barrier_init (&b, NULL, 2) != 0)
++   {
++     puts ("barrier init failed");
++     return 1;
++   }
++
++  pthread_t th;
++  if (pthread_create (&th, NULL, tf, NULL) != 0)
++    {
++      puts ("thread creation failed");
++      return 1;
++    }
++
++  int r = pthread_barrier_wait (&b);
++  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
++    {
++      puts ("barrier_wait failed");
++      return 1;
++    }
++
++  if (pthread_cancel (th) != 0)
++    {
++      puts ("cancel failed");
++      return 1;
++    }
++
++  void *status;
++  if (pthread_join (th, &status) != 0)
++    {
++      puts ("join failed");
++      return 1;
++    }
++  if (status != PTHREAD_CANCELED)
++    {
++      puts ("thread not canceled");
++      return 1;
++    }
++
++  if (pthread_barrier_destroy (&b) != 0)
++    {
++      puts ("barrier_destroy failed");
++      return 1;
++    }
++
++  if (seen != 1)
++    {
++      puts ("thread cancelled when PTHREAD_CANCEL_DISABLED");
++      return 1;
++    }
++
++  return 0;
++}
++
++#define TIMEOUT 5
++#define TEST_FUNCTION do_test ()
++#include "../test-skeleton.c"
+--- libc/nptl/tst-cancel23.c   1 Jan 1970 00:00:00 -0000
++++ libc/nptl/tst-cancel23.c   20 Dec 2003 06:32:20 -0000      1.1
+@@ -0,0 +1 @@
++#include "tst-cancel22.c"
+--- libc/nptl/sysdeps/pthread/librt-cancellation.c     3 Jul 2003 07:35:59 
-0000       1.3
++++ libc/nptl/sysdeps/pthread/librt-cancellation.c     20 Dec 2003 06:31:48 
-0000      1.4
+@@ -41,8 +41,9 @@ __librt_enable_asynccancel (void)
+ 
+       if (__builtin_expect ((oldval & CANCELED_BITMASK) != 0, 0))
+       {
+-        /* If we are already exiting stop right here.  */
+-        if ((oldval & EXITING_BITMASK) != 0)
++        /* If we are already exiting or if PTHREAD_CANCEL_DISABLED,
++           stop right here.  */
++        if ((oldval & (EXITING_BITMASK | CANCELSTATE_BITMASK)) != 0)
+           break;
+ 
+         int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling,
+--- libc/nptl/unwind.c 4 Sep 2003 05:43:37 -0000       1.9
++++ libc/nptl/unwind.c 6 Nov 2003 04:29:04 -0000       1.10
+@@ -27,6 +27,14 @@
+ 
+ #ifdef HAVE_FORCED_UNWIND
+ 
++#ifdef _STACK_GROWS_DOWN
++# define FRAME_LEFT(frame, other) ((char *) frame >= (char *) other)
++#elif _STACK_GROWS_UP
++# define FRAME_LEFT(frame, other) ((char *) frame <= (char *) other)
++#else
++# error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP"
++#endif
++
+ static _Unwind_Reason_Code
+ unwind_stop (int version, _Unwind_Action actions,
+            _Unwind_Exception_Class exc_class,
+@@ -34,6 +42,9 @@ unwind_stop (int version, _Unwind_Action
+            struct _Unwind_Context *context, void *stop_parameter)
+ {
+   struct pthread_unwind_buf *buf = stop_parameter;
++  struct pthread *self = THREAD_SELF;
++  struct _pthread_cleanup_buffer *curp = THREAD_GETMEM (self, cleanup);
++  int do_longjump = 0;
+ 
+   /* Do longjmp if we're at "end of stack", aka "end of unwind data".
+      We assume there are only C frame without unwind data in between
+@@ -42,6 +53,37 @@ unwind_stop (int version, _Unwind_Action
+      previous frame.  */
+   if ((actions & _UA_END_OF_STACK)
+       || ! _JMPBUF_CFA_UNWINDS  (buf->cancel_jmp_buf[0].jmp_buf, context))
++    do_longjump = 1;
++
++  if (__builtin_expect (curp != NULL, 0))
++    {
++      /* Handle the compatibility stuff.  Execute all handlers
++       registered with the old method which would be unwound by this
++       step.  */
++      struct _pthread_cleanup_buffer *oldp = buf->priv.data.cleanup;
++      void *cfa = (void *) _Unwind_GetCFA (context);
++
++      if (curp != oldp && (do_longjump || FRAME_LEFT (cfa, curp)))
++      {
++        do
++          {
++            /* Pointer to the next element.  */
++            struct _pthread_cleanup_buffer *nextp = curp->__prev;
++
++            /* Call the handler.  */
++            curp->__routine (curp->__arg);
++
++            /* To the next.  */
++            curp = nextp;
++          }
++        while (curp != oldp && (do_longjump || FRAME_LEFT (cfa, curp)));
++
++        /* Mark the current element as handled.  */
++        THREAD_SETMEM (self, cleanup, curp);
++      }
++    }
++
++  if (do_longjump)
+     __libc_longjmp ((struct __jmp_buf_tag *) buf->cancel_jmp_buf, 1);
+ 
+   return _URC_NO_REASON;
+@@ -70,6 +112,14 @@ __pthread_unwind (__pthread_unwind_buf_t
+   struct pthread_unwind_buf *ibuf = (struct pthread_unwind_buf *) buf;
+   struct pthread *self = THREAD_SELF;
+ 
++#ifdef HAVE_FORCED_UNWIND
++  /* This is not a catchable exception, so don't provide any details about
++     the exception type.  We do need to initialize the field though.  */
++  THREAD_SETMEM (self, exc.exception_class, 0);
++  THREAD_SETMEM (self, exc.exception_cleanup, unwind_cleanup);
++
++  _Unwind_ForcedUnwind (&self->exc, unwind_stop, ibuf);
++#else
+   /* Handle the compatibility stuff first.  Execute all handlers
+      registered with the old method.  We don't execute them in order,
+      instead, they will run first.  */
+@@ -95,14 +145,6 @@ __pthread_unwind (__pthread_unwind_buf_t
+       THREAD_SETMEM (self, cleanup, curp);
+     }
+ 
+-#ifdef HAVE_FORCED_UNWIND
+-  /* This is not a catchable exception, so don't provide any details about
+-     the exception type.  We do need to initialize the field though.  */
+-  THREAD_SETMEM (self, exc.exception_class, 0);
+-  THREAD_SETMEM (self, exc.exception_cleanup, unwind_cleanup);
+-
+-  _Unwind_ForcedUnwind (&self->exc, unwind_stop, ibuf);
+-#else
+   /* We simply jump to the registered setjmp buffer.  */
+   __libc_longjmp ((struct __jmp_buf_tag *) ibuf->cancel_jmp_buf, 1);
+ #endif
+

Added: glibc-package/trunk/debian/patches/glibc232-tls-crashfix.dpatch
===================================================================
--- glibc-package/trunk/debian/patches/glibc232-tls-crashfix.dpatch     
2005-04-10 01:22:16 UTC (rev 878)
+++ glibc-package/trunk/debian/patches/glibc232-tls-crashfix.dpatch     
2005-04-10 04:24:59 UTC (rev 879)
@@ -0,0 +1,141 @@
+#! /bin/sh -e
+
+# All lines beginning with `# DP:' are a description of the patch.
+# DP: Description: TLS fixes for xmms/nvidia crash
+# DP: Related bugs: #219352
+# DP: Dpatch author: Jeff Bailey
+# DP: Patch author: 
+# DP: Upstream status: In CVS
+# DP: Status Details: 
+# DP: Date: 2005-03-22
+
+PATCHLEVEL=1
+
+if [ $# -ne 2 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+case "$1" in
+    -patch) patch -d "$2" -f --no-backup-if-mismatch -p$PATCHLEVEL < $0;;
+    -unpatch) patch -d "$2" -f --no-backup-if-mismatch -R -p$PATCHLEVEL < $0;;
+    *)
+       echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+       exit 1
+esac
+exit 0
+
+# append the patch here and adjust the -p? flag in the patch calls.
+2004-12-28  Ulrich Drepper  <[EMAIL PROTECTED]>
+
+        [BZ #726]
+        * sysdeps/generic/dl-tls.c (__tls_get_addr): Fix typo.
+
+
+2005-01-10  Ulrich Drepper  <[EMAIL PROTECTED]>
+
+        * sysdeps/generic/dl-tls.c (_dl_next_tls_modid): Fix assertion and
+        recognition of last entry.
+
+
+2005-03-15  Jakub Jelinek  <[EMAIL PROTECTED]>
+
+       [BZ#786]
+       * sysdeps/generic/dl-tls.c (_dl_next_tls_modid): Handle
+       GL(dl_tls_static_nelem) == GL(dl_tls_max_dtv_idx).
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/generic/dl-tls.c,v
+retrieving revision 1.44
+retrieving revision 1.44.2.1
+diff -u -r1.44 -r1.44.2.1
+--- libc/sysdeps/generic/dl-tls.c      2004/11/23 22:56:26     1.44
++++ libc/sysdeps/generic/dl-tls.c      2005/02/16 09:23:24     1.44.2.1
+@@ -577,7 +577,7 @@
+           {
+             size_t cnt;
+ 
+-            for (cnt = total = 0 ? 1 : 0; cnt < listp->len; ++cnt)
++            for (cnt = total == 0 ? 1 : 0; cnt < listp->len; ++cnt)
+               {
+                 size_t gen = listp->slotinfo[cnt].gen;
+                 struct link_map *map;
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/generic/dl-tls.c,v
+retrieving revision 1.44.2.1
+retrieving revision 1.44.2.2
+diff -u -r1.44.2.1 -r1.44.2.2
+--- libc/sysdeps/generic/dl-tls.c      2005/02/16 09:23:24     1.44.2.1
++++ libc/sysdeps/generic/dl-tls.c      2005/02/16 10:23:02     1.44.2.2
+@@ -65,7 +65,10 @@
+       /* Note that this branch will never be executed during program
+        start since there are no gaps at that time.  Therefore it
+        does not matter that the dl_tls_dtv_slotinfo is not allocated
+-       yet when the function is called for the first times.  */
++       yet when the function is called for the first times.
++
++       NB: the offset +1 is due to the fact that DTV[0] is used
++       for something else.  */
+       result = GL(dl_tls_static_nelem) + 1;
+       /* If the following would not be true we mustn't have assumed
+        there is a gap.  */
+@@ -88,11 +91,11 @@
+       }
+       while ((runp = runp->next) != NULL);
+ 
+-      if (result >= GL(dl_tls_max_dtv_idx))
++      if (result > GL(dl_tls_max_dtv_idx))
+       {
+         /* The new index must indeed be exactly one higher than the
+            previous high.  */
+-        assert (result == GL(dl_tls_max_dtv_idx));
++        assert (result == GL(dl_tls_max_dtv_idx) + 1);
+ 
+         /* There is no gap anymore.  */
+         GL(dl_tls_dtv_gaps) = false;
+--- libc/sysdeps/generic/dl-tls.c.jj   2005-02-25 14:45:06.000000000 +0100
++++ libc/sysdeps/generic/dl-tls.c      2005-03-15 15:36:55.593127093 +0100
+@@ -71,26 +71,24 @@ _dl_next_tls_modid (void)
+        NB: the offset +1 is due to the fact that DTV[0] is used
+        for something else.  */
+       result = GL(dl_tls_static_nelem) + 1;
+-      /* If the following would not be true we mustn't have assumed
+-       there is a gap.  */
+-      assert (result <= GL(dl_tls_max_dtv_idx));
+-      do
+-      {
+-        while (result - disp < runp->len)
+-          {
+-            if (runp->slotinfo[result - disp].map == NULL)
+-              break;
+-
+-            ++result;
+-            assert (result <= GL(dl_tls_max_dtv_idx) + 1);
+-          }
+-
+-        if (result - disp < runp->len)
+-          break;
+-
+-        disp += runp->len;
+-      }
+-      while ((runp = runp->next) != NULL);
++      if (result <= GL(dl_tls_max_dtv_idx))
++      do
++        {
++          while (result - disp < runp->len)
++            {
++              if (runp->slotinfo[result - disp].map == NULL)
++                break;
++
++              ++result;
++              assert (result <= GL(dl_tls_max_dtv_idx) + 1);
++            }
++
++          if (result - disp < runp->len)
++            break;
++
++          disp += runp->len;
++        }
++      while ((runp = runp->next) != NULL);
+ 
+       if (result > GL(dl_tls_max_dtv_idx))
+       {


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to