Browse Source

greatly simplify pthread_key_create (~20% size reduction)

Rich Felker 14 years ago
parent
commit
c9806fc2f9
1 changed files with 9 additions and 10 deletions
  1. 9 10
      src/thread/pthread_key_create.c

+ 9 - 10
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 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;
 }