pthread_key_create.c 924 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #include "pthread_impl.h"
  2. const size_t __pthread_tsd_size = sizeof(void *) * PTHREAD_KEYS_MAX;
  3. void *__pthread_tsd_main[PTHREAD_KEYS_MAX] = { 0 };
  4. static void (*keys[PTHREAD_KEYS_MAX])(void *);
  5. static void nodtor(void *dummy)
  6. {
  7. }
  8. int pthread_key_create(pthread_key_t *k, void (*dtor)(void *))
  9. {
  10. unsigned i = (uintptr_t)&k / 16 % PTHREAD_KEYS_MAX;
  11. unsigned j = i;
  12. pthread_self();
  13. libc.tsd_keys = keys;
  14. if (!dtor) dtor = nodtor;
  15. do {
  16. if (!a_cas_p(keys+j, 0, dtor)) {
  17. *k = j;
  18. return 0;
  19. }
  20. } while ((j=(j+1)%PTHREAD_KEYS_MAX) != i);
  21. return EAGAIN;
  22. }
  23. void __pthread_tsd_run_dtors(pthread_t self)
  24. {
  25. int i, j, not_finished = self->tsd_used;
  26. for (j=0; not_finished && j<PTHREAD_DESTRUCTOR_ITERATIONS; j++) {
  27. not_finished = 0;
  28. for (i=0; i<PTHREAD_KEYS_MAX; i++) {
  29. if (self->tsd[i] && keys[i]) {
  30. void *tmp = self->tsd[i];
  31. self->tsd[i] = 0;
  32. keys[i](tmp);
  33. not_finished = 1;
  34. }
  35. }
  36. }
  37. }