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

r2289 - in glibc-package/branches/glibc-2.6/debian: . patches patches/any



Author: aurel32
Date: 2007-05-24 20:49:19 +0000 (Thu, 24 May 2007)
New Revision: 2289

Added:
   glibc-package/branches/glibc-2.6/debian/patches/any/local-linuxthreads-fatalprepare.diff
   glibc-package/branches/glibc-2.6/debian/patches/any/local-linuxthreads-lowlevellock.diff
Modified:
   glibc-package/branches/glibc-2.6/debian/changelog
   glibc-package/branches/glibc-2.6/debian/patches/series
Log:
  * patches/any/local-linuxthreads-lowlevellock.diff: new patch to support
    low level locking on linuxthreads.
  * patches/any/local-linuxthreads-fatalprepare.diff: new patch to support
    FATAL_PREPARE on linuxthreads, by not using __libc_pthread_functions_init
    and PTHFCT_CALL.



Modified: glibc-package/branches/glibc-2.6/debian/changelog
===================================================================
--- glibc-package/branches/glibc-2.6/debian/changelog	2007-05-24 20:45:35 UTC (rev 2288)
+++ glibc-package/branches/glibc-2.6/debian/changelog	2007-05-24 20:49:19 UTC (rev 2289)
@@ -18,7 +18,7 @@
    - Remove hppa/local-r19use.diff (merged upstream).
    - Remove hurd-i386/cvs-futimes.diff (merged upstream).
    - Remove m68k/cvs-m68k-update.diff (obsolete).
-   - Update  m68k/local-mathinline_h.diff.
+   - Update m68k/local-mathinline_h.diff.
    - Remove mips/cvs-ldsodefs_h.diff (merged upstream).
    - Remove mips/submitted-msq.diff (merged upstream).
    - Remove all/cvs-iconv-E13B.diff (obsolete).
@@ -61,6 +61,11 @@
   * local/etc_init.d/glibc.sh, debhelper.in/libc.preinst: don't check for
     linux kernel, it is now done in script.in/kernelcheck.sh.
   * patches/any/cvs-malloc.diff: new patch from upstream to fix malloc ABI.
+  * patches/any/local-linuxthreads-lowlevellock.diff: new patch to support
+    low level locking on linuxthreads.
+  * patches/any/local-linuxthreads-fatalprepare.diff: new patch to support
+    FATAL_PREPARE on linuxthreads, by not using __libc_pthread_functions_init
+    and PTHFCT_CALL.
 
  -- Aurelien Jarno <aurel32@debian.org>  Thu, 24 May 2007 22:44:40 +0200
 

Added: glibc-package/branches/glibc-2.6/debian/patches/any/local-linuxthreads-fatalprepare.diff
===================================================================
--- glibc-package/branches/glibc-2.6/debian/patches/any/local-linuxthreads-fatalprepare.diff	                        (rev 0)
+++ glibc-package/branches/glibc-2.6/debian/patches/any/local-linuxthreads-fatalprepare.diff	2007-05-24 20:49:19 UTC (rev 2289)
@@ -0,0 +1,42 @@
+--- linuxthreads/sysdeps/unix/sysv/linux/fatal-prepare.h	2007-05-05 22:37:06.310788953 +0200
++++ linuxthreads/sysdeps/unix/sysv/linux/fatal-prepare.h	2007-05-23 23:24:40.000000000 +0200
+@@ -0,0 +1,39 @@
++/* Copyright (C) 2003, 2007 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   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 <pthread.h>
++
++/* We have to completely disable cancellation.  assert() must not be a
++   cancellation point but the implementation uses write() etc.  */
++#ifdef SHARED
++# include <pthread-functions.h>
++# define FATAL_PREPARE \
++  {									      \
++    int (*fp) (int, int *);                                                   \
++    fp = __libc_pthread_functions.ptr_pthread_setcancelstate;                 \
++    if (fp != NULL)                                                           \
++      fp (PTHREAD_CANCEL_DISABLE, NULL);                                      \
++  }
++#else
++# pragma weak pthread_setcancelstate
++# define FATAL_PREPARE \
++  {									      \
++    if (pthread_setcancelstate != NULL)					      \
++      pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL);		      \
++  }
++#endif

Added: glibc-package/branches/glibc-2.6/debian/patches/any/local-linuxthreads-lowlevellock.diff
===================================================================
--- glibc-package/branches/glibc-2.6/debian/patches/any/local-linuxthreads-lowlevellock.diff	                        (rev 0)
+++ glibc-package/branches/glibc-2.6/debian/patches/any/local-linuxthreads-lowlevellock.diff	2007-05-24 20:49:19 UTC (rev 2289)
@@ -0,0 +1,156 @@
+--- linuxthreads/sysdeps/unix/sysv/linux/rtld-lowlevel.h	1970-01-01 01:00:00.000000000 +0100
++++ linuxthreads/sysdeps/unix/sysv/linux/rtld-lowlevel.h	2007-05-23 16:21:36.000000000 +0200
+@@ -0,0 +1,153 @@
++/* Defintions for lowlevel handling in ld.so.
++   Copyright (C) 2006 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   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.  */
++
++#ifndef _RTLD_LOWLEVEL_H
++#define  _RTLD_LOWLEVEL_H 1
++
++#include <atomic.h>
++#include <lowlevellock.h>
++
++
++/* Special multi-reader lock used in ld.so.  */
++#define __RTLD_MRLOCK_WRITER 1
++#define __RTLD_MRLOCK_RWAIT 2
++#define __RTLD_MRLOCK_WWAIT 4
++#define __RTLD_MRLOCK_RBITS \
++  ~(__RTLD_MRLOCK_WRITER | __RTLD_MRLOCK_RWAIT | __RTLD_MRLOCK_WWAIT)
++#define __RTLD_MRLOCK_INC 8
++#define __RTLD_MRLOCK_TRIES 5
++
++
++typedef int __rtld_mrlock_t;
++
++
++#define __rtld_mrlock_define(CLASS,NAME) \
++  CLASS __rtld_mrlock_t NAME;
++
++
++#define _RTLD_MRLOCK_INITIALIZER 0
++#define __rtld_mrlock_initialize(NAME) \
++  (void) ((NAME) = 0)
++
++
++#define __rtld_mrlock_lock(lock) \
++  do {									      \
++    __label__ out;							      \
++    while (1)								      \
++      {									      \
++	int oldval;							      \
++	for (int tries = 0; tries < __RTLD_MRLOCK_TRIES; ++tries)	      \
++	  {								      \
++	    oldval = lock;						      \
++	    while (__builtin_expect ((oldval				      \
++				      & (__RTLD_MRLOCK_WRITER		      \
++					 | __RTLD_MRLOCK_WWAIT))	      \
++				     == 0, 1))				      \
++	      {								      \
++		int newval = ((oldval & __RTLD_MRLOCK_RBITS)		      \
++			      + __RTLD_MRLOCK_INC);			      \
++		int ret = atomic_compare_and_exchange_val_acq (&(lock),	      \
++							       newval,	      \
++							       oldval);	      \
++		if (__builtin_expect (ret == oldval, 1))		      \
++		  goto out;						      \
++		oldval = ret;						      \
++	      }								      \
++	    atomic_delay ();						      \
++	  }								      \
++	if ((oldval & __RTLD_MRLOCK_RWAIT) == 0)			      \
++	  {								      \
++	    atomic_or (&(lock), __RTLD_MRLOCK_RWAIT);			      \
++	    oldval |= __RTLD_MRLOCK_RWAIT;				      \
++	  }								      \
++	lll_futex_wait (lock, oldval);					      \
++      }									      \
++  out:;									      \
++  } while (0)
++
++
++#define __rtld_mrlock_unlock(lock) \
++  do {									      \
++    int oldval = atomic_exchange_and_add (&(lock), -__RTLD_MRLOCK_INC);	      \
++    if (__builtin_expect ((oldval					      \
++			   & (__RTLD_MRLOCK_RBITS | __RTLD_MRLOCK_WWAIT))     \
++			  == (__RTLD_MRLOCK_INC | __RTLD_MRLOCK_WWAIT), 0))   \
++      /* We have to wake all threads since there might be some queued	      \
++	 readers already.  */						      \
++      lll_futex_wake (&(lock), 0x7fffffff);				      \
++  } while (0)
++
++
++/* There can only ever be one thread trying to get the exclusive lock.  */
++#define __rtld_mrlock_change(lock) \
++  do {									      \
++    __label__ out;							      \
++    while (1)								      \
++      {									      \
++	int oldval;							      \
++	for (int tries = 0; tries < __RTLD_MRLOCK_TRIES; ++tries)	      \
++	  {								      \
++	    oldval = lock;						      \
++	    while (__builtin_expect ((oldval & __RTLD_MRLOCK_RBITS) == 0, 1)) \
++	      {								      \
++		int newval = ((oldval & __RTLD_MRLOCK_RWAIT)		      \
++			      + __RTLD_MRLOCK_WRITER);			      \
++		int ret = atomic_compare_and_exchange_val_acq (&(lock),	      \
++							       newval,	      \
++							       oldval);	      \
++		if (__builtin_expect (ret == oldval, 1))		      \
++		  goto out;						      \
++		oldval = ret;						      \
++	      }								      \
++	    atomic_delay ();						      \
++	  }								      \
++	atomic_or (&(lock), __RTLD_MRLOCK_WWAIT);			      \
++	oldval |= __RTLD_MRLOCK_WWAIT;					      \
++	lll_futex_wait (lock, oldval);					      \
++      }									      \
++  out:;									      \
++  } while (0)
++
++
++#define __rtld_mrlock_done(lock) \
++  do {				 \
++    int oldval = atomic_exchange_and_add (&(lock), -__RTLD_MRLOCK_WRITER);    \
++    if (__builtin_expect ((oldval & __RTLD_MRLOCK_RWAIT) != 0, 0))	      \
++      lll_futex_wake (&(lock), 0x7fffffff);				      \
++  } while (0)
++
++
++/* Function to wait for variable become zero.  Used in ld.so for
++   reference counters.  */
++#define __rtld_waitzero(word) \
++  do {									      \
++    while (1)								      \
++      {									      \
++	int val = word;							      \
++	if (val == 0)							      \
++	  break;							      \
++	lll_futex_wait (&(word), val);					      \
++      }									      \
++  } while (0)
++
++
++#define __rtld_notify(word) \
++  lll_futex_wake (&(word), 1)
++
++#endif

Modified: glibc-package/branches/glibc-2.6/debian/patches/series
===================================================================
--- glibc-package/branches/glibc-2.6/debian/patches/series	2007-05-24 20:45:35 UTC (rev 2288)
+++ glibc-package/branches/glibc-2.6/debian/patches/series	2007-05-24 20:49:19 UTC (rev 2289)
@@ -107,6 +107,8 @@
 any/local-ldconfig-timestamps.diff -p0
 any/local-libgcc-compat-main.diff -p0
 any/local-libgcc-compat-ports.diff -p0
+any/local-linuxthreads-lowlevellock.diff -p0
+any/local-linuxthreads-fatalprepare.diff -p0
 any/local-linuxthreads-semaphore_h.diff 
 any/local-linuxthreads-tst-sighandler.diff 
 any/local-localedef-fix-trampoline.diff -p0



Reply to: