projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
explicitly assemble all arm asm sources as UAL
[musl]
/
src
/
thread
/
pthread_key_create.c
diff --git
a/src/thread/pthread_key_create.c
b/src/thread/pthread_key_create.c
index
fa8a654
..
a78e507
100644
(file)
--- a/
src/thread/pthread_key_create.c
+++ b/
src/thread/pthread_key_create.c
@@
-1,23
+1,27
@@
#include "pthread_impl.h"
#include "pthread_impl.h"
-
const
size_t __pthread_tsd_size = sizeof(void *) * PTHREAD_KEYS_MAX;
+
volatile
size_t __pthread_tsd_size = sizeof(void *) * PTHREAD_KEYS_MAX;
void *__pthread_tsd_main[PTHREAD_KEYS_MAX] = { 0 };
void *__pthread_tsd_main[PTHREAD_KEYS_MAX] = { 0 };
-static void (*keys[PTHREAD_KEYS_MAX])(void *);
+static void (*
volatile
keys[PTHREAD_KEYS_MAX])(void *);
static void nodtor(void *dummy)
{
}
static void nodtor(void *dummy)
{
}
-int pthread_key_create(pthread_key_t *k, void (*dtor)(void *))
+int
__
pthread_key_create(pthread_key_t *k, void (*dtor)(void *))
{
unsigned i = (uintptr_t)&k / 16 % PTHREAD_KEYS_MAX;
unsigned j = i;
{
unsigned i = (uintptr_t)&k / 16 % PTHREAD_KEYS_MAX;
unsigned j = i;
+ pthread_t self = __pthread_self();
+
+ /* This can only happen in the main thread before
+ * pthread_create has been called. */
+ if (!self->tsd) self->tsd = __pthread_tsd_main;
- pthread_self();
if (!dtor) dtor = nodtor;
do {
if (!dtor) dtor = nodtor;
do {
- if (!a_cas_p(keys+j, 0, dtor)) {
+ if (!a_cas_p(keys+j, 0,
(void *)
dtor)) {
*k = j;
return 0;
}
*k = j;
return 0;
}
@@
-25,14
+29,15
@@
int pthread_key_create(pthread_key_t *k, void (*dtor)(void *))
return EAGAIN;
}
return EAGAIN;
}
-int pthread_key_delete(pthread_key_t k)
+int
__
pthread_key_delete(pthread_key_t k)
{
keys[k] = 0;
return 0;
}
{
keys[k] = 0;
return 0;
}
-void __pthread_tsd_run_dtors(
pthread_t self
)
+void __pthread_tsd_run_dtors()
{
{
+ pthread_t self = __pthread_self();
int i, j, not_finished = self->tsd_used;
for (j=0; not_finished && j<PTHREAD_DESTRUCTOR_ITERATIONS; j++) {
not_finished = 0;
int i, j, not_finished = self->tsd_used;
for (j=0; not_finished && j<PTHREAD_DESTRUCTOR_ITERATIONS; j++) {
not_finished = 0;
@@
-46,3
+51,6
@@
void __pthread_tsd_run_dtors(pthread_t self)
}
}
}
}
}
}
+
+weak_alias(__pthread_key_delete, pthread_key_delete);
+weak_alias(__pthread_key_create, pthread_key_create);