r6368 - in glibc-package/trunk/debian: . patches patches/hurd-i386
Author: sthibault
Date: 2015-03-02 00:09:49 +0000 (Mon, 02 Mar 2015)
New Revision: 6368
Added:
glibc-package/trunk/debian/patches/hurd-i386/cvs-libpthread-functions.diff
Modified:
glibc-package/trunk/debian/changelog
glibc-package/trunk/debian/patches/hurd-i386/cvs-libpthread-dlopen.diff
glibc-package/trunk/debian/patches/series
Log:
* patches/hurd-i386/cvs-libpthread-dlopen.diff: Add fixes for lockfile.
* patches/hurd-i386/cvs-libpthread-functions.diff: New patch to dynamically
call pthread functions from libc.
Modified: glibc-package/trunk/debian/changelog
===================================================================
--- glibc-package/trunk/debian/changelog 2015-02-28 23:37:34 UTC (rev 6367)
+++ glibc-package/trunk/debian/changelog 2015-03-02 00:09:49 UTC (rev 6368)
@@ -3,6 +3,8 @@
[ 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-functions.diff: New patch to dynamically
+ call pthread functions from libc.
-- Aurelien Jarno <aurel32@debian.org> Sun, 08 Feb 2015 17:21:50 +0100
Modified: glibc-package/trunk/debian/patches/hurd-i386/cvs-libpthread-dlopen.diff
===================================================================
--- glibc-package/trunk/debian/patches/hurd-i386/cvs-libpthread-dlopen.diff 2015-02-28 23:37:34 UTC (rev 6367)
+++ glibc-package/trunk/debian/patches/hurd-i386/cvs-libpthread-dlopen.diff 2015-03-02 00:09:49 UTC (rev 6368)
@@ -101,3 +101,397 @@
+ _init_routine (__libc_stack_end);
+}
+#endif
+
+commit 8dc97a5e7ca62b98aba02883724fd58a91f9a32e
+Author: Samuel Thibault <samuel.thibault@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 <drepper@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
++}
++strong_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 <drepper@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
++}
++strong_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 <drepper@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
++}
++strong_alias (__funlockfile, _IO_funlockfile)
++weak_alias (__funlockfile, funlockfile)
Added: glibc-package/trunk/debian/patches/hurd-i386/cvs-libpthread-functions.diff
===================================================================
--- glibc-package/trunk/debian/patches/hurd-i386/cvs-libpthread-functions.diff (rev 0)
+++ glibc-package/trunk/debian/patches/hurd-i386/cvs-libpthread-functions.diff 2015-03-02 00:09:49 UTC (rev 6368)
@@ -0,0 +1,182 @@
+From: Samuel Thibault <samuel.thibault@ens-lyon.org>
+Subject: [PATCH] hurd: Make libc able to call pthread stubs
+
+* sysdeps/mach/hurd/bits/libc-lock.h: Include
+<pthread/pthread-functions.h>
+(__libc_maybe_call, PTFAVAIL, __libc_ptf_call, __libc_ptf_call_always):
+New macros.
+(__pthread_mutex_init, __pthread_mutex_destroy, __pthread_mutex_trylock,
+__pthread_mutex_lock, __pthread_mutex_unlock, __pthread_mutexattr_init,
+__pthread_mutexattr_destroy, __pthread_mutexattr_settype,
+__pthread_rwlock_init, __pthread_rwlock_destroy,
+__pthread_rwlock_rdlock, __pthread_rwlock_tryrdlock,
+__pthread_rwlock_wrlock, __pthread_rwlock_trywrlock,
+__pthread_rwlock_unlock, __pthread_key_create, __pthread_setspecific,
+__pthread_getspecific, __pthread_once, __pthread_atfork): New
+declarations and weak references.
+
+Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
+
+---
+ sysdeps/mach/hurd/bits/libc-lock.h | 134 +++++++++++++++++++++++++++++++++++++
+ 1 file changed, 134 insertions(+)
+
+diff --git a/sysdeps/mach/hurd/bits/libc-lock.h b/sysdeps/mach/hurd/bits/libc-lock.h
+index c53fe87..38befc9 100644
+--- a/sysdeps/mach/hurd/bits/libc-lock.h
++++ b/sysdeps/mach/hurd/bits/libc-lock.h
+@@ -24,6 +24,7 @@
+ #include <tls.h>
+ #endif
+ #include <cthreads.h>
++#include <pthread/pthread-functions.h>
+
+ typedef struct mutex __libc_lock_t;
+ typedef struct
+@@ -46,6 +47,35 @@ typedef struct __libc_lock_opaque__ __libc_lock_t;
+ typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t;
+ #endif
+
++/* 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
++
+ /* Define a lock variable NAME with storage class CLASS. The lock must be
+ initialized with __libc_lock_init before it can be used (or define it
+ with __libc_lock_define_initialized, below). Use `extern' for CLASS to
+@@ -210,4 +240,108 @@ void *__libc_getspecific (__libc_key_t key);
+
+ #endif /* _CTHREADS_ */
+
++/* 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-lock.h */
+--
+tg: (d7e5ff9..) t/pthread_functions (depends on: t/tls-threadvar)
Modified: glibc-package/trunk/debian/patches/series
===================================================================
--- glibc-package/trunk/debian/patches/series 2015-02-28 23:37:34 UTC (rev 6367)
+++ glibc-package/trunk/debian/patches/series 2015-03-02 00:09:49 UTC (rev 6368)
@@ -156,6 +156,7 @@
hurd-i386/cvs-static-dlopen.diff
hurd-i386/tg-reboot-startup.diff
hurd-i386/cvs-libpthread-dlopen.diff
+hurd-i386/cvs-libpthread-functions.diff
i386/local-biarch.diff
i386/local-cmov.diff
Reply to: