diff options
| author | christos <christos@NetBSD.org> | 2019-03-05 01:35:52 +0000 |
|---|---|---|
| committer | christos <christos@NetBSD.org> | 2019-03-05 01:35:52 +0000 |
| commit | 03bbc0809832cfc64ebef984c1dae5d64c95bfca (patch) | |
| tree | 11c70e20854dd6c80f39bb8826532c3af2e9134b /lib/libc/thread-stub/thread-stub.c | |
| parent | 9dc824f400679beae5c68745c5200ca0478a7c3d (diff) | |
Transfer all the keys that were created in the libc stub implementation
to the pthread tsd implementation when the main thread is created.
This corrects a problem where a process created keys before libpthread
was loaded (either from the libc constructor or because libpthread
was dlopened later). This fixes a problem with jemalloc which creates
keys in the constructor.
Diffstat (limited to 'lib/libc/thread-stub/thread-stub.c')
| -rw-r--r-- | lib/libc/thread-stub/thread-stub.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/lib/libc/thread-stub/thread-stub.c b/lib/libc/thread-stub/thread-stub.c index d50bd80324c..c89fafbedee 100644 --- a/lib/libc/thread-stub/thread-stub.c +++ b/lib/libc/thread-stub/thread-stub.c @@ -1,4 +1,4 @@ -/* $NetBSD: thread-stub.c,v 1.28 2016/10/31 18:10:11 kamil Exp $ */ +/* $NetBSD: thread-stub.c,v 1.29 2019/03/05 01:35:52 christos 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.28 2016/10/31 18:10:11 kamil Exp $"); +__RCSID("$NetBSD: thread-stub.c,v 1.29 2019/03/05 01:35:52 christos Exp $"); #endif /* LIBC_SCCS and not lint */ /* @@ -47,6 +47,7 @@ __RCSID("$NetBSD: thread-stub.c,v 1.28 2016/10/31 18:10:11 kamil Exp $"); #define pthread_detach __libc_pthread_detach #include "namespace.h" #include "reentrant.h" +#include "tsd.h" #include <errno.h> #include <signal.h> @@ -280,13 +281,7 @@ __libc_rwlock_catchall_stub(rwlock_t *l) * implementation, since some thread-safe libraries want to use it. */ -#define TSD_KEYS_MAX 64 - -static struct { - void *tsd_val; - void (*tsd_dtor)(void *); - int tsd_inuse; -} __libc_tsd[TSD_KEYS_MAX]; +struct __libc_tsd __libc_tsd[TSD_KEYS_MAX]; static int __libc_tsd_nextkey; __weak_alias(__libc_thr_keycreate,__libc_thr_keycreate_stub) |
