greatly simplify pthread_key_create (~20% size reduction)
authorRich Felker <dalias@aerifal.cx>
Thu, 31 Mar 2011 23:04:56 +0000 (19:04 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 31 Mar 2011 23:04:56 +0000 (19:04 -0400)
src/thread/pthread_key_create.c

index 52c0973..c703bfe 100644 (file)
@@ -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;
 }