pthread_getattr_np.c 618 B

1234567891011121314151617181920212223
  1. #define _GNU_SOURCE
  2. #include "pthread_impl.h"
  3. #include "libc.h"
  4. #include <sys/mman.h>
  5. int pthread_getattr_np(pthread_t t, pthread_attr_t *a)
  6. {
  7. *a = (pthread_attr_t){0};
  8. a->_a_detach = !!t->detached;
  9. if (t->stack) {
  10. a->_a_stackaddr = (uintptr_t)t->stack;
  11. a->_a_stacksize = t->stack_size - DEFAULT_STACK_SIZE;
  12. } else {
  13. char *p = (void *)libc.auxv;
  14. size_t l = PAGE_SIZE;
  15. p += -(uintptr_t)p & PAGE_SIZE-1;
  16. a->_a_stackaddr = (uintptr_t)p;
  17. while (mremap(p-l-PAGE_SIZE, PAGE_SIZE, 2*PAGE_SIZE, 0)==MAP_FAILED && errno==ENOMEM)
  18. l += PAGE_SIZE;
  19. a->_a_stacksize = l - DEFAULT_STACK_SIZE;
  20. }
  21. return 0;
  22. }