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