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 <[EMAIL PROTECTED]> 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 -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]