Control: tags -1 d-i
Control: user release.debian....@packages.debian.org
Control: usertags -1 -pu +unblock

On 2015-03-14 14:26, Aurelien Jarno wrote:
> Package: release.debian.org
> Severity: normal
> Tags: jessie
> User: release.debian....@packages.debian.org
> Usertags: pu
> 
> Dear Release Team,
> 
> I believe that glibc version 2.19-17 should migrate to testing despite
> the freeze as it contains bug fixes important for Jessie:
> - It fixes a segmentation fault in ldconfig when the aux cache is
>   corrupted, causing postinst scripts to fail (RC bug #779442).
> - It adds a versioned depency to libc-bin on locales, so that
>   apt/aptitude can't decide to configure locales before libc-bin, as it
>   causes some locales to fail to be generated (bug #779442).
> 
> You will find the debdiff below. Please note that the following patches
> touches hurd specific files, which are not even compiled on other
> architectures:
> - hurd-i386/cvs-libpthread-dlopen.diff
> - hurd-i386/cvs-libpthread-libc-lockP.diff
> - hurd-i386/cvs-libpthread-libc-lockP2.diff
> 
> Thanks,
> Aurelien
> 
> 

Thanks for fixing one of the remaining Jessie blockers. :)  I have
unblocked it from the RT side and am CC'ing KiBi for a d-i ack.
Including the debdiff below for his convenience too.

Thanks,
~Niels

> 
> diff -Nru glibc-2.19/debian/changelog glibc-2.19/debian/changelog
> --- glibc-2.19/debian/changelog       2015-02-08 15:54:41.000000000 +0100
> +++ glibc-2.19/debian/changelog       2015-03-14 10:17:57.000000000 +0100
> @@ -1,3 +1,34 @@
> +glibc (2.19-17) unstable; urgency=medium
> +
> +  [ Adam Conrad ]
> +  * debian/rules.d/debhelper.mk: Unconditionally create tmp.substvars.
> +    Closes: #780431.
> +
> + -- Aurelien Jarno <aure...@debian.org>  Sat, 14 Mar 2015 10:17:56 +0100
> +
> +glibc (2.19-16) unstable; urgency=medium
> +
> +  [ Samuel Thibault ]
> +  * patches/hurd-i386/cvs-libpthread-dlopen.diff: New patch to allow
> +    libpthread.so to be dynamically loaded from a dlopened library.
> +  * patches/hurd-i386/cvs-libpthread-libc-lockP{,2}.diff: New patch to
> +    dynamically call pthread functions from libc.
> +
> +  [ Aurelien Jarno ]
> +  * We have a transition mechanism for the locales, as the Debian archive
> +    used to expose arch:all packages on all architectures even when the
> +    corresponding arch:any package is not available yet. This has been
> +    fixed long time ago, the transition mechanism has not been used
> +    correctly for a lot of time and has been broken by the split out of
> +    libc-bin. The breakage has been partially fixed by the "Breaks: locales 
> +    (<< 2.19)" added to libc6. It's now time to add the missing "Depends:
> +    libc-bin (>> 2.19)" to locales and remove the transition mechanism.
> +    Closes: #583088, #779442 
> +  * patches/any/cvs-ldconfig-aux-cache.diff: new patch from upstream to
> +    ignore corrupted aux-cache instead of segfaulting. Closes: #759530.
> +
> + -- Aurelien Jarno <aure...@debian.org>  Thu, 12 Mar 2015 22:00:40 +0100
> +
>  glibc (2.19-15) unstable; urgency=medium
>  
>    [ Aurelien Jarno ]
> diff -Nru glibc-2.19/debian/control glibc-2.19/debian/control
> --- glibc-2.19/debian/control 2015-01-20 00:53:06.000000000 +0100
> +++ glibc-2.19/debian/control 2015-03-08 22:29:32.000000000 +0100
> @@ -83,7 +83,7 @@
>  Architecture: all
>  Section: localization
>  Priority: standard
> -Depends: ${locale:Depends}, ${misc:Depends}, debconf | debconf-2.0
> +Depends: libc-bin (>> 2.19), ${misc:Depends}, debconf | debconf-2.0
>  Conflicts: base-config, belocs-locales-bin, belocs-locales-data
>  Replaces: base-config, lliurex-belocs-locales-data, manpages-fr-extra (<< 
> 20141022)
>  Build-Profiles: <!stage1>
> diff -Nru glibc-2.19/debian/control.in/main glibc-2.19/debian/control.in/main
> --- glibc-2.19/debian/control.in/main 2014-12-11 12:56:06.000000000 +0100
> +++ glibc-2.19/debian/control.in/main 2015-03-08 22:29:32.000000000 +0100
> @@ -83,7 +83,7 @@
>  Architecture: all
>  Section: localization
>  Priority: standard
> -Depends: ${locale:Depends}, ${misc:Depends}, debconf | debconf-2.0
> +Depends: libc-bin (>> 2.19), ${misc:Depends}, debconf | debconf-2.0
>  Conflicts: base-config, belocs-locales-bin, belocs-locales-data
>  Replaces: base-config, lliurex-belocs-locales-data, manpages-fr-extra (<< 
> 20141022)
>  Build-Profiles: <!stage1>
> diff -Nru glibc-2.19/debian/locales-depver glibc-2.19/debian/locales-depver
> --- glibc-2.19/debian/locales-depver  2014-02-16 04:14:12.000000000 +0100
> +++ glibc-2.19/debian/locales-depver  1970-01-01 01:00:00.000000000 +0100
> @@ -1,30 +0,0 @@
> -#  When glibc is uploaded into unstable, the locales package is immediately
> -#  available because it is arch:all.  But libc binary packages are processed
> -#  by autobuilders and become available later.
> -#
> -#  If compiling locales depend on a given version of localedef (for instance
> -#  when ISO codes are updated), the idea is to first bump LOCALES_COMPAT_VER 
> and
> -#  make an upload without changing locales.  When this version is available 
> on
> -#  all architectures in unstable, locales can be modified and LOCALES_DEP_VER
> -#  is bumped too.
> -#
> -#  LOCALES_COMPAT_VER must always contain two values during the transition 
> phase
> -#  so that dependencies in unstable can always be satisfied, and
> -#  LOCALES_DEP_VER point to the highest value of LOCALES_COMPAT_VER when
> -#  packages are available for all architectures in unstable.
> -
> -LOCALES_DEP_VER = 2.19-1
> -LOCALES_COMPAT_VER = 2.19-1
> -
> -#  Previous versions:
> -#    2.7-1: glibc 2.7
> -#    2.8-1: glibc 2.8
> -#    2.9-1: eglibc 2.9
> -#   2.10-1: eglibc 2.10
> -#   2.11-1: eglibc 2.11
> -#   2.13-1: eglibc 2.13
> -#   2.15-1: eglibc 2.15
> -#   2.16-1: eglibc 2.16
> -#   2.17-1: eglibc 2.17
> -#   2.18-1: eglibc 2.18
> -#   2.19-1: eglibc 2.19
> diff -Nru glibc-2.19/debian/patches/any/cvs-ldconfig-aux-cache.diff 
> glibc-2.19/debian/patches/any/cvs-ldconfig-aux-cache.diff
> --- glibc-2.19/debian/patches/any/cvs-ldconfig-aux-cache.diff 1970-01-01 
> 01:00:00.000000000 +0100
> +++ glibc-2.19/debian/patches/any/cvs-ldconfig-aux-cache.diff 2015-03-12 
> 20:09:12.000000000 +0100
> @@ -0,0 +1,20 @@
> +2015-03-11  Aurelien Jarno  <aurel...@aurel32.net>
> +
> +     [BZ #18093]
> +     * elf/cache.c (load_aux_cache): Regenerate the cache if it has
> +     the wrong size.
> +
> +diff --git a/elf/cache.c b/elf/cache.c
> +--- a/elf/cache.c
> ++++ b/elf/cache.c
> +@@ -698,7 +698,9 @@ load_aux_cache (const char *aux_cache_name)
> +   if (aux_cache == MAP_FAILED
> +       || aux_cache_size < sizeof (struct aux_cache_file)
> +       || memcmp (aux_cache->magic, AUX_CACHEMAGIC, sizeof AUX_CACHEMAGIC - 
> 1)
> +-      || aux_cache->nlibs >= aux_cache_size)
> ++      || aux_cache_size != (sizeof(struct aux_cache_file) +
> ++                        aux_cache->nlibs * sizeof(struct 
> aux_cache_file_entry) +
> ++                        aux_cache->len_strings))
> +     {
> +       close (fd);
> +       init_aux_cache ();
> diff -Nru glibc-2.19/debian/patches/hurd-i386/cvs-libpthread-dlopen.diff 
> glibc-2.19/debian/patches/hurd-i386/cvs-libpthread-dlopen.diff
> --- glibc-2.19/debian/patches/hurd-i386/cvs-libpthread-dlopen.diff    
> 1970-01-01 01:00:00.000000000 +0100
> +++ glibc-2.19/debian/patches/hurd-i386/cvs-libpthread-dlopen.diff    
> 2015-03-08 17:58:05.000000000 +0100
> @@ -0,0 +1,497 @@
> +commit 3410beff94994edf971dd634c56156d70c7cf215
> +Author: Samuel Thibault <samuel.thiba...@ens-lyon.org>
> +Date:   Sat Feb 28 21:41:47 2015 +0100
> +
> +    Allow libpthread.so to dynamically loaded from a dlopened library
> +    
> +    * pthread/pt-internal.h: Include <ldsodefs.h>
> +    (_dl_allocate_tls, _dl_deallocate_tls): Remove declarations.
> +    * sysdeps/mach/hurd/pt-sysdep.c (init_routine): Rename into 
> _init_routine,
> +    add `stack' parameter, return if __pthread_threads is already 
> initialized,
> +    pass stack address to __pthread_create_internal if any.
> +    (init_routine): New function, calls init_routine with 0
> +    (dynamic_init_routine): New constructor function, calls init_routine with
> +    __libc_stack_end.
> +
> +Index: glibc-2.19/libpthread/pthread/pt-internal.h
> +===================================================================
> +--- glibc-2.19.orig/libpthread/pthread/pt-internal.h
> ++++ glibc-2.19/libpthread/pthread/pt-internal.h
> +@@ -35,6 +35,10 @@
> + #include <pt-sysdep.h>
> + #include <pt-machdep.h>
> + 
> ++#ifdef IS_IN_libpthread
> ++# include <ldsodefs.h>
> ++#endif
> ++
> + /* Thread state.  */
> + enum pthread_state
> + {
> +@@ -323,17 +327,4 @@ const struct __pthread_rwlockattr __pthr
> + /* Default condition attributes.  */
> + const struct __pthread_condattr __pthread_default_condattr;
> + 
> +-
> +-#ifdef ENABLE_TLS
> +-
> +-/* From glibc.  */
> +-
> +-/* Dynamic linker TLS allocation.  */
> +-extern void *_dl_allocate_tls(void *);
> +-
> +-/* Dynamic linker TLS deallocation.  */
> +-extern void _dl_deallocate_tls(void *, int);
> +-
> +-#endif /* ENABLE_TLS */
> +-
> + #endif /* pt-internal.h */
> +Index: glibc-2.19/libpthread/sysdeps/mach/hurd/pt-sysdep.c
> +===================================================================
> +--- glibc-2.19.orig/libpthread/sysdeps/mach/hurd/pt-sysdep.c
> ++++ glibc-2.19/libpthread/sysdeps/mach/hurd/pt-sysdep.c
> +@@ -39,16 +39,31 @@ void *(*_cthread_init_routine)(void) = &
> +    should return a new stack pointer for the main thread.  The caller
> +    will switch to this new stack before doing anything serious.  */
> + static void *
> +-init_routine (void)
> ++_init_routine (void *stack)
> + {
> +   struct __pthread *thread;
> +   int err;
> ++  pthread_attr_t attr, *attrp = 0;
> ++
> ++  if (__pthread_threads)
> ++    /* Already initialized */
> ++    return 0;
> + 
> +   /* Initialize the library.  */
> +   __pthread_init ();
> + 
> ++  if (stack)
> ++    {
> ++      /* We are getting initialized due to dlopening a library using 
> libpthread
> ++     while the main program was not linked against libpthread.  */
> ++      /* Avoid allocating another stack */
> ++      attrp = &attr;
> ++      pthread_attr_init(attrp);
> ++      pthread_attr_setstack(attrp, __libc_stack_end, __vm_page_size);
> ++    }
> ++
> +   /* Create the pthread structure for the main thread (i.e. us).  */
> +-  err = __pthread_create_internal (&thread, 0, 0, 0);
> ++  err = __pthread_create_internal (&thread, attrp, 0, 0);
> +   assert_perror (err);
> + 
> +   /* XXX The caller copies the command line arguments and the environment
> +@@ -68,3 +83,16 @@ init_routine (void)
> + 
> +   return thread->mcontext.sp;
> + }
> ++
> ++static void *
> ++init_routine (void)
> ++{
> ++  return _init_routine (0);
> ++}
> ++
> ++#ifdef SHARED
> ++__attribute__ ((constructor)) static void dynamic_init_routine(void)
> ++{
> ++  _init_routine (__libc_stack_end);
> ++}
> ++#endif
> +
> +commit 8dc97a5e7ca62b98aba02883724fd58a91f9a32e
> +Author: Samuel Thibault <samuel.thiba...@ens-lyon.org>
> +Date:   Sun Mar 1 20:23:52 2015 +0100
> +
> +    Forward lockfile calls from libc to dynamically loaded libpthread
> +    
> +    * forward.c: (__libc_pthread_functions_init): Add variable
> +    (FORWARD2): Use __libc_pthread_functions_init instead of testing
> +    __libc_pthread_functions.ptr_##name value.
> +    (FORWARD_NORETURN): Add macro.
> +    (pthread_exit): Use FORWARD_NORETURN instead of FORWARD2.
> +    * libc_pthread_init.c (__libc_pthread_init): Set
> +    __libc_pthread_functions_init to 1.
> +    * pthread/pthread-functions.h (__pthread_once, __pthread_rwlock_rdlock,
> +    __pthread_rwlock_wrlock, __pthread_rwlock_unlock, __pthread_key_create,
> +    __pthread_getspecific, __pthread_setspecific, _cthreads_flockfile,
> +    _cthreads_funlockfile, _cthreads_ftrylockfile): Add prototypes.
> +    (pthread_functions): Add ptr_pthread_once, ptr_pthread_rwlock_rdlock,
> +    ptr_pthread_rwlock_wrlock, ptr_pthread_rwlock_unlock,
> +    ptr_pthread_key_create, ptr_pthread_getspecific, ptr_pthread_setspecific,
> +    ptr__IO_flockfile, ptr__IO_funlockfile, ptr__IO_ftrylockfile.
> +    (__libc_pthread_functions_init): Add variable declaration.
> +    (PTHFCT_CALL): Add macro.
> +    * pthread/pt-initialize.c (pthread_functions): Initialize 
> ptr_pthread_once,
> +    ptr_pthread_rwlock_rdlock, ptr_pthread_rwlock_wrlock, 
> pthread_rwlock_unlock,
> +    ptr_ptr_pthread_key_create, pthread_getspecific, ptr_pthread_setspecific,
> +    ptr_ptr__IO_flockfile, _IO_funlockfile, ptr__IO_ftrylockfile.
> +    * sysdeps/generic/pt-once.c (pthread_once): Rename to __pthread_once
> +    (pthread_once): Add strong alias.
> +    * sysdeps/generic/pt-rwlock-rdlock.c (pthread_rwlock_rdlock): Rename to
> +    __pthread_rwlock_rdlock
> +    (pthread_rwlock_rdlock): Add strong alias.
> +    * sysdeps/generic/pt-rwlock-wrlock.c (pthread_rwlock_wrlock): Rename to
> +    __pthread_rwlock_wrlock
> +    (pthread_rwlock_wrlock): Add strong alias.
> +    * sysdeps/generic/pt-rwlock-unlock.c (pthread_rwlock_unlock): Rename to
> +    __pthread_rwlock_unlock
> +    (pthread_rwlock_unlock): Add strong alias.
> +    * sysdeps/generic/pt-getspecific.c (pthread_getspecific): Rename to
> +    __pthread_getspecific
> +    (pthread_getspecific): Add strong alias.
> +    * sysdeps/generic/pt-setspecific.c (pthread_setspecific): Rename to
> +    __pthread_setspecific
> +    (pthread_setspecific): Add strong alias.
> +    * sysdeps/pthread/flockfile.c: Add file.
> +    * sysdeps/pthread/ftrylockfile.c: Add file.
> +    * sysdeps/pthread/funlockfile.c: Add file.
> +
> +diff --git a/libpthread/forward.c b/libpthread/forward.c
> +index 9e940fb..994106e 100644
> +--- a/libpthread/forward.c
> ++++ b/libpthread/forward.c
> +@@ -25,16 +25,28 @@
> + 
> + /* Pointers to the libc functions.  */
> + struct pthread_functions __libc_pthread_functions attribute_hidden;
> ++int __libc_pthread_functions_init attribute_hidden;
> + 
> + 
> + # define FORWARD2(name, rettype, decl, params, defaction) \
> + rettype                                                                     
>       \
> + name decl                                                                 \
> + {                                                                         \
> +-  if (__libc_pthread_functions.ptr_##name == NULL)                        \
> ++  if (!__libc_pthread_functions_init)                             \
> +     defaction;                                                              
>       \
> +                                                                           \
> +-  return __libc_pthread_functions.ptr_##name params;                        
>       \
> ++  return PTHFCT_CALL (ptr_##name, params);                        \
> ++}
> ++
> ++/* Same as FORWARD2, only without return.  */
> ++# define FORWARD_NORETURN(name, rettype, decl, params, defaction) \
> ++rettype                                                                     
>       \
> ++name decl                                                                 \
> ++{                                                                         \
> ++  if (!__libc_pthread_functions_init)                             \
> ++    defaction;                                                              
>       \
> ++                                                                          \
> ++  PTHFCT_CALL (ptr_##name, params);                       \
> + }
> + 
> + # define FORWARD(name, decl, params, defretval) \
> +@@ -94,7 +106,7 @@ FORWARD (pthread_equal, (pthread_t thread1, pthread_t 
> thread2),
> + 
> + 
> + /* Use an alias to avoid warning, as pthread_exit is declared noreturn.  */
> +-FORWARD2 (pthread_exit, void, (void *retval), (retval), exit (EXIT_SUCCESS))
> ++FORWARD_NORETURN (pthread_exit, void, (void *retval), (retval), exit 
> (EXIT_SUCCESS))
> + 
> + 
> + FORWARD (pthread_getschedparam,
> +diff --git a/libpthread/libc_pthread_init.c b/libpthread/libc_pthread_init.c
> +index e6c8b9f..bc808cb 100644
> +--- a/libpthread/libc_pthread_init.c
> ++++ b/libpthread/libc_pthread_init.c
> +@@ -30,5 +30,6 @@ __libc_pthread_init (functions)
> +      can be done with one memory access instead of two.  */
> +   memcpy (&__libc_pthread_functions, functions,
> +       sizeof (__libc_pthread_functions));
> ++  __libc_pthread_functions_init = 1;
> + #endif
> + }
> +diff --git a/libpthread/pthread/pt-initialize.c 
> b/libpthread/pthread/pt-initialize.c
> +index a99cc59..aa3cf82 100644
> +--- a/libpthread/pthread/pt-initialize.c
> ++++ b/libpthread/pthread/pt-initialize.c
> +@@ -64,6 +64,16 @@ static const struct pthread_functions pthread_functions =
> +     .ptr_pthread_setcancelstate = __pthread_setcancelstate,
> +     .ptr_pthread_setcanceltype = __pthread_setcanceltype,
> +     .ptr___pthread_get_cleanup_stack = __pthread_get_cleanup_stack,
> ++    .ptr_pthread_once = __pthread_once,
> ++    .ptr_pthread_rwlock_rdlock = __pthread_rwlock_rdlock,
> ++    .ptr_pthread_rwlock_wrlock = __pthread_rwlock_wrlock,
> ++    .ptr_pthread_rwlock_unlock = __pthread_rwlock_unlock,
> ++    .ptr_pthread_key_create = __pthread_key_create,
> ++    .ptr_pthread_getspecific = __pthread_getspecific,
> ++    .ptr_pthread_setspecific = __pthread_setspecific,
> ++    .ptr__IO_flockfile = _cthreads_flockfile,
> ++    .ptr__IO_funlockfile = _cthreads_funlockfile,
> ++    .ptr__IO_ftrylockfile = _cthreads_ftrylockfile,
> +   };
> + #endif /* IS_IN_libpthread */
> + 
> +diff --git a/libpthread/pthread/pthread-functions.h 
> b/libpthread/pthread/pthread-functions.h
> +index c0ba858..d236822 100644
> +--- a/libpthread/pthread/pthread-functions.h
> ++++ b/libpthread/pthread/pthread-functions.h
> +@@ -61,6 +61,17 @@ pthread_t __pthread_self (void);
> + int __pthread_setcancelstate (int, int *);
> + int __pthread_setcanceltype (int, int *);
> + struct __pthread_cancelation_handler **__pthread_get_cleanup_stack (void);
> ++int __pthread_once (pthread_once_t *, void (*) (void));
> ++int __pthread_rwlock_rdlock (pthread_rwlock_t *);
> ++int __pthread_rwlock_wrlock (pthread_rwlock_t *);
> ++int __pthread_rwlock_unlock (pthread_rwlock_t *);
> ++int __pthread_key_create (pthread_key_t *, void (*) (void *));
> ++void *__pthread_getspecific (pthread_key_t);
> ++int __pthread_setspecific (pthread_key_t, const void *);
> ++
> ++void _cthreads_flockfile (FILE *);
> ++void _cthreads_funlockfile (FILE *);
> ++int _cthreads_ftrylockfile (FILE *);
> + 
> + /* Data type shared with libc.  The libc uses it to pass on calls to
> +    the thread functions.  Wine pokes directly into this structure,
> +@@ -106,11 +117,25 @@ struct pthread_functions
> +   int (*ptr_pthread_setcancelstate) (int, int *);
> +   int (*ptr_pthread_setcanceltype) (int, int *);
> +   struct __pthread_cancelation_handler **(*ptr___pthread_get_cleanup_stack) 
> (void);
> ++  int (*ptr_pthread_once) (pthread_once_t *, void (*) (void));
> ++  int (*ptr_pthread_rwlock_rdlock) (pthread_rwlock_t *);
> ++  int (*ptr_pthread_rwlock_wrlock) (pthread_rwlock_t *);
> ++  int (*ptr_pthread_rwlock_unlock) (pthread_rwlock_t *);
> ++  int (*ptr_pthread_key_create) (pthread_key_t *, void (*) (void *));
> ++  void *(*ptr_pthread_getspecific) (pthread_key_t);
> ++  int (*ptr_pthread_setspecific) (pthread_key_t, const void *);
> ++  void (*ptr__IO_flockfile) (FILE *);
> ++  void (*ptr__IO_funlockfile) (FILE *);
> ++  int (*ptr__IO_ftrylockfile) (FILE *);
> + };
> + 
> + /* Variable in libc.so.  */
> + extern struct pthread_functions __libc_pthread_functions attribute_hidden;
> ++extern int __libc_pthread_functions_init attribute_hidden;
> + 
> + void __libc_pthread_init (const struct pthread_functions *functions);
> + 
> ++# define PTHFCT_CALL(fct, params) \
> ++    __libc_pthread_functions.fct params
> ++
> + #endif      /* pthread-functions.h */
> +diff --git a/libpthread/sysdeps/generic/pt-once.c 
> b/libpthread/sysdeps/generic/pt-once.c
> +index 5be5e48..d9f4733 100644
> +--- a/libpthread/sysdeps/generic/pt-once.c
> ++++ b/libpthread/sysdeps/generic/pt-once.c
> +@@ -23,7 +23,7 @@
> + #include <pt-internal.h>
> + 
> + int
> +-pthread_once (pthread_once_t *once_control, void (*init_routine) (void))
> ++__pthread_once (pthread_once_t *once_control, void (*init_routine) (void))
> + {
> +   if (once_control->run == 0)
> +     {
> +@@ -41,3 +41,4 @@ pthread_once (pthread_once_t *once_control, void 
> (*init_routine) (void))
> + 
> +   return 0;
> + }
> ++strong_alias (__pthread_once, pthread_once);
> +diff --git a/libpthread/sysdeps/generic/pt-rwlock-rdlock.c 
> b/libpthread/sysdeps/generic/pt-rwlock-rdlock.c
> +index 480cf48..6eca601 100644
> +--- a/libpthread/sysdeps/generic/pt-rwlock-rdlock.c
> ++++ b/libpthread/sysdeps/generic/pt-rwlock-rdlock.c
> +@@ -26,7 +26,8 @@ extern int __pthread_rwlock_timedrdlock_internal (struct 
> __pthread_rwlock *rwloc
> + 
> + /* Acquire RWLOCK for reading, block if we can't get it.  */
> + int
> +-pthread_rwlock_rdlock (struct __pthread_rwlock *rwlock)
> ++__pthread_rwlock_rdlock (struct __pthread_rwlock *rwlock)
> + {
> +   return __pthread_rwlock_timedrdlock_internal (rwlock, 0);
> + }
> ++strong_alias (__pthread_rwlock_rdlock, pthread_rwlock_rdlock);
> +diff --git a/libpthread/sysdeps/generic/pt-rwlock-unlock.c 
> b/libpthread/sysdeps/generic/pt-rwlock-unlock.c
> +index dcf1d3e..b45ad23 100644
> +--- a/libpthread/sysdeps/generic/pt-rwlock-unlock.c
> ++++ b/libpthread/sysdeps/generic/pt-rwlock-unlock.c
> +@@ -25,7 +25,7 @@
> +    are no threads waiting for a write lock, rescheduling the reader
> +    threads.  */
> + int
> +-pthread_rwlock_unlock (pthread_rwlock_t *rwlock)
> ++__pthread_rwlock_unlock (pthread_rwlock_t *rwlock)
> + {
> +   struct __pthread *wakeup;
> +   
> +@@ -96,3 +96,4 @@ pthread_rwlock_unlock (pthread_rwlock_t *rwlock)
> +   __pthread_spin_unlock (&rwlock->__lock);
> +   return 0;
> + }
> ++strong_alias (__pthread_rwlock_unlock, pthread_rwlock_unlock);
> +diff --git a/libpthread/sysdeps/generic/pt-rwlock-wrlock.c 
> b/libpthread/sysdeps/generic/pt-rwlock-wrlock.c
> +index be85b90..68254d1 100644
> +--- a/libpthread/sysdeps/generic/pt-rwlock-wrlock.c
> ++++ b/libpthread/sysdeps/generic/pt-rwlock-wrlock.c
> +@@ -28,7 +28,8 @@ extern int __pthread_rwlock_timedwrlock_internal (struct 
> __pthread_rwlock *rwloc
> + 
> + /* Acquire RWLOCK for writing.  */
> + int
> +-pthread_rwlock_wrlock (struct __pthread_rwlock *rwlock)
> ++__pthread_rwlock_wrlock (struct __pthread_rwlock *rwlock)
> + {
> +   return __pthread_rwlock_timedwrlock_internal (rwlock, 0);
> + }
> ++strong_alias (__pthread_rwlock_wrlock, pthread_rwlock_wrlock);
> +diff --git a/libpthread/sysdeps/hurd/pt-getspecific.c 
> b/libpthread/sysdeps/hurd/pt-getspecific.c
> +index 71ec63c..8a01470 100644
> +--- a/libpthread/sysdeps/hurd/pt-getspecific.c
> ++++ b/libpthread/sysdeps/hurd/pt-getspecific.c
> +@@ -23,7 +23,7 @@
> + #include <pt-internal.h>
> + 
> + void *
> +-pthread_getspecific (pthread_key_t key)
> ++__pthread_getspecific (pthread_key_t key)
> + {
> +   struct __pthread *self;
> + 
> +@@ -37,3 +37,4 @@ pthread_getspecific (pthread_key_t key)
> + 
> +   return hurd_ihash_find (self->thread_specifics, key);
> + }
> ++strong_alias (__pthread_getspecific, pthread_getspecific);
> +diff --git a/libpthread/sysdeps/hurd/pt-setspecific.c 
> b/libpthread/sysdeps/hurd/pt-setspecific.c
> +index d0b7302..b3976cc 100644
> +--- a/libpthread/sysdeps/hurd/pt-setspecific.c
> ++++ b/libpthread/sysdeps/hurd/pt-setspecific.c
> +@@ -23,7 +23,7 @@
> + #include <pt-internal.h>
> + 
> + int
> +-pthread_setspecific (pthread_key_t key, const void *value)
> ++__pthread_setspecific (pthread_key_t key, const void *value)
> + {
> +   error_t err;
> +   struct __pthread *self = _pthread_self ();
> +@@ -45,3 +45,4 @@ pthread_setspecific (pthread_key_t key, const void *value)
> +       
> +   return 0;
> + }
> ++strong_alias (__pthread_setspecific, pthread_setspecific);
> +diff --git a/libpthread/sysdeps/pthread/flockfile.c 
> b/libpthread/sysdeps/pthread/flockfile.c
> +new file mode 100644
> +index 0000000..bddd46c
> +--- /dev/null
> ++++ b/libpthread/sysdeps/pthread/flockfile.c
> +@@ -0,0 +1,33 @@
> ++/* Copyright (C) 2002-2014 Free Software Foundation, Inc.
> ++   This file is part of the GNU C Library.
> ++   Contributed by Ulrich Drepper <drep...@redhat.com>, 2002.
> ++
> ++   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, see
> ++   <http://www.gnu.org/licenses/>.  */
> ++
> ++#include <stdio.h>
> ++#include <libio.h>
> ++#include <bits/libc-lock.h>
> ++
> ++
> ++void
> ++__flockfile (stream)
> ++     FILE *stream;
> ++{
> ++#ifdef SHARED
> ++  __libc_ptf_call (_IO_flockfile, (stream), 0);
> ++#endif
> ++}
> ++weak_alias (__flockfile, _IO_flockfile)
> ++weak_alias (__flockfile, flockfile)
> +diff --git a/libpthread/sysdeps/pthread/ftrylockfile.c 
> b/libpthread/sysdeps/pthread/ftrylockfile.c
> +new file mode 100644
> +index 0000000..7aafbe9
> +--- /dev/null
> ++++ b/libpthread/sysdeps/pthread/ftrylockfile.c
> +@@ -0,0 +1,36 @@
> ++/* Copyright (C) 2002-2014 Free Software Foundation, Inc.
> ++   This file is part of the GNU C Library.
> ++   Contributed by Ulrich Drepper <drep...@redhat.com>, 2002.
> ++
> ++   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, see
> ++   <http://www.gnu.org/licenses/>.  */
> ++
> ++#include <errno.h>
> ++#include <pthread.h>
> ++#include <stdio.h>
> ++#include <bits/stdio-lock.h>
> ++
> ++
> ++int
> ++__ftrylockfile (stream)
> ++     FILE *stream;
> ++{
> ++#ifdef SHARED
> ++  return __libc_ptf_call (_IO_ftrylockfile, (stream), 0);
> ++#else
> ++  return 0;
> ++#endif
> ++}
> ++weak_alias (__ftrylockfile, _IO_ftrylockfile)
> ++weak_alias (__ftrylockfile, ftrylockfile)
> +diff --git a/libpthread/sysdeps/pthread/funlockfile.c 
> b/libpthread/sysdeps/pthread/funlockfile.c
> +new file mode 100644
> +index 0000000..59fa40e
> +--- /dev/null
> ++++ b/libpthread/sysdeps/pthread/funlockfile.c
> +@@ -0,0 +1,34 @@
> ++/* Copyright (C) 2002-2014 Free Software Foundation, Inc.
> ++   This file is part of the GNU C Library.
> ++   Contributed by Ulrich Drepper <drep...@redhat.com>, 2002.
> ++
> ++   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, see
> ++   <http://www.gnu.org/licenses/>.  */
> ++
> ++#include <pthread.h>
> ++#include <stdio.h>
> ++#include <libio.h>
> ++#include <bits/stdio-lock.h>
> ++
> ++
> ++void
> ++__funlockfile (stream)
> ++     FILE *stream;
> ++{
> ++#ifdef SHARED
> ++  __libc_ptf_call (_IO_funlockfile, (stream), 0);
> ++#endif
> ++}
> ++weak_alias (__funlockfile, _IO_funlockfile)
> ++weak_alias (__funlockfile, funlockfile)
> diff -Nru glibc-2.19/debian/patches/hurd-i386/cvs-libpthread-libc-lockP2.diff 
> glibc-2.19/debian/patches/hurd-i386/cvs-libpthread-libc-lockP2.diff
> --- glibc-2.19/debian/patches/hurd-i386/cvs-libpthread-libc-lockP2.diff       
> 1970-01-01 01:00:00.000000000 +0100
> +++ glibc-2.19/debian/patches/hurd-i386/cvs-libpthread-libc-lockP2.diff       
> 2015-03-08 12:01:33.000000000 +0100
> @@ -0,0 +1,468 @@
> +commit 988f0e4cbda1673dfaa47051b8a64d90a89ea2ce
> +Author: Samuel Thibault <samuel.thiba...@ens-lyon.org>
> +Date:   Sun Mar 8 11:22:19 2015 +0100
> +
> +    Move pthread-specific lock definitions and declarations to libpthread
> +    
> +    * sysdeps/pthread/bits/libc-lockP.h: New file
> +    * pthread/pthread-functions.h: Move to...
> +    * sysdeps/pthread/pthread-functions.h: ... here.
> +
> +diff --git a/libpthread/pthread/pthread-functions.h 
> b/libpthread/pthread/pthread-functions.h
> +deleted file mode 100644
> +index d236822..0000000
> +--- a/libpthread/pthread/pthread-functions.h
> ++++ /dev/null
> +@@ -1,141 +0,0 @@
> +-/* Copyright (C) 2003, 2012 Free Software Foundation, Inc.
> +-   This file is part of the GNU C Library.
> +-   Contributed by Ulrich Drepper <drep...@redhat.com>, 2003.
> +-
> +-   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 _PTHREAD_FUNCTIONS_H
> +-#define _PTHREAD_FUNCTIONS_H        1
> +-
> +-#include <pthread.h>
> +-
> +-int __pthread_attr_destroy (pthread_attr_t *);
> +-int __pthread_attr_init (pthread_attr_t *);
> +-int __pthread_attr_getdetachstate (const pthread_attr_t *, int *);
> +-int __pthread_attr_setdetachstate (pthread_attr_t *, int);
> +-int __pthread_attr_getinheritsched (const pthread_attr_t *, int *);
> +-int __pthread_attr_setinheritsched (pthread_attr_t *, int);
> +-int __pthread_attr_getschedparam (const pthread_attr_t *,
> +-                                     struct sched_param *);
> +-int __pthread_attr_setschedparam (pthread_attr_t *,
> +-                                     const struct sched_param *);
> +-int __pthread_attr_getschedpolicy (const pthread_attr_t *, int *);
> +-int __pthread_attr_setschedpolicy (pthread_attr_t *, int);
> +-int __pthread_attr_getscope (const pthread_attr_t *, int *);
> +-int __pthread_attr_setscope (pthread_attr_t *, int);
> +-int __pthread_condattr_destroy (pthread_condattr_t *);
> +-int __pthread_condattr_init (pthread_condattr_t *);
> +-int __pthread_cond_broadcast (pthread_cond_t *);
> +-int __pthread_cond_destroy (pthread_cond_t *);
> +-int __pthread_cond_init (pthread_cond_t *,
> +-                           const pthread_condattr_t *);
> +-int __pthread_cond_signal (pthread_cond_t *);
> +-int __pthread_cond_wait (pthread_cond_t *, pthread_mutex_t *);
> +-int __pthread_cond_timedwait (pthread_cond_t *, pthread_mutex_t *,
> +-                                 const struct timespec *);
> +-int __pthread_equal (pthread_t, pthread_t);
> +-void __pthread_exit (void *);
> +-int __pthread_getschedparam (pthread_t, int *, struct sched_param *);
> +-int __pthread_setschedparam (pthread_t, int,
> +-                                const struct sched_param *);
> +-int _pthread_mutex_destroy (pthread_mutex_t *);
> +-int _pthread_mutex_init (pthread_mutex_t *,
> +-                             const pthread_mutexattr_t *);
> +-int __pthread_mutex_lock (pthread_mutex_t *);
> +-int __pthread_mutex_trylock (pthread_mutex_t *);
> +-int __pthread_mutex_unlock (pthread_mutex_t *);
> +-pthread_t __pthread_self (void);
> +-int __pthread_setcancelstate (int, int *);
> +-int __pthread_setcanceltype (int, int *);
> +-struct __pthread_cancelation_handler **__pthread_get_cleanup_stack (void);
> +-int __pthread_once (pthread_once_t *, void (*) (void));
> +-int __pthread_rwlock_rdlock (pthread_rwlock_t *);
> +-int __pthread_rwlock_wrlock (pthread_rwlock_t *);
> +-int __pthread_rwlock_unlock (pthread_rwlock_t *);
> +-int __pthread_key_create (pthread_key_t *, void (*) (void *));
> +-void *__pthread_getspecific (pthread_key_t);
> +-int __pthread_setspecific (pthread_key_t, const void *);
> +-
> +-void _cthreads_flockfile (FILE *);
> +-void _cthreads_funlockfile (FILE *);
> +-int _cthreads_ftrylockfile (FILE *);
> +-
> +-/* Data type shared with libc.  The libc uses it to pass on calls to
> +-   the thread functions.  Wine pokes directly into this structure,
> +-   so if possible avoid breaking it and append new hooks to the end.  */
> +-struct pthread_functions
> +-{
> +-  int (*ptr_pthread_attr_destroy) (pthread_attr_t *);
> +-  int (*ptr_pthread_attr_init) (pthread_attr_t *);
> +-  int (*ptr_pthread_attr_getdetachstate) (const pthread_attr_t *, int *);
> +-  int (*ptr_pthread_attr_setdetachstate) (pthread_attr_t *, int);
> +-  int (*ptr_pthread_attr_getinheritsched) (const pthread_attr_t *, int *);
> +-  int (*ptr_pthread_attr_setinheritsched) (pthread_attr_t *, int);
> +-  int (*ptr_pthread_attr_getschedparam) (const pthread_attr_t *,
> +-                                     struct sched_param *);
> +-  int (*ptr_pthread_attr_setschedparam) (pthread_attr_t *,
> +-                                     const struct sched_param *);
> +-  int (*ptr_pthread_attr_getschedpolicy) (const pthread_attr_t *, int *);
> +-  int (*ptr_pthread_attr_setschedpolicy) (pthread_attr_t *, int);
> +-  int (*ptr_pthread_attr_getscope) (const pthread_attr_t *, int *);
> +-  int (*ptr_pthread_attr_setscope) (pthread_attr_t *, int);
> +-  int (*ptr_pthread_condattr_destroy) (pthread_condattr_t *);
> +-  int (*ptr_pthread_condattr_init) (pthread_condattr_t *);
> +-  int (*ptr_pthread_cond_broadcast) (pthread_cond_t *);
> +-  int (*ptr_pthread_cond_destroy) (pthread_cond_t *);
> +-  int (*ptr_pthread_cond_init) (pthread_cond_t *,
> +-                           const pthread_condattr_t *);
> +-  int (*ptr_pthread_cond_signal) (pthread_cond_t *);
> +-  int (*ptr_pthread_cond_wait) (pthread_cond_t *, pthread_mutex_t *);
> +-  int (*ptr_pthread_cond_timedwait) (pthread_cond_t *, pthread_mutex_t *,
> +-                                 const struct timespec *);
> +-  int (*ptr_pthread_equal) (pthread_t, pthread_t);
> +-  void (*ptr_pthread_exit) (void *);
> +-  int (*ptr_pthread_getschedparam) (pthread_t, int *, struct sched_param *);
> +-  int (*ptr_pthread_setschedparam) (pthread_t, int,
> +-                                const struct sched_param *);
> +-  int (*ptr_pthread_mutex_destroy) (pthread_mutex_t *);
> +-  int (*ptr_pthread_mutex_init) (pthread_mutex_t *,
> +-                             const pthread_mutexattr_t *);
> +-  int (*ptr_pthread_mutex_lock) (pthread_mutex_t *);
> +-  int (*ptr_pthread_mutex_trylock) (pthread_mutex_t *);
> +-  int (*ptr_pthread_mutex_unlock) (pthread_mutex_t *);
> +-  pthread_t (*ptr_pthread_self) (void);
> +-  int (*ptr_pthread_setcancelstate) (int, int *);
> +-  int (*ptr_pthread_setcanceltype) (int, int *);
> +-  struct __pthread_cancelation_handler **(*ptr___pthread_get_cleanup_stack) 
> (void);
> +-  int (*ptr_pthread_once) (pthread_once_t *, void (*) (void));
> +-  int (*ptr_pthread_rwlock_rdlock) (pthread_rwlock_t *);
> +-  int (*ptr_pthread_rwlock_wrlock) (pthread_rwlock_t *);
> +-  int (*ptr_pthread_rwlock_unlock) (pthread_rwlock_t *);
> +-  int (*ptr_pthread_key_create) (pthread_key_t *, void (*) (void *));
> +-  void *(*ptr_pthread_getspecific) (pthread_key_t);
> +-  int (*ptr_pthread_setspecific) (pthread_key_t, const void *);
> +-  void (*ptr__IO_flockfile) (FILE *);
> +-  void (*ptr__IO_funlockfile) (FILE *);
> +-  int (*ptr__IO_ftrylockfile) (FILE *);
> +-};
> +-
> +-/* Variable in libc.so.  */
> +-extern struct pthread_functions __libc_pthread_functions attribute_hidden;
> +-extern int __libc_pthread_functions_init attribute_hidden;
> +-
> +-void __libc_pthread_init (const struct pthread_functions *functions);
> +-
> +-# define PTHFCT_CALL(fct, params) \
> +-    __libc_pthread_functions.fct params
> +-
> +-#endif      /* pthread-functions.h */
> +diff --git a/libpthread/sysdeps/pthread/bits/libc-lockP.h 
> b/libpthread/sysdeps/pthread/bits/libc-lockP.h
> +new file mode 100644
> +index 0000000..65878f2
> +--- /dev/null
> ++++ b/libpthread/sysdeps/pthread/bits/libc-lockP.h
> +@@ -0,0 +1,158 @@
> ++/* Private libc-internal interface for mutex locks.
> ++   Copyright (C) 2015 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; see the file COPYING.LIB.  If
> ++   not, see <http://www.gnu.org/licenses/>.  */
> ++
> ++#ifndef _BITS_LIBC_LOCKP_H
> ++#define _BITS_LIBC_LOCKP_H 1
> ++
> ++#include <pthread.h>
> ++#include <pthread-functions.h>
> ++
> ++/* If we check for a weakly referenced symbol and then perform a
> ++   normal jump to it te code generated for some platforms in case of
> ++   PIC is unnecessarily slow.  What would happen is that the function
> ++   is first referenced as data and then it is called indirectly
> ++   through the PLT.  We can make this a direct jump.  */
> ++#ifdef __PIC__
> ++# define __libc_maybe_call(FUNC, ARGS, ELSE) \
> ++  (__extension__ ({ __typeof (FUNC) *_fn = (FUNC); \
> ++                _fn != NULL ? (*_fn) ARGS : ELSE; }))
> ++#else
> ++# define __libc_maybe_call(FUNC, ARGS, ELSE) \
> ++  (FUNC != NULL ? FUNC ARGS : ELSE)
> ++#endif
> ++
> ++/* Call thread functions through the function pointer table.  */
> ++#if defined SHARED && !defined NOT_IN_libc
> ++# define PTFAVAIL(NAME) __libc_pthread_functions_init
> ++# define __libc_ptf_call(FUNC, ARGS, ELSE) \
> ++  (__libc_pthread_functions_init ? PTHFCT_CALL (ptr_##FUNC, ARGS) : ELSE)
> ++# define __libc_ptf_call_always(FUNC, ARGS) \
> ++  PTHFCT_CALL (ptr_##FUNC, ARGS)
> ++#else
> ++# define PTFAVAIL(NAME) (NAME != NULL)
> ++# define __libc_ptf_call(FUNC, ARGS, ELSE) \
> ++  __libc_maybe_call (FUNC, ARGS, ELSE)
> ++# define __libc_ptf_call_always(FUNC, ARGS) \
> ++  FUNC ARGS
> ++#endif
> ++
> ++/* Functions that are used by this file and are internal to the GNU C
> ++   library.  */
> ++
> ++extern int __pthread_mutex_init (pthread_mutex_t *__mutex,
> ++                             const pthread_mutexattr_t *__mutex_attr);
> ++
> ++extern int __pthread_mutex_destroy (pthread_mutex_t *__mutex);
> ++
> ++extern int __pthread_mutex_trylock (pthread_mutex_t *__mutex);
> ++
> ++extern int __pthread_mutex_lock (pthread_mutex_t *__mutex);
> ++
> ++extern int __pthread_mutex_unlock (pthread_mutex_t *__mutex);
> ++
> ++extern int __pthread_mutexattr_init (pthread_mutexattr_t *__attr);
> ++
> ++extern int __pthread_mutexattr_destroy (pthread_mutexattr_t *__attr);
> ++
> ++extern int __pthread_mutexattr_settype (pthread_mutexattr_t *__attr,
> ++                                    int __kind);
> ++
> ++extern int __pthread_rwlock_init (pthread_rwlock_t *__rwlock,
> ++                              const pthread_rwlockattr_t *__attr);
> ++
> ++extern int __pthread_rwlock_destroy (pthread_rwlock_t *__rwlock);
> ++
> ++extern int __pthread_rwlock_rdlock (pthread_rwlock_t *__rwlock);
> ++
> ++extern int __pthread_rwlock_tryrdlock (pthread_rwlock_t *__rwlock);
> ++
> ++extern int __pthread_rwlock_wrlock (pthread_rwlock_t *__rwlock);
> ++
> ++extern int __pthread_rwlock_trywrlock (pthread_rwlock_t *__rwlock);
> ++
> ++extern int __pthread_rwlock_unlock (pthread_rwlock_t *__rwlock);
> ++
> ++extern int __pthread_key_create (pthread_key_t *__key,
> ++                             void (*__destr_function) (void *));
> ++
> ++extern int __pthread_setspecific (pthread_key_t __key,
> ++                              const void *__pointer);
> ++
> ++extern void *__pthread_getspecific (pthread_key_t __key);
> ++
> ++extern int __pthread_once (pthread_once_t *__once_control,
> ++                       void (*__init_routine) (void));
> ++
> ++extern int __pthread_atfork (void (*__prepare) (void),
> ++                         void (*__parent) (void),
> ++                         void (*__child) (void));
> ++
> ++
> ++
> ++/* Make the pthread functions weak so that we can elide them from
> ++   single-threaded processes.  */
> ++#ifndef __NO_WEAK_PTHREAD_ALIASES
> ++# ifdef weak_extern
> ++weak_extern (__pthread_mutex_init)
> ++weak_extern (__pthread_mutex_destroy)
> ++weak_extern (__pthread_mutex_lock)
> ++weak_extern (__pthread_mutex_trylock)
> ++weak_extern (__pthread_mutex_unlock)
> ++weak_extern (__pthread_mutexattr_init)
> ++weak_extern (__pthread_mutexattr_destroy)
> ++weak_extern (__pthread_mutexattr_settype)
> ++weak_extern (__pthread_rwlock_init)
> ++weak_extern (__pthread_rwlock_destroy)
> ++weak_extern (__pthread_rwlock_rdlock)
> ++weak_extern (__pthread_rwlock_tryrdlock)
> ++weak_extern (__pthread_rwlock_wrlock)
> ++weak_extern (__pthread_rwlock_trywrlock)
> ++weak_extern (__pthread_rwlock_unlock)
> ++weak_extern (__pthread_key_create)
> ++weak_extern (__pthread_setspecific)
> ++weak_extern (__pthread_getspecific)
> ++weak_extern (__pthread_once)
> ++weak_extern (__pthread_initialize)
> ++weak_extern (__pthread_atfork)
> ++weak_extern (pthread_setcancelstate)
> ++# else
> ++#  pragma weak __pthread_mutex_init
> ++#  pragma weak __pthread_mutex_destroy
> ++#  pragma weak __pthread_mutex_lock
> ++#  pragma weak __pthread_mutex_trylock
> ++#  pragma weak __pthread_mutex_unlock
> ++#  pragma weak __pthread_mutexattr_init
> ++#  pragma weak __pthread_mutexattr_destroy
> ++#  pragma weak __pthread_mutexattr_settype
> ++#  pragma weak __pthread_rwlock_destroy
> ++#  pragma weak __pthread_rwlock_rdlock
> ++#  pragma weak __pthread_rwlock_tryrdlock
> ++#  pragma weak __pthread_rwlock_wrlock
> ++#  pragma weak __pthread_rwlock_trywrlock
> ++#  pragma weak __pthread_rwlock_unlock
> ++#  pragma weak __pthread_key_create
> ++#  pragma weak __pthread_setspecific
> ++#  pragma weak __pthread_getspecific
> ++#  pragma weak __pthread_once
> ++#  pragma weak __pthread_initialize
> ++#  pragma weak __pthread_atfork
> ++#  pragma weak pthread_setcancelstate
> ++# endif
> ++#endif
> ++
> ++#endif      /* bits/libc-lockP.h */
> +diff --git a/libpthread/sysdeps/pthread/pthread-functions.h 
> b/libpthread/sysdeps/pthread/pthread-functions.h
> +new file mode 100644
> +index 0000000..d236822
> +--- /dev/null
> ++++ b/libpthread/sysdeps/pthread/pthread-functions.h
> +@@ -0,0 +1,141 @@
> ++/* Copyright (C) 2003, 2012 Free Software Foundation, Inc.
> ++   This file is part of the GNU C Library.
> ++   Contributed by Ulrich Drepper <drep...@redhat.com>, 2003.
> ++
> ++   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 _PTHREAD_FUNCTIONS_H
> ++#define _PTHREAD_FUNCTIONS_H        1
> ++
> ++#include <pthread.h>
> ++
> ++int __pthread_attr_destroy (pthread_attr_t *);
> ++int __pthread_attr_init (pthread_attr_t *);
> ++int __pthread_attr_getdetachstate (const pthread_attr_t *, int *);
> ++int __pthread_attr_setdetachstate (pthread_attr_t *, int);
> ++int __pthread_attr_getinheritsched (const pthread_attr_t *, int *);
> ++int __pthread_attr_setinheritsched (pthread_attr_t *, int);
> ++int __pthread_attr_getschedparam (const pthread_attr_t *,
> ++                                     struct sched_param *);
> ++int __pthread_attr_setschedparam (pthread_attr_t *,
> ++                                     const struct sched_param *);
> ++int __pthread_attr_getschedpolicy (const pthread_attr_t *, int *);
> ++int __pthread_attr_setschedpolicy (pthread_attr_t *, int);
> ++int __pthread_attr_getscope (const pthread_attr_t *, int *);
> ++int __pthread_attr_setscope (pthread_attr_t *, int);
> ++int __pthread_condattr_destroy (pthread_condattr_t *);
> ++int __pthread_condattr_init (pthread_condattr_t *);
> ++int __pthread_cond_broadcast (pthread_cond_t *);
> ++int __pthread_cond_destroy (pthread_cond_t *);
> ++int __pthread_cond_init (pthread_cond_t *,
> ++                           const pthread_condattr_t *);
> ++int __pthread_cond_signal (pthread_cond_t *);
> ++int __pthread_cond_wait (pthread_cond_t *, pthread_mutex_t *);
> ++int __pthread_cond_timedwait (pthread_cond_t *, pthread_mutex_t *,
> ++                                 const struct timespec *);
> ++int __pthread_equal (pthread_t, pthread_t);
> ++void __pthread_exit (void *);
> ++int __pthread_getschedparam (pthread_t, int *, struct sched_param *);
> ++int __pthread_setschedparam (pthread_t, int,
> ++                                const struct sched_param *);
> ++int _pthread_mutex_destroy (pthread_mutex_t *);
> ++int _pthread_mutex_init (pthread_mutex_t *,
> ++                             const pthread_mutexattr_t *);
> ++int __pthread_mutex_lock (pthread_mutex_t *);
> ++int __pthread_mutex_trylock (pthread_mutex_t *);
> ++int __pthread_mutex_unlock (pthread_mutex_t *);
> ++pthread_t __pthread_self (void);
> ++int __pthread_setcancelstate (int, int *);
> ++int __pthread_setcanceltype (int, int *);
> ++struct __pthread_cancelation_handler **__pthread_get_cleanup_stack (void);
> ++int __pthread_once (pthread_once_t *, void (*) (void));
> ++int __pthread_rwlock_rdlock (pthread_rwlock_t *);
> ++int __pthread_rwlock_wrlock (pthread_rwlock_t *);
> ++int __pthread_rwlock_unlock (pthread_rwlock_t *);
> ++int __pthread_key_create (pthread_key_t *, void (*) (void *));
> ++void *__pthread_getspecific (pthread_key_t);
> ++int __pthread_setspecific (pthread_key_t, const void *);
> ++
> ++void _cthreads_flockfile (FILE *);
> ++void _cthreads_funlockfile (FILE *);
> ++int _cthreads_ftrylockfile (FILE *);
> ++
> ++/* Data type shared with libc.  The libc uses it to pass on calls to
> ++   the thread functions.  Wine pokes directly into this structure,
> ++   so if possible avoid breaking it and append new hooks to the end.  */
> ++struct pthread_functions
> ++{
> ++  int (*ptr_pthread_attr_destroy) (pthread_attr_t *);
> ++  int (*ptr_pthread_attr_init) (pthread_attr_t *);
> ++  int (*ptr_pthread_attr_getdetachstate) (const pthread_attr_t *, int *);
> ++  int (*ptr_pthread_attr_setdetachstate) (pthread_attr_t *, int);
> ++  int (*ptr_pthread_attr_getinheritsched) (const pthread_attr_t *, int *);
> ++  int (*ptr_pthread_attr_setinheritsched) (pthread_attr_t *, int);
> ++  int (*ptr_pthread_attr_getschedparam) (const pthread_attr_t *,
> ++                                     struct sched_param *);
> ++  int (*ptr_pthread_attr_setschedparam) (pthread_attr_t *,
> ++                                     const struct sched_param *);
> ++  int (*ptr_pthread_attr_getschedpolicy) (const pthread_attr_t *, int *);
> ++  int (*ptr_pthread_attr_setschedpolicy) (pthread_attr_t *, int);
> ++  int (*ptr_pthread_attr_getscope) (const pthread_attr_t *, int *);
> ++  int (*ptr_pthread_attr_setscope) (pthread_attr_t *, int);
> ++  int (*ptr_pthread_condattr_destroy) (pthread_condattr_t *);
> ++  int (*ptr_pthread_condattr_init) (pthread_condattr_t *);
> ++  int (*ptr_pthread_cond_broadcast) (pthread_cond_t *);
> ++  int (*ptr_pthread_cond_destroy) (pthread_cond_t *);
> ++  int (*ptr_pthread_cond_init) (pthread_cond_t *,
> ++                           const pthread_condattr_t *);
> ++  int (*ptr_pthread_cond_signal) (pthread_cond_t *);
> ++  int (*ptr_pthread_cond_wait) (pthread_cond_t *, pthread_mutex_t *);
> ++  int (*ptr_pthread_cond_timedwait) (pthread_cond_t *, pthread_mutex_t *,
> ++                                 const struct timespec *);
> ++  int (*ptr_pthread_equal) (pthread_t, pthread_t);
> ++  void (*ptr_pthread_exit) (void *);
> ++  int (*ptr_pthread_getschedparam) (pthread_t, int *, struct sched_param *);
> ++  int (*ptr_pthread_setschedparam) (pthread_t, int,
> ++                                const struct sched_param *);
> ++  int (*ptr_pthread_mutex_destroy) (pthread_mutex_t *);
> ++  int (*ptr_pthread_mutex_init) (pthread_mutex_t *,
> ++                             const pthread_mutexattr_t *);
> ++  int (*ptr_pthread_mutex_lock) (pthread_mutex_t *);
> ++  int (*ptr_pthread_mutex_trylock) (pthread_mutex_t *);
> ++  int (*ptr_pthread_mutex_unlock) (pthread_mutex_t *);
> ++  pthread_t (*ptr_pthread_self) (void);
> ++  int (*ptr_pthread_setcancelstate) (int, int *);
> ++  int (*ptr_pthread_setcanceltype) (int, int *);
> ++  struct __pthread_cancelation_handler **(*ptr___pthread_get_cleanup_stack) 
> (void);
> ++  int (*ptr_pthread_once) (pthread_once_t *, void (*) (void));
> ++  int (*ptr_pthread_rwlock_rdlock) (pthread_rwlock_t *);
> ++  int (*ptr_pthread_rwlock_wrlock) (pthread_rwlock_t *);
> ++  int (*ptr_pthread_rwlock_unlock) (pthread_rwlock_t *);
> ++  int (*ptr_pthread_key_create) (pthread_key_t *, void (*) (void *));
> ++  void *(*ptr_pthread_getspecific) (pthread_key_t);
> ++  int (*ptr_pthread_setspecific) (pthread_key_t, const void *);
> ++  void (*ptr__IO_flockfile) (FILE *);
> ++  void (*ptr__IO_funlockfile) (FILE *);
> ++  int (*ptr__IO_ftrylockfile) (FILE *);
> ++};
> ++
> ++/* Variable in libc.so.  */
> ++extern struct pthread_functions __libc_pthread_functions attribute_hidden;
> ++extern int __libc_pthread_functions_init attribute_hidden;
> ++
> ++void __libc_pthread_init (const struct pthread_functions *functions);
> ++
> ++# define PTHFCT_CALL(fct, params) \
> ++    __libc_pthread_functions.fct params
> ++
> ++#endif      /* pthread-functions.h */
> diff -Nru glibc-2.19/debian/patches/hurd-i386/cvs-libpthread-libc-lockP.diff 
> glibc-2.19/debian/patches/hurd-i386/cvs-libpthread-libc-lockP.diff
> --- glibc-2.19/debian/patches/hurd-i386/cvs-libpthread-libc-lockP.diff        
> 1970-01-01 01:00:00.000000000 +0100
> +++ glibc-2.19/debian/patches/hurd-i386/cvs-libpthread-libc-lockP.diff        
> 2015-03-08 12:01:33.000000000 +0100
> @@ -0,0 +1,24 @@
> +commit 9f95dc5d227c5a155d39208dfd15aacaa509b59b
> +Author: Samuel Thibault <samuel.thiba...@ens-lyon.org>
> +Date:   Sun Mar 8 11:26:57 2015 +0100
> +
> +    hurd: Make libc able to call pthread stubs
> +    
> +     * sysdeps/mach/hurd/bits/libc-lock.h [_LIBC]: Include
> +     <bits/libc-lockP.h>
> +
> +diff --git a/sysdeps/mach/hurd/bits/libc-lock.h 
> b/sysdeps/mach/hurd/bits/libc-lock.h
> +index 24c3aa8..63d3e81 100644
> +--- a/sysdeps/mach/hurd/bits/libc-lock.h
> ++++ b/sysdeps/mach/hurd/bits/libc-lock.h
> +@@ -203,4 +203,10 @@ void *__libc_getspecific (__libc_key_t key);
> + 
> + #endif /* _CTHREADS_ */
> + 
> ++/* Hide the definitions which are only supposed to be used inside libc in
> ++   a separate file.  This file is not present in the installation!  */
> ++#ifdef _LIBC
> ++# include <bits/libc-lockP.h>
> ++#endif
> ++
> + #endif      /* bits/libc-lock.h */
> diff -Nru glibc-2.19/debian/patches/series glibc-2.19/debian/patches/series
> --- glibc-2.19/debian/patches/series  2015-02-08 15:54:30.000000000 +0100
> +++ glibc-2.19/debian/patches/series  2015-03-12 20:09:12.000000000 +0100
> @@ -155,6 +155,9 @@
>  hurd-i386/tg-WRLCK-upgrade.diff
>  hurd-i386/cvs-static-dlopen.diff
>  hurd-i386/tg-reboot-startup.diff
> +hurd-i386/cvs-libpthread-dlopen.diff
> +hurd-i386/cvs-libpthread-libc-lockP.diff
> +hurd-i386/cvs-libpthread-libc-lockP2.diff
>  
>  i386/local-biarch.diff
>  i386/local-cmov.diff
> @@ -268,3 +271,4 @@
>  any/cvs-getnetbyname.diff
>  any/cvs-vfprintf.diff
>  any/cvs-wscanf.diff
> +any/cvs-ldconfig-aux-cache.diff
> diff -Nru glibc-2.19/debian/rules glibc-2.19/debian/rules
> --- glibc-2.19/debian/rules   2014-10-17 09:43:19.000000000 +0200
> +++ glibc-2.19/debian/rules   2015-03-08 22:29:32.000000000 +0100
> @@ -36,9 +36,6 @@
>  include debian/shlibver
>  shlib_dep = $(libc) (>= $(shlib_dep_ver))
>  
> -# The version of the C library that locales needs for its format.
> -include debian/locales-depver
> -
>  # Beyond here you shouldn't need to customise anything:
>  export SHELL          = /bin/bash -e
>  
> diff -Nru glibc-2.19/debian/rules.d/debhelper.mk 
> glibc-2.19/debian/rules.d/debhelper.mk
> --- glibc-2.19/debian/rules.d/debhelper.mk    2014-10-17 09:43:19.000000000 
> +0200
> +++ glibc-2.19/debian/rules.d/debhelper.mk    2015-03-13 21:14:08.000000000 
> +0100
> @@ -178,8 +178,7 @@
>       perl -i -pe 'BEGIN {undef $$/; open(IN, 
> "debian/tmp-libc/usr/share/i18n/SUPPORTED"); $$j=<IN>;} 
> s/__PROVIDED_LOCALES__/$$j/g;' debian/locales.config debian/locales.postinst
>  
>       # Generate common substvars files.
> -     echo "locale:Depends=$(shell perl debian/debver2localesdep.pl 
> $(LOCALES_DEP_VER))" > tmp.substvars
> -     echo "locale-compat:Depends=$(shell perl debian/debver2localesdep.pl 
> $(LOCALES_COMPAT_VER))" >> tmp.substvars
> +     : > tmp.substvars
>  ifeq ($(filter stage2,$(DEB_BUILD_PROFILES)),)
>       echo 'libgcc:Depends=libgcc1 [!hppa !m68k], libgcc2 [m68k], libgcc4 
> [hppa]' >> tmp.substvars
>  endif
> 
> [...]


-- 
To UNSUBSCRIBE, email to debian-release-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: https://lists.debian.org/550438c7.3040...@thykier.net

Reply via email to