|
@@ -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 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;
|
|
|
- /* 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;
|
|
|
}
|