Module Name: src
Committed By: riz
Date: Mon Apr 29 01:50:20 UTC 2013
Modified Files:
src/lib/libc/include [netbsd-6]: reentrant.h
src/lib/libc/thread-stub [netbsd-6]: thread-stub.c
src/lib/libpthread [netbsd-6]: Makefile pthread.c pthread_cancelstub.c
pthread_cond.c pthread_int.h pthread_misc.c pthread_mutex.c
pthread_rwlock.c pthread_specific.c pthread_tsd.c
Log Message:
Pull up following revision(s) (requested by manu in ticket #869):
lib/libpthread/pthread_rwlock.c: revision 1.33
lib/libc/include/reentrant.h: revision 1.16
lib/libpthread/pthread_cond.c: revision 1.59
lib/libpthread/pthread_misc.c: revision 1.15
lib/libc/thread-stub/thread-stub.c: revision 1.23
lib/libpthread/pthread_cancelstub.c: revision 1.38
lib/libpthread/pthread_specific.c: revision 1.26
lib/libpthread/pthread_mutex.c: revision 1.56
lib/libpthread/pthread_tsd.c: revision 1.11
lib/libpthread/Makefile: revision 1.80
lib/libpthread/pthread.c: revision 1.143
lib/libpthread/pthread_int.h: revision 1.89
- Allow libpthread to be dlopened again, by providing libc stubs to
libpthread.
- Fail if the dlopened libpthread does pthread_create(). From manu@
- Discussed at length in the mailing lists; approved by core@
- This was chosen as the least intrusive patch that will provide
the necessary functionality.
XXX: pullup to 6
To generate a diff of this commit:
cvs rdiff -u -r1.14.10.1 -r1.14.10.2 src/lib/libc/include/reentrant.h
cvs rdiff -u -r1.22 -r1.22.4.1 src/lib/libc/thread-stub/thread-stub.c
cvs rdiff -u -r1.73 -r1.73.2.1 src/lib/libpthread/Makefile
cvs rdiff -u -r1.125.4.2 -r1.125.4.3 src/lib/libpthread/pthread.c
cvs rdiff -u -r1.35.6.1 -r1.35.6.2 src/lib/libpthread/pthread_cancelstub.c
cvs rdiff -u -r1.56.8.2 -r1.56.8.3 src/lib/libpthread/pthread_cond.c
cvs rdiff -u -r1.82.2.2 -r1.82.2.3 src/lib/libpthread/pthread_int.h
cvs rdiff -u -r1.14 -r1.14.8.1 src/lib/libpthread/pthread_misc.c
cvs rdiff -u -r1.51 -r1.51.22.1 src/lib/libpthread/pthread_mutex.c
cvs rdiff -u -r1.32 -r1.32.22.1 src/lib/libpthread/pthread_rwlock.c
cvs rdiff -u -r1.21.22.2 -r1.21.22.3 src/lib/libpthread/pthread_specific.c
cvs rdiff -u -r1.7.24.2 -r1.7.24.3 src/lib/libpthread/pthread_tsd.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libc/include/reentrant.h
diff -u src/lib/libc/include/reentrant.h:1.14.10.1 src/lib/libc/include/reentrant.h:1.14.10.2
--- src/lib/libc/include/reentrant.h:1.14.10.1 Sat Jun 23 22:54:55 2012
+++ src/lib/libc/include/reentrant.h Mon Apr 29 01:50:20 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: reentrant.h,v 1.14.10.1 2012/06/23 22:54:55 riz Exp $ */
+/* $NetBSD: reentrant.h,v 1.14.10.2 2013/04/29 01:50:20 riz Exp $ */
/*-
* Copyright (c) 1997, 1998, 2003 The NetBSD Foundation, Inc.
@@ -221,6 +221,56 @@ __END_DECLS
#define thr_enabled() (__isthreaded)
#define thr_setcancelstate(n, o) __libc_thr_setcancelstate((n),(o))
#define thr_curcpu() __libc_thr_curcpu()
+
+#else /* __LIBC_THREAD_STUBS */
+
+__BEGIN_DECLS
+void __libc_thr_init_stub(void);
+
+int __libc_mutex_init_stub(mutex_t *, const mutexattr_t *);
+int __libc_mutex_lock_stub(mutex_t *);
+int __libc_mutex_trylock_stub(mutex_t *);
+int __libc_mutex_unlock_stub(mutex_t *);
+int __libc_mutex_destroy_stub(mutex_t *);
+
+int __libc_mutexattr_init_stub(mutexattr_t *);
+int __libc_mutexattr_destroy_stub(mutexattr_t *);
+int __libc_mutexattr_settype_stub(mutexattr_t *, int);
+
+int __libc_cond_init_stub(cond_t *, const condattr_t *);
+int __libc_cond_signal_stub(cond_t *);
+int __libc_cond_broadcast_stub(cond_t *);
+int __libc_cond_wait_stub(cond_t *, mutex_t *);
+int __libc_cond_timedwait_stub(cond_t *, mutex_t *,
+ const struct timespec *);
+int __libc_cond_destroy_stub(cond_t *);
+
+int __libc_rwlock_init_stub(rwlock_t *, const rwlockattr_t *);
+int __libc_rwlock_rdlock_stub(rwlock_t *);
+int __libc_rwlock_wrlock_stub(rwlock_t *);
+int __libc_rwlock_tryrdlock_stub(rwlock_t *);
+int __libc_rwlock_trywrlock_stub(rwlock_t *);
+int __libc_rwlock_unlock_stub(rwlock_t *);
+int __libc_rwlock_destroy_stub(rwlock_t *);
+
+int __libc_thr_keycreate_stub(thread_key_t *, void (*)(void *));
+int __libc_thr_setspecific_stub(thread_key_t, const void *);
+void *__libc_thr_getspecific_stub(thread_key_t);
+int __libc_thr_keydelete_stub(thread_key_t);
+
+int __libc_thr_once_stub(once_t *, void (*)(void));
+int __libc_thr_sigsetmask_stub(int, const sigset_t *, sigset_t *);
+thr_t __libc_thr_self_stub(void);
+int __libc_thr_yield_stub(void);
+int __libc_thr_create_stub(thr_t *, const thrattr_t *,
+ void *(*)(void *), void *);
+void __libc_thr_exit_stub(void *);
+int *__libc_thr_errno_stub(void);
+int __libc_thr_setcancelstate_stub(int, int *);
+int __libc_thr_equal_stub(pthread_t, pthread_t);
+unsigned int __libc_thr_curcpu_stub(void);
+__END_DECLS
+
#endif /* __LIBC_THREAD_STUBS */
#define FLOCKFILE(fp) __flockfile_internal(fp, 1)
Index: src/lib/libc/thread-stub/thread-stub.c
diff -u src/lib/libc/thread-stub/thread-stub.c:1.22 src/lib/libc/thread-stub/thread-stub.c:1.22.4.1
--- src/lib/libc/thread-stub/thread-stub.c:1.22 Fri Sep 16 16:05:59 2011
+++ src/lib/libc/thread-stub/thread-stub.c Mon Apr 29 01:50:20 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: thread-stub.c,v 1.22 2011/09/16 16:05:59 joerg Exp $ */
+/* $NetBSD: thread-stub.c,v 1.22.4.1 2013/04/29 01:50:20 riz Exp $ */
/*-
* Copyright (c) 2003, 2009 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: thread-stub.c,v 1.22 2011/09/16 16:05:59 joerg Exp $");
+__RCSID("$NetBSD: thread-stub.c,v 1.22.4.1 2013/04/29 01:50:20 riz Exp $");
#endif /* LIBC_SCCS and not lint */
/*
@@ -69,9 +69,6 @@ do { \
/* libpthread init */
-void __libc_thr_init(void);
-void __libc_thr_init_stub(void);
-
__weak_alias(__libc_thr_init,__libc_thr_init_stub)
void
@@ -83,8 +80,7 @@ __libc_thr_init_stub(void)
/* mutexes */
-int __libc_mutex_init_stub(mutex_t *, const mutexattr_t *);
-int __libc_mutex_catchall_stub(mutex_t *);
+int __libc_mutex_catchall_stub(mutex_t *);
__weak_alias(__libc_mutex_init,__libc_mutex_init_stub)
__weak_alias(__libc_mutex_lock,__libc_mutex_catchall_stub)
@@ -92,13 +88,20 @@ __weak_alias(__libc_mutex_trylock,__libc
__weak_alias(__libc_mutex_unlock,__libc_mutex_catchall_stub)
__weak_alias(__libc_mutex_destroy,__libc_mutex_catchall_stub)
-int __libc_mutexattr_catchall_stub(mutexattr_t *);
-int __libc_mutexattr_settype_stub(mutexattr_t *, int);
+__strong_alias(__libc_mutex_lock_stub,__libc_mutex_catchall_stub)
+__strong_alias(__libc_mutex_trylock_stub,__libc_mutex_catchall_stub)
+__strong_alias(__libc_mutex_unlock_stub,__libc_mutex_catchall_stub)
+__strong_alias(__libc_mutex_destroy_stub,__libc_mutex_catchall_stub)
+
+int __libc_mutexattr_catchall_stub(mutexattr_t *);
__weak_alias(__libc_mutexattr_init,__libc_mutexattr_catchall_stub)
__weak_alias(__libc_mutexattr_destroy,__libc_mutexattr_catchall_stub)
__weak_alias(__libc_mutexattr_settype,__libc_mutexattr_settype_stub)
+__strong_alias(__libc_mutexattr_init_stub,__libc_mutexattr_catchall_stub)
+__strong_alias(__libc_mutexattr_destroy_stub,__libc_mutexattr_catchall_stub)
+
int
__libc_mutex_init_stub(mutex_t *m, const mutexattr_t *a)
{
@@ -147,11 +150,7 @@ __libc_mutexattr_catchall_stub(mutexattr
/* condition variables */
-int __libc_cond_init_stub(cond_t *, const condattr_t *);
-int __libc_cond_wait_stub(cond_t *, mutex_t *);
-int __libc_cond_timedwait_stub(cond_t *, mutex_t *,
- const struct timespec *);
-int __libc_cond_catchall_stub(cond_t *);
+int __libc_cond_catchall_stub(cond_t *);
__weak_alias(__libc_cond_init,__libc_cond_init_stub)
__weak_alias(__libc_cond_signal,__libc_cond_catchall_stub)
@@ -160,6 +159,11 @@ __weak_alias(__libc_cond_wait,__libc_con
__weak_alias(__libc_cond_timedwait,__libc_cond_timedwait_stub)
__weak_alias(__libc_cond_destroy,__libc_cond_catchall_stub)
+__strong_alias(__libc_cond_signal_stub,__libc_cond_catchall_stub)
+__strong_alias(__libc_cond_broadcast_stub,__libc_cond_catchall_stub)
+__strong_alias(__libc_cond_wait_stub,__libc_cond_catchall_stub)
+__strong_alias(__libc_cond_destroy_stub,__libc_cond_catchall_stub)
+
int
__libc_cond_init_stub(cond_t *c, const condattr_t *a)
{
@@ -215,8 +219,7 @@ __libc_cond_catchall_stub(cond_t *c)
/* read-write locks */
-int __libc_rwlock_init_stub(rwlock_t *, rwlockattr_t *);
-int __libc_rwlock_catchall_stub(rwlock_t *);
+int __libc_rwlock_catchall_stub(rwlock_t *);
__weak_alias(__libc_rwlock_init,__libc_rwlock_init_stub)
__weak_alias(__libc_rwlock_rdlock,__libc_rwlock_catchall_stub)
@@ -226,8 +229,16 @@ __weak_alias(__libc_rwlock_trywrlock,__l
__weak_alias(__libc_rwlock_unlock,__libc_rwlock_catchall_stub)
__weak_alias(__libc_rwlock_destroy,__libc_rwlock_catchall_stub)
+__strong_alias(__libc_rwlock_rdlock_stub,__libc_rwlock_catchall_stub)
+__strong_alias(__libc_rwlock_wrlock_stub,__libc_rwlock_catchall_stub)
+__strong_alias(__libc_rwlock_tryrdlock_stub,__libc_rwlock_catchall_stub)
+__strong_alias(__libc_rwlock_trywrlock_stub,__libc_rwlock_catchall_stub)
+__strong_alias(__libc_rwlock_unlock_stub,__libc_rwlock_catchall_stub)
+__strong_alias(__libc_rwlock_destroy_stub,__libc_rwlock_catchall_stub)
+
+
int
-__libc_rwlock_init_stub(rwlock_t *l, rwlockattr_t *a)
+__libc_rwlock_init_stub(rwlock_t *l, const rwlockattr_t *a)
{
/* LINTED deliberate lack of effect */
(void)l;
@@ -265,11 +276,6 @@ static struct {
} __libc_tsd[TSD_KEYS_MAX];
static int __libc_tsd_nextkey;
-int __libc_thr_keycreate_stub(thread_key_t *, void (*)(void *));
-int __libc_thr_setspecific_stub(thread_key_t, const void *);
-void *__libc_thr_getspecific_stub(thread_key_t);
-int __libc_thr_keydelete_stub(thread_key_t);
-
__weak_alias(__libc_thr_keycreate,__libc_thr_keycreate_stub)
__weak_alias(__libc_thr_setspecific,__libc_thr_setspecific_stub)
__weak_alias(__libc_thr_getspecific,__libc_thr_getspecific_stub)
@@ -337,18 +343,6 @@ __libc_thr_keydelete_stub(thread_key_t k
/* misc. */
-int __libc_thr_once_stub(once_t *, void (*)(void));
-int __libc_thr_sigsetmask_stub(int, const sigset_t *, sigset_t *);
-thr_t __libc_thr_self_stub(void);
-int __libc_thr_yield_stub(void);
-int __libc_thr_create_stub(thr_t *, const thrattr_t *,
- void *(*)(void *), void *);
-__dead void __libc_thr_exit_stub(void *);
-int *__libc_thr_errno_stub(void);
-int __libc_thr_setcancelstate_stub(int, int *);
-int __libc_thr_equal_stub(pthread_t, pthread_t);
-unsigned int __libc_thr_curcpu_stub(void);
-
__weak_alias(__libc_thr_once,__libc_thr_once_stub)
__weak_alias(__libc_thr_sigsetmask,__libc_thr_sigsetmask_stub)
__weak_alias(__libc_thr_self,__libc_thr_self_stub)
Index: src/lib/libpthread/Makefile
diff -u src/lib/libpthread/Makefile:1.73 src/lib/libpthread/Makefile:1.73.2.1
--- src/lib/libpthread/Makefile:1.73 Thu Nov 10 14:01:11 2011
+++ src/lib/libpthread/Makefile Mon Apr 29 01:50:19 2013
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.73 2011/11/10 14:01:11 yamt Exp $
+# $NetBSD: Makefile,v 1.73.2.1 2013/04/29 01:50:19 riz Exp $
#
WARNS= 4
@@ -25,16 +25,15 @@ INCSDIR=/usr/include
ARCHDIR= ${.CURDIR}/arch/${ARCHSUBDIR}
.PATH: ${ARCHDIR}
-CPPFLAGS+= -I${ARCHDIR} -I${.CURDIR} -I${.OBJDIR} -D_LIBC
-CPPFLAGS+= -D__LIBPTHREAD_SOURCE__
+CPPFLAGS+= -I${ARCHDIR} -I${.CURDIR} -I${.OBJDIR} -D_LIBC -D_REENTRANT
+CPPFLAGS+= -I${.CURDIR}/../libc/include
+CPPFLAGS+= -D__LIBPTHREAD_SOURCE__ -D__LIBC_THREAD_STUBS
# XXX: This crappy poke at libc's internals needs to be fixed.
CPPFLAGS+=-I${NETBSDSRCDIR}/sys -I${.CURDIR}/../libc
LIB= pthread
-LDFLAGS+= -Wl,-znodlopen
-
#
# NOTE: When you create a new file for libpthread, make sure that pthread.c
# gets a reference to a symbol in that file. Otherwise, Unix's stupid static
Index: src/lib/libpthread/pthread.c
diff -u src/lib/libpthread/pthread.c:1.125.4.2 src/lib/libpthread/pthread.c:1.125.4.3
--- src/lib/libpthread/pthread.c:1.125.4.2 Mon Dec 3 19:07:26 2012
+++ src/lib/libpthread/pthread.c Mon Apr 29 01:50:19 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pthread.c,v 1.125.4.2 2012/12/03 19:07:26 jdc Exp $ */
+/* $NetBSD: pthread.c,v 1.125.4.3 2013/04/29 01:50:19 riz Exp $ */
/*-
* Copyright (c) 2001, 2002, 2003, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread.c,v 1.125.4.2 2012/12/03 19:07:26 jdc Exp $");
+__RCSID("$NetBSD: pthread.c,v 1.125.4.3 2013/04/29 01:50:19 riz Exp $");
#define __EXPOSE_STACK 1
@@ -54,6 +54,7 @@ __RCSID("$NetBSD: pthread.c,v 1.125.4.2
#include "pthread.h"
#include "pthread_int.h"
+#include "reentrant.h"
pthread_rwlock_t pthread__alltree_lock = PTHREAD_RWLOCK_INITIALIZER;
RB_HEAD(__pthread__alltree, __pthread_st) pthread__alltree;
@@ -77,6 +78,7 @@ static void pthread__start(void);
void pthread__init(void);
int pthread__started;
+int __uselibcstub = 1;
pthread_mutex_t pthread__deadqueue_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_queue_t pthread__deadqueue;
pthread_queue_t pthread__allqueue;
@@ -161,6 +163,8 @@ pthread__init(void)
size_t len;
extern int __isthreaded;
+ __uselibcstub = 0;
+
mib[0] = CTL_HW;
mib[1] = HW_NCPU;
@@ -328,6 +332,12 @@ pthread_create(pthread_t *thread, const
void *private_area;
int ret;
+ if (__predict_false(__uselibcstub)) {
+ pthread__errorfunc(__FILE__, __LINE__, __func__,
+ "pthread_create() requires linking with -lpthread");
+ return __libc_thr_create_stub(thread, attr, startfunc, arg);
+ }
+
/*
* It's okay to check this without a lock because there can
* only be one thread before it becomes true.
@@ -528,6 +538,11 @@ pthread_exit(void *retval)
struct pt_clean_t *cleanup;
char *name;
+ if (__predict_false(__uselibcstub)) {
+ __libc_thr_exit_stub(retval);
+ goto out;
+ }
+
self = pthread__self();
/* Disable cancellability. */
@@ -570,6 +585,7 @@ pthread_exit(void *retval)
_lwp_exit();
}
+out:
/*NOTREACHED*/
pthread__abort();
exit(1);
@@ -647,6 +663,8 @@ pthread__reap(pthread_t thread)
int
pthread_equal(pthread_t t1, pthread_t t2)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_thr_equal_stub(t1, t2);
/* Nothing special here. */
return (t1 == t2);
@@ -746,6 +764,8 @@ pthread_setname_np(pthread_t thread, con
pthread_t
pthread_self(void)
{
+ if (__predict_false(__uselibcstub))
+ return (pthread_t)__libc_thr_self_stub();
return pthread__self();
}
@@ -776,6 +796,9 @@ pthread_setcancelstate(int state, int *o
pthread_t self;
int retval;
+ if (__predict_false(__uselibcstub))
+ return __libc_thr_setcancelstate_stub(state, oldstate);
+
self = pthread__self();
retval = 0;
@@ -948,6 +971,12 @@ pthread__errno(void)
{
pthread_t self;
+ if (__predict_false(__uselibcstub)) {
+ pthread__errorfunc(__FILE__, __LINE__, __func__,
+ "pthread__errno() requires linking with -lpthread");
+ return __libc_thr_errno_stub();
+ }
+
self = pthread__self();
return &(self->pt_errno);
Index: src/lib/libpthread/pthread_cancelstub.c
diff -u src/lib/libpthread/pthread_cancelstub.c:1.35.6.1 src/lib/libpthread/pthread_cancelstub.c:1.35.6.2
--- src/lib/libpthread/pthread_cancelstub.c:1.35.6.1 Mon Apr 9 18:15:27 2012
+++ src/lib/libpthread/pthread_cancelstub.c Mon Apr 29 01:50:18 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pthread_cancelstub.c,v 1.35.6.1 2012/04/09 18:15:27 riz Exp $ */
+/* $NetBSD: pthread_cancelstub.c,v 1.35.6.2 2013/04/29 01:50:18 riz Exp $ */
/*-
* Copyright (c) 2002, 2007 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
#undef _FORTIFY_SOURCE
#include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread_cancelstub.c,v 1.35.6.1 2012/04/09 18:15:27 riz Exp $");
+__RCSID("$NetBSD: pthread_cancelstub.c,v 1.35.6.2 2013/04/29 01:50:18 riz Exp $");
#ifndef lint
@@ -81,6 +81,7 @@ __RCSID("$NetBSD: pthread_cancelstub.c,v
#include "pthread.h"
#include "pthread_int.h"
+#include "reentrant.h"
int pthread__cancel_stub_binder;
@@ -128,7 +129,8 @@ int ____sigtimedwait50(const sigset_t *
int __sigsuspend14(const sigset_t *);
#define TESTCANCEL(id) do { \
- if (__predict_false((id)->pt_cancel)) \
+ if (__predict_true(!__uselibcstub) && \
+ __predict_false((id)->pt_cancel)) \
pthread__cancelled(); \
} while (/*CONSTCOND*/0)
Index: src/lib/libpthread/pthread_cond.c
diff -u src/lib/libpthread/pthread_cond.c:1.56.8.2 src/lib/libpthread/pthread_cond.c:1.56.8.3
--- src/lib/libpthread/pthread_cond.c:1.56.8.2 Sat Apr 20 15:14:07 2013
+++ src/lib/libpthread/pthread_cond.c Mon Apr 29 01:50:18 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pthread_cond.c,v 1.56.8.2 2013/04/20 15:14:07 bouyer Exp $ */
+/* $NetBSD: pthread_cond.c,v 1.56.8.3 2013/04/29 01:50:18 riz Exp $ */
/*-
* Copyright (c) 2001, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -46,7 +46,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread_cond.c,v 1.56.8.2 2013/04/20 15:14:07 bouyer Exp $");
+__RCSID("$NetBSD: pthread_cond.c,v 1.56.8.3 2013/04/29 01:50:18 riz Exp $");
#include <errno.h>
#include <sys/time.h>
@@ -55,6 +55,7 @@ __RCSID("$NetBSD: pthread_cond.c,v 1.56.
#include "pthread.h"
#include "pthread_int.h"
+#include "reentrant.h"
int _sys___nanosleep50(const struct timespec *, struct timespec *);
@@ -84,6 +85,8 @@ pthread_cond_getclock(const pthread_cond
int
pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_cond_init_stub(cond, attr);
pthread__error(EINVAL, "Invalid condition variable attribute",
(attr == NULL) || (attr->ptca_magic == _PT_CONDATTR_MAGIC));
@@ -108,6 +111,8 @@ pthread_cond_init(pthread_cond_t *cond,
int
pthread_cond_destroy(pthread_cond_t *cond)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_cond_destroy_stub(cond);
pthread__error(EINVAL, "Invalid condition variable",
cond->ptc_magic == _PT_COND_MAGIC);
@@ -220,6 +225,8 @@ pthread_cond_timedwait(pthread_cond_t *c
int
pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_cond_wait_stub(cond, mutex);
return pthread_cond_timedwait(cond, mutex, NULL);
}
@@ -284,6 +291,9 @@ int
pthread_cond_signal(pthread_cond_t *cond)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_cond_signal_stub(cond);
+
if (__predict_true(PTQ_EMPTY(&cond->ptc_waiters)))
return 0;
return pthread__cond_wake_one(cond);
@@ -331,6 +341,8 @@ pthread__cond_wake_all(pthread_cond_t *c
int
pthread_cond_broadcast(pthread_cond_t *cond)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_cond_broadcast_stub(cond);
if (__predict_true(PTQ_EMPTY(&cond->ptc_waiters)))
return 0;
Index: src/lib/libpthread/pthread_int.h
diff -u src/lib/libpthread/pthread_int.h:1.82.2.2 src/lib/libpthread/pthread_int.h:1.82.2.3
--- src/lib/libpthread/pthread_int.h:1.82.2.2 Sun Dec 2 18:47:36 2012
+++ src/lib/libpthread/pthread_int.h Mon Apr 29 01:50:19 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pthread_int.h,v 1.82.2.2 2012/12/02 18:47:36 riz Exp $ */
+/* $NetBSD: pthread_int.h,v 1.82.2.3 2013/04/29 01:50:19 riz Exp $ */
/*-
* Copyright (c) 2001, 2002, 2003, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -184,6 +184,8 @@ extern int pthread__concurrency;
extern int pthread__osrev;
extern int pthread__unpark_max;
+extern int __uselibcstub;
+
/* Flag to be used in a ucontext_t's uc_flags indicating that
* the saved register state is "user" state only, not full
* trap state.
Index: src/lib/libpthread/pthread_misc.c
diff -u src/lib/libpthread/pthread_misc.c:1.14 src/lib/libpthread/pthread_misc.c:1.14.8.1
--- src/lib/libpthread/pthread_misc.c:1.14 Wed Aug 12 23:51:23 2009
+++ src/lib/libpthread/pthread_misc.c Mon Apr 29 01:50:18 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pthread_misc.c,v 1.14 2009/08/12 23:51:23 enami Exp $ */
+/* $NetBSD: pthread_misc.c,v 1.14.8.1 2013/04/29 01:50:18 riz Exp $ */
/*-
* Copyright (c) 2001, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread_misc.c,v 1.14 2009/08/12 23:51:23 enami Exp $");
+__RCSID("$NetBSD: pthread_misc.c,v 1.14.8.1 2013/04/29 01:50:18 riz Exp $");
#include <errno.h>
#include <string.h>
@@ -46,6 +46,7 @@ __RCSID("$NetBSD: pthread_misc.c,v 1.14
#include "pthread.h"
#include "pthread_int.h"
+#include "reentrant.h"
int pthread__sched_yield(void);
@@ -142,7 +143,6 @@ pthread_kill(pthread_t thread, int sig)
int
pthread_sigmask(int how, const sigset_t *set, sigset_t *oset)
{
-
if (_sys___sigprocmask14(how, set, oset))
return errno;
return 0;
@@ -154,6 +154,9 @@ pthread__sched_yield(void)
pthread_t self;
int error;
+ if (__predict_false(__uselibcstub))
+ return __libc_thr_yield();
+
self = pthread__self();
/* Memory barrier for unlocked mutex release. */
Index: src/lib/libpthread/pthread_mutex.c
diff -u src/lib/libpthread/pthread_mutex.c:1.51 src/lib/libpthread/pthread_mutex.c:1.51.22.1
--- src/lib/libpthread/pthread_mutex.c:1.51 Sat Aug 2 19:46:30 2008
+++ src/lib/libpthread/pthread_mutex.c Mon Apr 29 01:50:18 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pthread_mutex.c,v 1.51 2008/08/02 19:46:30 matt Exp $ */
+/* $NetBSD: pthread_mutex.c,v 1.51.22.1 2013/04/29 01:50:18 riz Exp $ */
/*-
* Copyright (c) 2001, 2003, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -47,7 +47,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread_mutex.c,v 1.51 2008/08/02 19:46:30 matt Exp $");
+__RCSID("$NetBSD: pthread_mutex.c,v 1.51.22.1 2013/04/29 01:50:18 riz Exp $");
#include <sys/types.h>
#include <sys/lwpctl.h>
@@ -56,11 +56,13 @@ __RCSID("$NetBSD: pthread_mutex.c,v 1.51
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
+#include <time.h>
#include <string.h>
#include <stdio.h>
#include "pthread.h"
#include "pthread_int.h"
+#include "reentrant.h"
#define MUTEX_WAITERS_BIT ((uintptr_t)0x01)
#define MUTEX_RECURSIVE_BIT ((uintptr_t)0x02)
@@ -105,6 +107,9 @@ pthread_mutex_init(pthread_mutex_t *ptm,
{
intptr_t type;
+ if (__predict_false(__uselibcstub))
+ return __libc_mutex_init_stub(ptm, attr);
+
if (attr == NULL)
type = PTHREAD_MUTEX_NORMAL;
else
@@ -137,6 +142,9 @@ int
pthread_mutex_destroy(pthread_mutex_t *ptm)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_mutex_destroy_stub(ptm);
+
pthread__error(EINVAL, "Invalid mutex",
ptm->ptm_magic == _PT_MUTEX_MAGIC);
pthread__error(EBUSY, "Destroying locked mutex",
@@ -152,6 +160,9 @@ pthread_mutex_lock(pthread_mutex_t *ptm)
pthread_t self;
void *val;
+ if (__predict_false(__uselibcstub))
+ return __libc_mutex_lock_stub(ptm);
+
self = pthread__self();
val = atomic_cas_ptr(&ptm->ptm_owner, NULL, self);
if (__predict_true(val == NULL)) {
@@ -335,6 +346,9 @@ pthread_mutex_trylock(pthread_mutex_t *p
pthread_t self;
void *val, *new, *next;
+ if (__predict_false(__uselibcstub))
+ return __libc_mutex_trylock_stub(ptm);
+
self = pthread__self();
val = atomic_cas_ptr(&ptm->ptm_owner, NULL, self);
if (__predict_true(val == NULL)) {
@@ -372,6 +386,9 @@ pthread_mutex_unlock(pthread_mutex_t *pt
pthread_t self;
void *value;
+ if (__predict_false(__uselibcstub))
+ return __libc_mutex_unlock_stub(ptm);
+
/*
* Note this may be a non-interlocked CAS. See lock_slow()
* above and sys/kern/kern_mutex.c for details.
@@ -532,6 +549,8 @@ pthread__mutex_wakeup(pthread_t self, pt
int
pthread_mutexattr_init(pthread_mutexattr_t *attr)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_mutexattr_init_stub(attr);
attr->ptma_magic = _PT_MUTEXATTR_MAGIC;
attr->ptma_private = (void *)PTHREAD_MUTEX_DEFAULT;
@@ -541,6 +560,8 @@ pthread_mutexattr_init(pthread_mutexattr
int
pthread_mutexattr_destroy(pthread_mutexattr_t *attr)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_mutexattr_destroy_stub(attr);
pthread__error(EINVAL, "Invalid mutex attribute",
attr->ptma_magic == _PT_MUTEXATTR_MAGIC);
@@ -552,7 +573,6 @@ pthread_mutexattr_destroy(pthread_mutexa
int
pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *typep)
{
-
pthread__error(EINVAL, "Invalid mutex attribute",
attr->ptma_magic == _PT_MUTEXATTR_MAGIC);
@@ -564,6 +584,8 @@ pthread_mutexattr_gettype(const pthread_
int
pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_mutexattr_settype_stub(attr, type);
pthread__error(EINVAL, "Invalid mutex attribute",
attr->ptma_magic == _PT_MUTEXATTR_MAGIC);
@@ -591,6 +613,8 @@ once_cleanup(void *closure)
int
pthread_once(pthread_once_t *once_control, void (*routine)(void))
{
+ if (__predict_false(__uselibcstub))
+ return __libc_thr_once_stub(once_control, routine);
if (once_control->pto_done == 0) {
pthread_mutex_lock(&once_control->pto_mutex);
Index: src/lib/libpthread/pthread_rwlock.c
diff -u src/lib/libpthread/pthread_rwlock.c:1.32 src/lib/libpthread/pthread_rwlock.c:1.32.22.1
--- src/lib/libpthread/pthread_rwlock.c:1.32 Sat Oct 25 14:14:11 2008
+++ src/lib/libpthread/pthread_rwlock.c Mon Apr 29 01:50:18 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pthread_rwlock.c,v 1.32 2008/10/25 14:14:11 yamt Exp $ */
+/* $NetBSD: pthread_rwlock.c,v 1.32.22.1 2013/04/29 01:50:18 riz Exp $ */
/*-
* Copyright (c) 2002, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -30,16 +30,18 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread_rwlock.c,v 1.32 2008/10/25 14:14:11 yamt Exp $");
+__RCSID("$NetBSD: pthread_rwlock.c,v 1.32.22.1 2013/04/29 01:50:18 riz Exp $");
#include <sys/types.h>
#include <sys/lwpctl.h>
+#include <time.h>
#include <errno.h>
#include <stddef.h>
#include "pthread.h"
#include "pthread_int.h"
+#include "reentrant.h"
#define _RW_LOCKED 0
#define _RW_WANT_WRITE 1
@@ -85,6 +87,8 @@ int
pthread_rwlock_init(pthread_rwlock_t *ptr,
const pthread_rwlockattr_t *attr)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_rwlock_init_stub(ptr, attr);
if (attr && (attr->ptra_magic != _PT_RWLOCKATTR_MAGIC))
return EINVAL;
@@ -101,6 +105,8 @@ pthread_rwlock_init(pthread_rwlock_t *pt
int
pthread_rwlock_destroy(pthread_rwlock_t *ptr)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_rwlock_destroy_stub(ptr);
if ((ptr->ptr_magic != _PT_RWLOCK_MAGIC) ||
(!PTQ_EMPTY(&ptr->ptr_rblocked)) ||
@@ -233,6 +239,9 @@ pthread_rwlock_tryrdlock(pthread_rwlock_
{
uintptr_t owner, next;
+ if (__predict_false(__uselibcstub))
+ return __libc_rwlock_tryrdlock_stub(ptr);
+
#ifdef ERRORCHECK
if (ptr->ptr_magic != _PT_RWLOCK_MAGIC)
return EINVAL;
@@ -355,6 +364,9 @@ pthread_rwlock_trywrlock(pthread_rwlock_
uintptr_t owner, next;
pthread_t self;
+ if (__predict_false(__uselibcstub))
+ return __libc_rwlock_trywrlock_stub(ptr);
+
#ifdef ERRORCHECK
if (ptr->ptr_magic != _PT_RWLOCK_MAGIC)
return EINVAL;
@@ -379,6 +391,8 @@ pthread_rwlock_trywrlock(pthread_rwlock_
int
pthread_rwlock_rdlock(pthread_rwlock_t *ptr)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_rwlock_rdlock_stub(ptr);
return pthread__rwlock_rdlock(ptr, NULL);
}
@@ -387,7 +401,6 @@ int
pthread_rwlock_timedrdlock(pthread_rwlock_t *ptr,
const struct timespec *abs_timeout)
{
-
if (abs_timeout == NULL)
return EINVAL;
if ((abs_timeout->tv_nsec >= 1000000000) ||
@@ -401,6 +414,8 @@ pthread_rwlock_timedrdlock(pthread_rwloc
int
pthread_rwlock_wrlock(pthread_rwlock_t *ptr)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_rwlock_wrlock_stub(ptr);
return pthread__rwlock_wrlock(ptr, NULL);
}
@@ -409,7 +424,6 @@ int
pthread_rwlock_timedwrlock(pthread_rwlock_t *ptr,
const struct timespec *abs_timeout)
{
-
if (abs_timeout == NULL)
return EINVAL;
if ((abs_timeout->tv_nsec >= 1000000000) ||
@@ -428,6 +442,9 @@ pthread_rwlock_unlock(pthread_rwlock_t *
pthread_mutex_t *interlock;
pthread_t self, thread;
+ if (__predict_false(__uselibcstub))
+ return __libc_rwlock_unlock_stub(ptr);
+
#ifdef ERRORCHECK
if ((ptr == NULL) || (ptr->ptr_magic != _PT_RWLOCK_MAGIC))
return EINVAL;
Index: src/lib/libpthread/pthread_specific.c
diff -u src/lib/libpthread/pthread_specific.c:1.21.22.2 src/lib/libpthread/pthread_specific.c:1.21.22.3
--- src/lib/libpthread/pthread_specific.c:1.21.22.2 Sun Dec 2 18:47:36 2012
+++ src/lib/libpthread/pthread_specific.c Mon Apr 29 01:50:18 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pthread_specific.c,v 1.21.22.2 2012/12/02 18:47:36 riz Exp $ */
+/* $NetBSD: pthread_specific.c,v 1.21.22.3 2013/04/29 01:50:18 riz Exp $ */
/*-
* Copyright (c) 2001, 2007 The NetBSD Foundation, Inc.
@@ -30,12 +30,13 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread_specific.c,v 1.21.22.2 2012/12/02 18:47:36 riz Exp $");
+__RCSID("$NetBSD: pthread_specific.c,v 1.21.22.3 2013/04/29 01:50:18 riz Exp $");
/* Functions and structures dealing with thread-specific data */
#include "pthread.h"
#include "pthread_int.h"
+#include "reentrant.h"
#include <sys/lwpctl.h>
@@ -48,6 +49,9 @@ pthread_setspecific(pthread_key_t key, c
{
pthread_t self;
+ if (__predict_false(__uselibcstub))
+ return __libc_thr_setspecific_stub(key, value);
+
self = pthread__self();
/*
* We can't win here on constness. Having been given a
@@ -65,6 +69,8 @@ pthread_setspecific(pthread_key_t key, c
void *
pthread_getspecific(pthread_key_t key)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_thr_getspecific_stub(key);
return pthread__self()->pt_specific[key];
}
@@ -72,6 +78,8 @@ pthread_getspecific(pthread_key_t key)
unsigned int
pthread_curcpu_np(void)
{
+ if (__predict_false(__uselibcstub))
+ return __libc_thr_curcpu_stub();
return pthread__self()->pt_lwpctl->lc_curcpu;
}
Index: src/lib/libpthread/pthread_tsd.c
diff -u src/lib/libpthread/pthread_tsd.c:1.7.24.2 src/lib/libpthread/pthread_tsd.c:1.7.24.3
--- src/lib/libpthread/pthread_tsd.c:1.7.24.2 Sun Dec 2 18:47:36 2012
+++ src/lib/libpthread/pthread_tsd.c Mon Apr 29 01:50:19 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pthread_tsd.c,v 1.7.24.2 2012/12/02 18:47:36 riz Exp $ */
+/* $NetBSD: pthread_tsd.c,v 1.7.24.3 2013/04/29 01:50:19 riz Exp $ */
/*-
* Copyright (c) 2001, 2007 The NetBSD Foundation, Inc.
@@ -30,13 +30,14 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread_tsd.c,v 1.7.24.2 2012/12/02 18:47:36 riz Exp $");
+__RCSID("$NetBSD: pthread_tsd.c,v 1.7.24.3 2013/04/29 01:50:19 riz Exp $");
/* Functions and structures dealing with thread-specific data */
#include <errno.h>
#include "pthread.h"
#include "pthread_int.h"
+#include "reentrant.h"
static pthread_mutex_t tsd_mutex = PTHREAD_MUTEX_INITIALIZER;
static int nextkey;
@@ -46,11 +47,16 @@ void (*pthread__tsd_destructors[PTHREAD_
__strong_alias(__libc_thr_keycreate,pthread_key_create)
__strong_alias(__libc_thr_keydelete,pthread_key_delete)
+#include <err.h>
+#include <stdlib.h>
int
pthread_key_create(pthread_key_t *key, void (*destructor)(void *))
{
int i;
+ if (__predict_false(__uselibcstub))
+ return __libc_thr_keycreate_stub(key, destructor);
+
/* Get a lock on the allocation list */
pthread_mutex_lock(&tsd_mutex);
@@ -90,7 +96,6 @@ pthread_key_create(pthread_key_t *key, v
int
pthread_key_delete(pthread_key_t key)
{
-
/*
* This is tricky. The standard says of pthread_key_create()
* that new keys have the value NULL associated with them in
@@ -157,6 +162,9 @@ pthread_key_delete(pthread_key_t key)
* apply in general, just to this implementation.
*/
+ if (__predict_false(__uselibcstub))
+ return __libc_thr_keydelete_stub(key);
+
/* For the momemt, we're going with option 1. */
pthread_mutex_lock(&tsd_mutex);
pthread__tsd_destructors[key] = NULL;