projects
/
musl
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
a5323c5
)
greatly simplify pthread_key_create (~20% size reduction)
author
Rich Felker
<dalias@aerifal.cx>
Thu, 31 Mar 2011 23:04:56 +0000
(19:04 -0400)
committer
Rich Felker
<dalias@aerifal.cx>
Thu, 31 Mar 2011 23:04:56 +0000
(19:04 -0400)
src/thread/pthread_key_create.c
patch
|
blob
|
history
diff --git
a/src/thread/pthread_key_create.c
b/src/thread/pthread_key_create.c
index
52c0973
..
c703bfe
100644
(file)
--- a/
src/thread/pthread_key_create.c
+++ b/
src/thread/pthread_key_create.c
@@
-9,18
+9,17
@@
static void nodtor(void *dummy)
int pthread_key_create(pthread_key_t *k, void (*dtor)(void *))
{
static void (*keys[PTHREAD_KEYS_MAX])(void *);
int pthread_key_create(pthread_key_t *k, void (*dtor)(void *))
{
static void (*keys[PTHREAD_KEYS_MAX])(void *);
-
int
i = (uintptr_t)&k / 16 % PTHREAD_KEYS_MAX;
-
int
j = i;
+
unsigned
i = (uintptr_t)&k / 16 % PTHREAD_KEYS_MAX;
+
unsigned
j = i;
pthread_self();
libc.tsd_keys = keys;
if (!dtor) dtor = nodtor;
pthread_self();
libc.tsd_keys = keys;
if (!dtor) dtor = nodtor;
- /* Cheap trick - &k cannot match any destructor pointer */
- while (a_cas_p(keys+j, 0, &k)
- && (j=(j+1)%PTHREAD_KEYS_MAX) != i);
- if (keys[j] != (void (*)(void *))&k)
- return EAGAIN;
- keys[j] = dtor;
- *k = j;
- return 0;
+ do {
+ if (!a_cas_p(keys+j, 0, dtor)) {
+ *k = j;
+ return 0;
+ }
+ } while ((j=(j+1)%PTHREAD_KEYS_MAX) != i);
+ return EAGAIN;
}
}