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: