add pthread_attr_setstack interface (and get)
[musl] / src / thread / pthread_create.c
index 5b34e7e..48290d3 100644 (file)
@@ -98,16 +98,20 @@ int pthread_create(pthread_t *res, const pthread_attr_t *attr, void *(*entry)(vo
                libc.threaded = 1;
        }
 
-       if (attr) {
-               guard = ROUND(attr->_a_guardsize + DEFAULT_GUARD_SIZE);
-               size = guard + ROUND(attr->_a_stacksize + DEFAULT_STACK_SIZE);
+       if (attr && attr->_a_stackaddr) {
+               map = 0;
+               tsd = (void *)(attr->_a_stackaddr-__pthread_tsd_size & -16);
+       } else {
+               if (attr) {
+                       guard = ROUND(attr->_a_guardsize + DEFAULT_GUARD_SIZE);
+                       size = guard + ROUND(attr->_a_stacksize + DEFAULT_STACK_SIZE);
+               }
+               size += __pthread_tsd_size;
+               map = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
+               if (map == MAP_FAILED) return EAGAIN;
+               if (guard) mprotect(map, guard, PROT_NONE);
+               tsd = map + size - __pthread_tsd_size;
        }
-       size += __pthread_tsd_size;
-       map = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
-       if (map == MAP_FAILED) return EAGAIN;
-       if (guard) mprotect(map, guard, PROT_NONE);
-
-       tsd = map + size - __pthread_tsd_size;
        new = (void *)(tsd - sizeof *new - PAGE_SIZE%sizeof *new);
        new->map_base = map;
        new->map_size = size;