[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

r2425 - in glibc-package/trunk/debian: . patches patches/hurd-i386 sysdeps



Author: sthibaul-guest
Date: 2007-07-21 00:27:17 +0000 (Sat, 21 Jul 2007)
New Revision: 2425

Added:
   glibc-package/trunk/debian/patches/hurd-i386/local-atomic-no-multiple_threads.diff
   glibc-package/trunk/debian/patches/hurd-i386/local-gscope.diff
   glibc-package/trunk/debian/patches/hurd-i386/local-no-strerror_l.diff
   glibc-package/trunk/debian/patches/hurd-i386/submitted-lock-intern.diff
   glibc-package/trunk/debian/patches/series.hurd-i386
Modified:
   glibc-package/trunk/debian/changelog
   glibc-package/trunk/debian/patches/series
   glibc-package/trunk/debian/sysdeps/depflags.pl
Log:
  * hurd-i386/local-atomic-no-multiple_threads.diff: new patch, hurd-i386
    doesn't need the multiple_threads field.
  * hurd-i386/local-gscope.diff: new patch, backport of the CVS global scope.
  * hurd-i386/local-no-strerror_l.diff: new patch to disable non-implemented
    strerror_l().
  * hurd-i386/submitted-lock-intern.diff: new patch to fix a header inclusion.
  * sysdeps/depflags.pl: make libc0.3 depend on TLS-enabled hurd packages.


Modified: glibc-package/trunk/debian/changelog
===================================================================
--- glibc-package/trunk/debian/changelog	2007-07-20 23:40:55 UTC (rev 2424)
+++ glibc-package/trunk/debian/changelog	2007-07-21 00:27:17 UTC (rev 2425)
@@ -31,6 +31,13 @@
   * hurd-i386/local-tls-support.diff: new patch to support TLS.
   * debian/sysdeps/hurd.mk (libc_extra_config_options): Removed
     --without-__thread, --without-tls and libc_cv_z_relro=no.
+  * hurd-i386/local-atomic-no-multiple_threads.diff: new patch, hurd-i386
+    doesn't need the multiple_threads field.
+  * hurd-i386/local-gscope.diff: new patch, backport of the CVS global scope.
+  * hurd-i386/local-no-strerror_l.diff: new patch to disable non-implemented
+    strerror_l().
+  * hurd-i386/submitted-lock-intern.diff: new patch to fix a header inclusion.
+  * sysdeps/depflags.pl: make libc0.3 depend on TLS-enabled hurd packages.
 
  -- Pierre Habouzit <madcoder@debian.org>  Fri, 20 Jul 2007 19:19:54 +0200
 

Added: glibc-package/trunk/debian/patches/hurd-i386/local-atomic-no-multiple_threads.diff
===================================================================
--- glibc-package/trunk/debian/patches/hurd-i386/local-atomic-no-multiple_threads.diff	                        (rev 0)
+++ glibc-package/trunk/debian/patches/hurd-i386/local-atomic-no-multiple_threads.diff	2007-07-21 00:27:17 UTC (rev 2425)
@@ -0,0 +1,249 @@
+On the Hurd we always at least start the sigthread anyway.  Let's avoid forking
+the file (which would mean having to maintain it)
+
+diff -ur glibc-2.6-orig/sysdeps/i386/i486/bits/atomic.h glibc-2.6/build-tree/glibc-2.6/sysdeps/i386/i486/bits/atomic.h
+--- glibc-2.6-orig/sysdeps/i386/i486/bits/atomic.h	2007-02-17 07:38:25.000000000 +0100
++++ glibc-2.6/sysdeps/i386/i486/bits/atomic.h	2007-07-20 03:45:18.000000000 +0200
+@@ -87,35 +87,26 @@
+ 
+ #define __arch_c_compare_and_exchange_val_8_acq(mem, newval, oldval) \
+   ({ __typeof (*mem) ret;						      \
+-     __asm __volatile ("cmpl $0, %%gs:%P5\n\t"                                \
+-                       "je 0f\n\t"                                            \
+-                       "lock\n"                                               \
+-                       "0:\tcmpxchgb %b2, %1"				      \
++     __asm __volatile ("lock\n"                                               \
++                       "\tcmpxchgb %b2, %1"				      \
+ 		       : "=a" (ret), "=m" (*mem)			      \
+-		       : "q" (newval), "m" (*mem), "0" (oldval),	      \
+-			 "i" (offsetof (tcbhead_t, multiple_threads)));	      \
++		       : "q" (newval), "m" (*mem), "0" (oldval));	      \
+      ret; })
+ 
+ #define __arch_c_compare_and_exchange_val_16_acq(mem, newval, oldval) \
+   ({ __typeof (*mem) ret;						      \
+-     __asm __volatile ("cmpl $0, %%gs:%P5\n\t"                                \
+-                       "je 0f\n\t"                                            \
+-                       "lock\n"                                               \
+-                       "0:\tcmpxchgw %w2, %1"				      \
++     __asm __volatile ("lock\n"                                               \
++                       "\tcmpxchgw %w2, %1"				      \
+ 		       : "=a" (ret), "=m" (*mem)			      \
+-		       : "r" (newval), "m" (*mem), "0" (oldval),	      \
+-			 "i" (offsetof (tcbhead_t, multiple_threads)));	      \
++		       : "r" (newval), "m" (*mem), "0" (oldval));	      \
+      ret; })
+ 
+ #define __arch_c_compare_and_exchange_val_32_acq(mem, newval, oldval) \
+   ({ __typeof (*mem) ret;						      \
+-     __asm __volatile ("cmpl $0, %%gs:%P5\n\t"                                \
+-                       "je 0f\n\t"                                            \
+-                       "lock\n"                                               \
+-                       "0:\tcmpxchgl %2, %1"				      \
++     __asm __volatile ("lock\n"                                               \
++                       "\tcmpxchgl %2, %1"				      \
+ 		       : "=a" (ret), "=m" (*mem)			      \
+-		       : "r" (newval), "m" (*mem), "0" (oldval),	      \
+-			 "i" (offsetof (tcbhead_t, multiple_threads)));	      \
++		       : "r" (newval), "m" (*mem), "0" (oldval));	      \
+      ret; })
+ 
+ /* XXX We do not really need 64-bit compare-and-exchange.  At least
+@@ -148,10 +139,8 @@
+ #  define __arch_c_compare_and_exchange_val_64_acq(mem, newval, oldval) \
+   ({ __typeof (*mem) ret;						      \
+      __asm __volatile ("xchgl %2, %%ebx\n\t"				      \
+-		       "cmpl $0, %%gs:%P7\n\t"				      \
+-		       "je 0f\n\t"					      \
+ 		       "lock\n"						      \
+-		       "0:\tcmpxchg8b %1\n\t"				      \
++		       "\tcmpxchg8b %1\n\t"				      \
+ 		       "xchgl %2, %%ebx"				      \
+ 		       : "=A" (ret), "=m" (*mem)			      \
+ 		       : "DS" (((unsigned long long int) (newval))	      \
+@@ -159,8 +148,7 @@
+ 			 "c" (((unsigned long long int) (newval)) >> 32),     \
+ 			 "m" (*mem), "a" (((unsigned long long int) (oldval)) \
+ 					  & 0xffffffff),		      \
+-			 "d" (((unsigned long long int) (oldval)) >> 32),     \
+-			 "i" (offsetof (tcbhead_t, multiple_threads)));	      \
++			 "d" (((unsigned long long int) (oldval)) >> 32));    \
+      ret; })
+ # else
+ #  define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
+@@ -177,18 +165,15 @@
+ 
+ #  define __arch_c_compare_and_exchange_val_64_acq(mem, newval, oldval) \
+   ({ __typeof (*mem) ret;						      \
+-     __asm __volatile ("cmpl $0, %%gs:%P7\n\t"				      \
+-		       "je 0f\n\t"					      \
+-		       "lock\n"						      \
+-		       "0:\tcmpxchg8b %1"				      \
++     __asm __volatile ("lock\n"						      \
++		       "\tcmpxchg8b %1"				      \
+ 		       : "=A" (ret), "=m" (*mem)			      \
+ 		       : "b" (((unsigned long long int) (newval))	      \
+ 			      & 0xffffffff),				      \
+ 			 "c" (((unsigned long long int) (newval)) >> 32),     \
+ 			 "m" (*mem), "a" (((unsigned long long int) (oldval)) \
+ 					  & 0xffffffff),		      \
+-			 "d" (((unsigned long long int) (oldval)) >> 32),     \
+-			 "i" (offsetof (tcbhead_t, multiple_threads)));	      \
++			 "d" (((unsigned long long int) (oldval)) >> 32));    \
+      ret; })
+ # endif
+ #endif
+@@ -223,18 +208,15 @@
+      if (sizeof (*mem) == 1)						      \
+        __asm __volatile (lock "xaddb %b0, %1"				      \
+ 			 : "=q" (__result), "=m" (*mem)			      \
+-			 : "0" (__addval), "m" (*mem),			      \
+-			   "i" (offsetof (tcbhead_t, multiple_threads)));     \
++			 : "0" (__addval), "m" (*mem));			      \
+      else if (sizeof (*mem) == 2)					      \
+        __asm __volatile (lock "xaddw %w0, %1"				      \
+ 			 : "=r" (__result), "=m" (*mem)			      \
+-			 : "0" (__addval), "m" (*mem),			      \
+-			   "i" (offsetof (tcbhead_t, multiple_threads)));     \
++			 : "0" (__addval), "m" (*mem));			      \
+      else if (sizeof (*mem) == 4)					      \
+        __asm __volatile (lock "xaddl %0, %1"				      \
+ 			 : "=r" (__result), "=m" (*mem)			      \
+-			 : "0" (__addval), "m" (*mem),			      \
+-			   "i" (offsetof (tcbhead_t, multiple_threads)));     \
++			 : "0" (__addval), "m" (*mem));			      \
+      else								      \
+        {								      \
+ 	 __typeof (mem) __memp = (mem);					      \
+@@ -256,7 +238,7 @@
+ #endif
+ 
+ #define __arch_exchange_and_add_cprefix \
+-  "cmpl $0, %%gs:%P4\n\tje 0f\n\tlock\n0:\t"
++  "lock\n\t"
+ 
+ #define catomic_exchange_and_add(mem, value) \
+   __arch_exchange_and_add_body (__arch_exchange_and_add_cprefix, __arch_c,    \
+@@ -272,18 +254,15 @@
+     else if (sizeof (*mem) == 1)					      \
+       __asm __volatile (lock "addb %b1, %0"				      \
+ 			: "=m" (*mem)					      \
+-			: "iq" (value), "m" (*mem),			      \
+-			  "i" (offsetof (tcbhead_t, multiple_threads)));      \
++			: "iq" (value), "m" (*mem));			      \
+     else if (sizeof (*mem) == 2)					      \
+       __asm __volatile (lock "addw %w1, %0"				      \
+ 			: "=m" (*mem)					      \
+-			: "ir" (value), "m" (*mem),			      \
+-			  "i" (offsetof (tcbhead_t, multiple_threads)));      \
++			: "ir" (value), "m" (*mem));			      \
+     else if (sizeof (*mem) == 4)					      \
+       __asm __volatile (lock "addl %1, %0"				      \
+ 			: "=m" (*mem)					      \
+-			: "ir" (value), "m" (*mem),			      \
+-			  "i" (offsetof (tcbhead_t, multiple_threads)));      \
++			: "ir" (value), "m" (*mem));			      \
+     else								      \
+       {									      \
+ 	__typeof (value) __addval = (value);				      \
+@@ -301,7 +280,7 @@
+   __arch_add_body (LOCK_PREFIX, __arch, mem, value)
+ 
+ #define __arch_add_cprefix \
+-  "cmpl $0, %%gs:%P3\n\tje 0f\n\tlock\n0:\t"
++  "lock\n\t"
+ 
+ #define catomic_add(mem, value) \
+   __arch_add_body (__arch_add_cprefix, __arch_c, mem, value)
+@@ -350,18 +329,15 @@
+     if (sizeof (*mem) == 1)						      \
+       __asm __volatile (lock "incb %b0"					      \
+ 			: "=m" (*mem)					      \
+-			: "m" (*mem),					      \
+-			  "i" (offsetof (tcbhead_t, multiple_threads)));      \
++			: "m" (*mem));					      \
+     else if (sizeof (*mem) == 2)					      \
+       __asm __volatile (lock "incw %w0"					      \
+ 			: "=m" (*mem)					      \
+-			: "m" (*mem),					      \
+-			  "i" (offsetof (tcbhead_t, multiple_threads)));      \
++			: "m" (*mem));					      \
+     else if (sizeof (*mem) == 4)					      \
+       __asm __volatile (lock "incl %0"					      \
+ 			: "=m" (*mem)					      \
+-			: "m" (*mem),					      \
+-			  "i" (offsetof (tcbhead_t, multiple_threads)));      \
++			: "m" (*mem));					      \
+     else								      \
+       {									      \
+ 	__typeof (mem) __memp = (mem);					      \
+@@ -377,7 +353,7 @@
+ #define atomic_increment(mem) __arch_increment_body (LOCK_PREFIX, __arch, mem)
+ 
+ #define __arch_increment_cprefix \
+-  "cmpl $0, %%gs:%P2\n\tje 0f\n\tlock\n0:\t"
++  "lock\n\t"
+ 
+ #define catomic_increment(mem) \
+   __arch_increment_body (__arch_increment_cprefix, __arch_c, mem)
+@@ -407,18 +383,15 @@
+     if (sizeof (*mem) == 1)						      \
+       __asm __volatile (lock "decb %b0"					      \
+ 			: "=m" (*mem)					      \
+-			: "m" (*mem),					      \
+-			  "i" (offsetof (tcbhead_t, multiple_threads)));      \
++			: "m" (*mem));					      \
+     else if (sizeof (*mem) == 2)					      \
+       __asm __volatile (lock "decw %w0"					      \
+ 			: "=m" (*mem)					      \
+-			: "m" (*mem),					      \
+-			  "i" (offsetof (tcbhead_t, multiple_threads)));      \
++			: "m" (*mem));					      \
+     else if (sizeof (*mem) == 4)					      \
+       __asm __volatile (lock "decl %0"					      \
+ 			: "=m" (*mem)					      \
+-			: "m" (*mem),					      \
+-			  "i" (offsetof (tcbhead_t, multiple_threads)));      \
++			: "m" (*mem));					      \
+     else								      \
+       {									      \
+ 	__typeof (mem) __memp = (mem);					      \
+@@ -434,7 +407,7 @@
+ #define atomic_decrement(mem) __arch_decrement_body (LOCK_PREFIX, __arch, mem)
+ 
+ #define __arch_decrement_cprefix \
+-  "cmpl $0, %%gs:%P2\n\tje 0f\n\tlock\n0:\t"
++  "lock\n\t"
+ 
+ #define catomic_decrement(mem) \
+   __arch_decrement_body (__arch_decrement_cprefix, __arch_c, mem)
+@@ -524,18 +497,15 @@
+     if (sizeof (*mem) == 1)						      \
+       __asm __volatile (lock "orb %b1, %0"				      \
+ 			: "=m" (*mem)					      \
+-			: "iq" (mask), "m" (*mem),			      \
+-			  "i" (offsetof (tcbhead_t, multiple_threads)));      \
++			: "iq" (mask), "m" (*mem));			      \
+     else if (sizeof (*mem) == 2)					      \
+       __asm __volatile (lock "orw %w1, %0"				      \
+ 			: "=m" (*mem)					      \
+-			: "ir" (mask), "m" (*mem),			      \
+-			  "i" (offsetof (tcbhead_t, multiple_threads)));      \
++			: "ir" (mask), "m" (*mem));			      \
+     else if (sizeof (*mem) == 4)					      \
+       __asm __volatile (lock "orl %1, %0"				      \
+ 			: "=m" (*mem)					      \
+-			: "ir" (mask), "m" (*mem),			      \
+-			  "i" (offsetof (tcbhead_t, multiple_threads)));      \
++			: "ir" (mask), "m" (*mem));			      \
+     else								      \
+       abort ();								      \
+   } while (0)
+@@ -543,6 +513,6 @@
+ #define atomic_or(mem, mask) __arch_or_body (LOCK_PREFIX, mem, mask)
+ 
+ #define __arch_or_cprefix \
+-  "cmpl $0, %%gs:%P3\n\tje 0f\n\tlock\n0:\t"
++  "lock\n\t"
+ 
+ #define catomic_or(mem, mask) __arch_or_body (__arch_or_cprefix, mem, mask)

Added: glibc-package/trunk/debian/patches/hurd-i386/local-gscope.diff
===================================================================
--- glibc-package/trunk/debian/patches/hurd-i386/local-gscope.diff	                        (rev 0)
+++ glibc-package/trunk/debian/patches/hurd-i386/local-gscope.diff	2007-07-21 00:27:17 UTC (rev 2425)
@@ -0,0 +1,466 @@
+mrlocks have gone from CVS head, so implementing them would be a loss of time,
+when backporting the GSCOPE_SET/RESET/WAIT can be actually done easily.
+
+diff -ur glibc-2.6-orig/elf/dl-close.c glibc-2.6/build-tree/glibc-2.6/elf/dl-close.c
+--- glibc-2.6-orig/elf/dl-close.c	2007-05-11 20:46:34.000000000 +0200
++++ glibc-2.6/elf/dl-close.c	2007-07-20 03:58:27.000000000 +0200
+@@ -32,6 +32,8 @@
+ #include <sys/mman.h>
+ #include <sysdep-cancel.h>
+ 
++#include "gscope.h"
++
+ 
+ /* Type of the constructor functions.  */
+ typedef void (*fini_t) (void);
+@@ -228,6 +230,7 @@
+   bool do_audit = GLRO(dl_naudit) > 0 && !ns->_ns_loaded->l_auditing;
+ #endif
+   bool unload_any = false;
++  bool scope_mem_left = false;
+   unsigned int first_loaded = ~0;
+   for (unsigned int i = 0; i < nloaded; ++i)
+     {
+@@ -400,18 +403,18 @@
+ 
+ 	      struct r_scope_elem **old = imap->l_scope;
+ 
+-	      if (RTLD_SINGLE_THREAD_P)
+-		imap->l_scope = newp;
+-	      else
+-		{
+-		  __rtld_mrlock_change (imap->l_scope_lock);
+-		  imap->l_scope = newp;
+-		  __rtld_mrlock_done (imap->l_scope_lock);
+-		}
++	      imap->l_scope = newp;
+ 
+ 	      /* No user anymore, we can free it now.  */
+ 	      if (old != imap->l_scope_mem)
+-		free (old);
++	        {
++		  if (_dl_scope_free (old))
++		    /* If _dl_scope_free used THREAD_GSCOPE_WAIT (),
++		       no need to repeat it. */
++		    scope_mem_left = false;
++		}
++	      else
++		scope_mem_left = true;
+ 
+ 	      imap->l_scope_max = new_size;
+ 	    }
+@@ -457,6 +460,20 @@
+   r->r_state = RT_DELETE;
+   _dl_debug_state ();
+ 
++  if (!RTLD_SINGLE_THREAD_P
++      && (scope_mem_left
++	 || (GL(dl_scope_free_list) != NULL
++	     && GL(dl_scope_free_list)->count)))
++    {
++      THREAD_GSCOPE_WAIT ();
++
++      /* Now we can free any queued old scopes.  */
++      struct dl_scope_free_list *fsl = GL(dl_scope_free_list);
++      if (fsl != NULL)
++        while (fsl->count > 0)
++	  free (fsl->list[--fsl->count]);
++    }
++
+   size_t tls_free_start;
+   size_t tls_free_end;
+   tls_free_start = tls_free_end = NO_TLS_OFFSET;
+@@ -769,4 +786,8 @@
+ 	   malloc), and in the static library it's in .bss space.  */
+ 	free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)->next);
+     }
++
++  void *scope_free_list = GL(dl_scope_free_list);
++  GL(dl_scope_free_list) = NULL;
++  free(scope_free_list);
+ }
+diff -ur glibc-2.6-orig/elf/dl-lookup.c glibc-2.6/build-tree/glibc-2.6/elf/dl-lookup.c
+--- glibc-2.6-orig/elf/dl-lookup.c	2007-01-15 21:45:53.000000000 +0100
++++ glibc-2.6/elf/dl-lookup.c	2007-07-20 03:07:43.000000000 +0200
+@@ -86,7 +86,7 @@
+ /* Add extra dependency on MAP to UNDEF_MAP.  */
+ static int
+ internal_function
+-add_dependency (struct link_map *undef_map, struct link_map *map, int flags)
++add_dependency (struct link_map *undef_map, struct link_map *map)
+ {
+   struct link_map **list;
+   struct link_map *runp;
+@@ -99,18 +99,8 @@
+   if (undef_map == map)
+     return 0;
+ 
+-  /* Make sure nobody can unload the object while we are at it.
+-     If we hold a scope lock drop it now to avoid ABBA locking problems.  */
+-  if ((flags & DL_LOOKUP_SCOPE_LOCK) != 0 && !RTLD_SINGLE_THREAD_P)
+-    {
+-      __rtld_mrlock_unlock (undef_map->l_scope_lock);
+-
+-      __rtld_lock_lock_recursive (GL(dl_load_lock));
+-
+-      __rtld_mrlock_lock (undef_map->l_scope_lock);
+-    }
+-  else
+-    __rtld_lock_lock_recursive (GL(dl_load_lock));
++  /* Make sure nobody can unload the object while we are at it. */
++  __rtld_lock_lock_recursive (GL(dl_load_lock));
+ 
+   /* Avoid references to objects which cannot be unloaded anyway.  */
+   if (map->l_type != lt_loaded
+@@ -237,10 +227,9 @@
+ 
+   bump_num_relocations ();
+ 
+-  /* No other flag than DL_LOOKUP_ADD_DEPENDENCY and DL_LOOKUP_SCOPE_LOCK
+-     is allowed if we look up a versioned symbol.  */
+-  assert (version == NULL || (flags & ~(DL_LOOKUP_ADD_DEPENDENCY
+-					| DL_LOOKUP_SCOPE_LOCK)) == 0);
++  /* No other flag than DL_LOOKUP_ADD_DEPENDENCY is allowed if we look
++     up a versioned symbol.  */
++  assert (version == NULL || (flags & ~(DL_LOOKUP_ADD_DEPENDENCY)) == 0);
+ 
+   size_t i = 0;
+   if (__builtin_expect (skip_map != NULL, 0))
+@@ -350,13 +339,11 @@
+ 	 runtime lookups.  */
+       && (flags & DL_LOOKUP_ADD_DEPENDENCY) != 0
+       /* Add UNDEF_MAP to the dependencies.  */
+-      && add_dependency (undef_map, current_value.m, flags) < 0)
++      && add_dependency (undef_map, current_value.m) < 0)
+       /* Something went wrong.  Perhaps the object we tried to reference
+ 	 was just removed.  Try finding another definition.  */
+-      return _dl_lookup_symbol_x (undef_name, undef_map, ref,
+-				  (flags & DL_LOOKUP_SCOPE_LOCK) == 0
+-				  ? symbol_scope : undef_map->l_scope, version,
+-				  type_class, flags, skip_map);
++      return _dl_lookup_symbol_x (undef_name, undef_map, ref, symbol_scope,
++				  version, type_class, flags, skip_map);
+ 
+   /* The object is used.  */
+   current_value.m->l_used = 1;
+diff -ur glibc-2.6-orig/elf/dl-object.c glibc-2.6/build-tree/glibc-2.6/elf/dl-object.c
+--- glibc-2.6-orig/elf/dl-object.c	2006-10-28 01:11:41.000000000 +0200
++++ glibc-2.6/elf/dl-object.c	2007-07-20 03:07:17.000000000 +0200
+@@ -25,6 +25,8 @@
+ 
+ #include <assert.h>
+ 
++#include "gscope.h"
++
+ 
+ /* Allocate a `struct link_map' for a new object being loaded,
+    and enter it into the _dl_loaded list.  */
+@@ -85,11 +87,6 @@
+   new->l_scope = new->l_scope_mem;
+   new->l_scope_max = sizeof (new->l_scope_mem) / sizeof (new->l_scope_mem[0]);
+ 
+-  /* No need to initialize the scope lock if the initializer is zero.  */
+-#if _RTLD_MRLOCK_INITIALIZER != 0
+-  __rtld_mrlock_initialize (new->l_scope_lock);
+-#endif
+-
+   /* Counter for the scopes we have to handle.  */
+   idx = 0;
+ 
+diff -ur glibc-2.6-orig/elf/dl-open.c glibc-2.6/build-tree/glibc-2.6/elf/dl-open.c
+--- glibc-2.6-orig/elf/dl-open.c	2007-05-11 23:34:32.000000000 +0200
++++ glibc-2.6/elf/dl-open.c	2007-07-20 04:22:28.000000000 +0200
+@@ -32,9 +32,11 @@
+ #include <bp-sym.h>
+ #include <caller.h>
+ #include <sysdep-cancel.h>
++#include <atomic.h>
+ 
+ #include <dl-dst.h>
+ 
++#include "gscope.h"
+ 
+ extern ElfW(Addr) _dl_sysdep_start (void **start_argptr,
+ 				    void (*dl_main) (const ElfW(Phdr) *phdr,
+@@ -154,6 +156,40 @@
+   return 0;
+ }
+ 
++int
++_dl_scope_free (struct r_scope_elem **old)
++{
++  struct dl_scope_free_list *fsl;
++#define DL_SCOPE_FREE_LIST_SIZE (sizeof (fsl->list) / sizeof (fsl->list[0]))
++
++  if (RTLD_SINGLE_THREAD_P)
++    free (old);
++  else if ((fsl = GL(dl_scope_free_list)) == NULL)
++    {
++      GL(dl_scope_free_list) = fsl = malloc (sizeof (*fsl));
++      if (fsl == NULL)
++	{
++	  THREAD_GSCOPE_WAIT ();
++	  free (old);
++	  return 1;
++	}
++      else
++	{
++	  fsl->list[0] = old;
++	  fsl->count = 1;
++	}
++    }
++  else if (fsl->count < DL_SCOPE_FREE_LIST_SIZE)
++    fsl->list[fsl->count++] = old;
++  else
++    {
++      THREAD_GSCOPE_WAIT ();
++      while (fsl->count > 0)
++	free (fsl->list[--fsl->count]);
++      return 1;
++    }
++  return 0;
++}
+ 
+ static void
+ dl_open_worker (void *a)
+@@ -418,17 +454,10 @@
+ 	      memcpy (newp, imap->l_scope, cnt * sizeof (imap->l_scope[0]));
+ 	      struct r_scope_elem **old = imap->l_scope;
+ 
+-	      if (RTLD_SINGLE_THREAD_P)
+-		imap->l_scope = newp;
+-	      else
+-		{
+-		  __rtld_mrlock_change (imap->l_scope_lock);
+-		  imap->l_scope = newp;
+-		  __rtld_mrlock_done (imap->l_scope_lock);
+-		}
++	      imap->l_scope = newp;
+ 
+ 	      if (old != imap->l_scope_mem)
+-		free (old);
++		_dl_scope_free (old);
+ 
+ 	      imap->l_scope_max = new_size;
+ 	    }
+diff -ur glibc-2.6-orig/elf/dl-runtime.c glibc-2.6/build-tree/glibc-2.6/elf/dl-runtime.c
+--- glibc-2.6-orig/elf/dl-runtime.c	2007-01-15 21:46:54.000000000 +0100
++++ glibc-2.6/elf/dl-runtime.c	2007-07-20 03:07:14.000000000 +0200
+@@ -27,6 +27,8 @@
+ #include <sysdep-cancel.h>
+ #include "dynamic-link.h"
+ 
++#include "gscope.h"
++
+ #if (!defined ELF_MACHINE_NO_RELA && !defined ELF_MACHINE_PLT_REL) \
+     || ELF_MACHINE_NO_REL
+ # define PLTREL  ElfW(Rela)
+@@ -97,17 +99,15 @@
+ 	 not necessary for objects which cannot be unloaded or when
+ 	 we are not using any threads (yet).  */
+       int flags = DL_LOOKUP_ADD_DEPENDENCY;
+-      if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P)
+-	{
+-	  __rtld_mrlock_lock (l->l_scope_lock);
+-	  flags |= DL_LOOKUP_SCOPE_LOCK;
+-	}
++      if (!RTLD_SINGLE_THREAD_P)
++	THREAD_GSCOPE_SET_FLAG ();
+ 
+       result = _dl_lookup_symbol_x (strtab + sym->st_name, l, &sym, l->l_scope,
+ 				    version, ELF_RTYPE_CLASS_PLT, flags, NULL);
+ 
+-      if ((flags & DL_LOOKUP_SCOPE_LOCK) != 0)
+-	__rtld_mrlock_unlock (l->l_scope_lock);
++      /* We are done with the global scope.  */
++      if (!RTLD_SINGLE_THREAD_P)
++	THREAD_GSCOPE_RESET_FLAG ();
+ 
+       /* Currently result contains the base load address (or link map)
+ 	 of the object that defines sym.  Now add in the symbol
+@@ -191,18 +191,16 @@
+ 	     not necessary for objects which cannot be unloaded or when
+ 	     we are not using any threads (yet).  */
+ 	  int flags = DL_LOOKUP_ADD_DEPENDENCY;
+-	  if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P)
+-	    {
+-	      __rtld_mrlock_lock (l->l_scope_lock);
+-	      flags |= DL_LOOKUP_SCOPE_LOCK;
+-	    }
++	  if (!RTLD_SINGLE_THREAD_P)
++	    THREAD_GSCOPE_SET_FLAG ();
+ 
+ 	  result = _dl_lookup_symbol_x (strtab + refsym->st_name, l,
+ 					&defsym, l->l_scope, version,
+ 					ELF_RTYPE_CLASS_PLT, flags, NULL);
+ 
+-	  if ((flags & DL_LOOKUP_SCOPE_LOCK) != 0)
+-	    __rtld_mrlock_unlock (l->l_scope_lock);
++	  /* We are done with the global scope.  */
++	  if (!RTLD_SINGLE_THREAD_P)
++	    THREAD_GSCOPE_RESET_FLAG ();
+ 
+ 	  /* Currently result contains the base load address (or link map)
+ 	     of the object that defines sym.  Now add in the symbol
+diff -ur glibc-2.6-orig/elf/dl-support.c glibc-2.6/build-tree/glibc-2.6/elf/dl-support.c
+--- glibc-2.6-orig/elf/dl-support.c	2007-07-19 23:45:07.000000000 +0200
++++ glibc-2.6/elf/dl-support.c	2007-07-20 04:33:59.000000000 +0200
+@@ -33,6 +33,8 @@
+ #include <unsecvars.h>
+ #include <hp-timing.h>
+ 
++#include "gscope.h"
++
+ extern char *__progname;
+ char **_dl_argv = &__progname;	/* This is checked for some error messages.  */
+ 
+@@ -137,6 +139,8 @@
+ int (*_dl_make_stack_executable_hook) (void **) internal_function
+   = _dl_make_stack_executable;
+ 
++int volatile _dl_thread_gscope_count;
++struct dl_scope_free_list *_dl_scope_free_list;
+ 
+ #ifdef NEED_DL_SYSINFO
+ /* Needed for improved syscall handling on at least x86/Linux.  */
+diff -ur glibc-2.6-orig/elf/dl-sym.c glibc-2.6/build-tree/glibc-2.6/elf/dl-sym.c
+--- glibc-2.6-orig/elf/dl-sym.c	2007-01-15 21:47:44.000000000 +0100
++++ glibc-2.6/elf/dl-sym.c	2007-07-20 03:07:15.000000000 +0200
+@@ -28,6 +28,8 @@
+ #include <sysdep-cancel.h>
+ #include <dl-tls.h>
+ 
++#include "gscope.h"
++
+ 
+ #ifdef SHARED
+ /* Systems which do not have tls_index also probably have to define
+@@ -113,29 +115,29 @@
+ 	 the initial binary.  And then the more complex part
+ 	 where the object is dynamically loaded and the scope
+ 	 array can change.  */
+-      if (match->l_type != lt_loaded || RTLD_SINGLE_THREAD_P)
++      if (RTLD_SINGLE_THREAD_P)
+ 	result = GLRO(dl_lookup_symbol_x) (name, match, &ref,
+ 					   match->l_scope, vers, 0,
+ 					   flags | DL_LOOKUP_ADD_DEPENDENCY,
+ 					   NULL);
+       else
+ 	{
+-	  __rtld_mrlock_lock (match->l_scope_lock);
+-
+ 	  struct call_dl_lookup_args args;
+ 	  args.name = name;
+ 	  args.map = match;
+ 	  args.vers = vers;
+-	  args.flags = flags | DL_LOOKUP_ADD_DEPENDENCY | DL_LOOKUP_SCOPE_LOCK;
++	  args.flags = flags | DL_LOOKUP_ADD_DEPENDENCY;
+ 	  args.refp = &ref;
+ 
++	  THREAD_GSCOPE_SET_FLAG ();
++
+ 	  const char *objname;
+ 	  const char *errstring = NULL;
+ 	  bool malloced;
+ 	  int err = GLRO(dl_catch_error) (&objname, &errstring, &malloced,
+ 					  call_dl_lookup, &args);
+ 
+-	  __rtld_mrlock_unlock (match->l_scope_lock);
++	  THREAD_GSCOPE_RESET_FLAG ();
+ 
+ 	  if (__builtin_expect (errstring != NULL, 0))
+ 	    {
+diff -ur glibc-2.6-orig/sysdeps/generic/ldsodefs.h glibc-2.6/build-tree/glibc-2.6/sysdeps/generic/ldsodefs.h
+--- glibc-2.6-orig/sysdeps/generic/ldsodefs.h	2007-07-19 23:45:14.000000000 +0200
++++ glibc-2.6/sysdeps/generic/ldsodefs.h	2007-07-20 04:41:36.000000000 +0200
+@@ -38,7 +38,6 @@
+ #include <bits/libc-lock.h>
+ #include <hp-timing.h>
+ #include <tls.h>
+-#include <rtld-lowlevel.h>
+ 
+ __BEGIN_DECLS
+ 
+@@ -486,6 +485,12 @@
+ 
+   EXTERN void (*_dl_init_static_tls) (struct link_map *);
+ 
++  EXTERN struct dl_scope_free_list
++  {
++    size_t count;
++    struct r_scope_elem **list[50];
++  } *_dl_scope_free_list;
++  EXTERN volatile int _dl_thread_gscope_count;
+ #ifdef SHARED
+ };
+ # define __rtld_global_attribute__
+@@ -838,9 +843,7 @@
+     DL_LOOKUP_ADD_DEPENDENCY = 1,
+     /* Return most recent version instead of default version for
+        unversioned lookup.  */
+-    DL_LOOKUP_RETURN_NEWEST = 2,
+-    /* Set if the scopr lock in the UNDEF_MAP is taken.  */
+-    DL_LOOKUP_SCOPE_LOCK = 4
++    DL_LOOKUP_RETURN_NEWEST = 2
+   };
+ 
+ /* Lookup versioned symbol.  */
+@@ -1048,6 +1051,11 @@
+ 		       Lmid_t nsid, int argc, char *argv[], char *env[])
+      attribute_hidden;
+ 
++/* Free or queue for freeing scope OLD.  If other threads might be 
++   in the middle of _dl_fixup, _dl_profile_fixup or dl*sym using the 
++   old scope, OLD can't be freed until no thread is using it.  */ 
++extern int _dl_scope_free (struct r_scope_elem **old) attribute_hidden; 
++
+ /* Add module to slot information data.  */
+ extern void _dl_add_to_slotinfo (struct link_map  *l) attribute_hidden;
+ 
+--- glibc-2.6-orig/include/link.h	2007-05-11 06:38:05.000000000 +0000
++++ glibc-2.6/include/link.h	2007-07-20 17:14:35.000000000 +0000
+@@ -44,7 +44,6 @@
+ #include <dl-lookupcfg.h>
+ #include <tls.h>
+ #include <bits/libc-lock.h>
+-#include <rtld-lowlevel.h>
+ 
+ 
+ /* Some internal data structures of the dynamic linker used in the
+@@ -220,8 +219,6 @@
+     /* This is an array defining the lookup scope for this link map.
+        There are initially at most three different scope lists.  */
+     struct r_scope_elem **l_scope;
+-    /* We need to protect using the SCOPEREC.  */
+-    __rtld_mrlock_define (, l_scope_lock)
+ 
+     /* A similar array, this time only with the local scope.  This is
+        used occasionally.  */
+--- /dev/null	2005-07-17 23:39:37.000000000 +0000
++++ glibc-2.6/elf/gscope.h	2007-07-19 23:00:57.000000000 +0000
+@@ -0,0 +1,14 @@
++#ifndef _GSCOPE_H
++#define _GSCOPE_H 1
++#include <mach/mach_traps.h>
++/* Temporary poor-man's global scope switch support: just busy-waits */
++#define THREAD_GSCOPE_SET_FLAG() \
++	asm volatile ("lock incl %0":"=m"(GL(dl_thread_gscope_count)))
++#define THREAD_GSCOPE_RESET_FLAG() \
++	asm volatile ("lock decl %0":"=m"(GL(dl_thread_gscope_count)))
++#define THREAD_GSCOPE_WAIT() \
++  while (GL(dl_thread_gscope_count)) { \
++    __swtch_pri (0); \
++  }
++#endif
+--- /dev/null	2007-07-20 20:36:08.980000000 +0200
++++ glibc-2.6/sysdeps/mach/hurd/sysdep-cancel.h	2007-07-20 01:24:22.000000000 +0200
+@@ -0,0 +1,9 @@
++#include <sysdep.h>
++
++/* Always multi-thread (since there's at least the sig handler), but no
++   handling enabled.  */
++#define SINGLE_THREAD_P (0)
++#define RTLD_SINGLE_THREAD_P (0)
++#define LIBC_CANCEL_ASYNC()	0 /* Just a dummy value.  */
++#define LIBC_CANCEL_RESET(val)	((void)(val)) /* Nothing, but evaluate it.  */
++#define LIBC_CANCEL_HANDLED()	/* Nothing.  */

Added: glibc-package/trunk/debian/patches/hurd-i386/local-no-strerror_l.diff
===================================================================
--- glibc-package/trunk/debian/patches/hurd-i386/local-no-strerror_l.diff	                        (rev 0)
+++ glibc-package/trunk/debian/patches/hurd-i386/local-no-strerror_l.diff	2007-07-21 00:27:17 UTC (rev 2425)
@@ -0,0 +1,32 @@
+Needs porting. Since this is new with 2.6, just disable for now, and please
+someone take the time to port it.
+
+diff -ur glibc-2.6-orig/string/strerror_l.c glibc-2.6/build-tree/glibc-2.6/string/strerror_l.c
+--- glibc-2.6-orig/string/strerror_l.c	2007-03-17 18:09:07.000000000 +0100
++++ glibc-2.6/string/strerror_l.c	2007-07-20 05:05:40.000000000 +0200
+@@ -23,6 +23,8 @@
+ #include <string.h>
+ #include <sys/param.h>
+ 
++#if 0
++Needs porting
+ 
+ static __thread char *last_value;
+ 
+@@ -70,3 +72,4 @@
+ text_set_element (__libc_subfreeres, strerror_thread_freeres);
+ # endif
+ #endif
++#endif
+--- glibc-2.6-orig/string/string.h	2007-02-01 16:08:52.000000000 +0000
++++ glibc-2.6/string/string.h	2007-07-20 23:50:59.000000000 +0000
+@@ -285,7 +285,8 @@
+ 
+ #ifdef __USE_GNU
+ /* Translate error number to string according to the locale L.  */
+-extern char *strerror_l (int __errnum, __locale_t __l) __THROW;
++/* Not yet ported on the Hurd.  */
++/* extern char *strerror_l (int __errnum, __locale_t __l) __THROW; */
+ #endif
+ 
+ 

Added: glibc-package/trunk/debian/patches/hurd-i386/submitted-lock-intern.diff
===================================================================
--- glibc-package/trunk/debian/patches/hurd-i386/submitted-lock-intern.diff	                        (rev 0)
+++ glibc-package/trunk/debian/patches/hurd-i386/submitted-lock-intern.diff	2007-07-21 00:27:17 UTC (rev 2425)
@@ -0,0 +1,11 @@
+diff -ur glibc-2.6-orig/mach/lock-intern.h glibc-2.6/build-tree/glibc-2.6/mach/lock-intern.h
+--- glibc-2.6-orig/mach/lock-intern.h	2007-06-10 21:38:14.000000000 +0000
++++ glibc-2.6/mach/lock-intern.h	2007-06-10 21:40:47.000000000 +0000
+@@ -19,6 +19,7 @@
+ #ifndef _LOCK_INTERN_H
+ #define	_LOCK_INTERN_H
+ 
++#include <sys/cdefs.h>
+ #include <machine-lock.h>
+ 
+ #ifndef _EXTERN_INLINE

Modified: glibc-package/trunk/debian/patches/series
===================================================================
--- glibc-package/trunk/debian/patches/series	2007-07-20 23:40:55 UTC (rev 2424)
+++ glibc-package/trunk/debian/patches/series	2007-07-21 00:27:17 UTC (rev 2425)
@@ -68,6 +68,7 @@
 hurd-i386/submitted-sysvshm.diff 
 hurd-i386/submitted-trivial.diff -p0
 hurd-i386/submitted-ioctl-unsigned-size_t.diff -p0
+hurd-i386/submitted-lock-intern.diff
 
 i386/local-biarch.diff 
 i386/local-cmov.diff -p0

Added: glibc-package/trunk/debian/patches/series.hurd-i386
===================================================================
--- glibc-package/trunk/debian/patches/series.hurd-i386	                        (rev 0)
+++ glibc-package/trunk/debian/patches/series.hurd-i386	2007-07-21 00:27:17 UTC (rev 2425)
@@ -0,0 +1,3 @@
+hurd-i386/local-gscope.diff
+hurd-i386/local-atomic-no-multiple_threads.diff
+hurd-i386/local-no-strerror_l.diff

Modified: glibc-package/trunk/debian/sysdeps/depflags.pl
===================================================================
--- glibc-package/trunk/debian/sysdeps/depflags.pl	2007-07-20 23:40:55 UTC (rev 2424)
+++ glibc-package/trunk/debian/sysdeps/depflags.pl	2007-07-21 00:27:17 UTC (rev 2425)
@@ -24,7 +24,7 @@
     push @{$libc_dev_c{'Conflicts'}}, 'glibc2-dev';
     push @{$libc_c{'Replaces'}}, 'glibc2';
     push @{$libc_c{'Conflicts'}}, 'glibc2';
-    push @{$libc_c{'Depends'}}, 'hurd (>= 20010718-1)';
+    push @{$libc_c{'Depends'}}, 'hurd (>= 20070606-1+SVN)';
 }
 if ($DEB_HOST_ARCH_OS eq "linux") {
     push @{$libc_c{'Suggests'}}, 'locales';



Reply to: