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]

Reply via email to