X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fthread%2Fpthread_create.c;h=6963f0d6e1e2a9949e34db20312619b0059c9187;hb=326e126faf91e2c18a8a656fbb0daab54b1818d6;hp=893773fa10f0228be9d64af7e1e884dcb048391c;hpb=12e1e324683a1d381b7f15dd36c99b37dd44d940;p=musl diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index 893773fa..6963f0d6 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -9,8 +9,6 @@ void *__mmap(void *, size_t, int, int, int, off_t); int __munmap(void *, size_t); int __mprotect(void *, size_t, int); -void __vm_lock_impl(int); -void __vm_unlock_impl(void); static void dummy_0() { @@ -77,7 +75,7 @@ _Noreturn void __pthread_exit(void *result) /* Process robust list in userspace to handle non-pshared mutexes * and the detached thread case where the robust list head will * be invalid when the kernel would process it. */ - __vm_lock_impl(+1); + __vm_lock(); volatile void *volatile *rp; while ((rp=self->robust_list.head) && rp != &self->robust_list.head) { pthread_mutex_t *m = (void *)((char *)rp @@ -91,7 +89,7 @@ _Noreturn void __pthread_exit(void *result) if (cont < 0 || waiters) __wake(&m->_m_lock, 1, priv); } - __vm_unlock_impl(); + __vm_unlock(); __do_orphaned_stdio_locks(); @@ -110,6 +108,10 @@ _Noreturn void __pthread_exit(void *result) if (self->robust_list.off) __syscall(SYS_set_robust_list, 0, 3*sizeof(long)); + /* Since __unmapself bypasses the normal munmap code path, + * explicitly wait for vmlock holders first. */ + __vm_wait(); + /* The following call unmaps the thread's stack mapping * and then exits without touching the stack. */ __unmapself(self->map_base, self->map_size); @@ -120,7 +122,6 @@ _Noreturn void __pthread_exit(void *result) void __do_cleanup_push(struct __ptcb *cb) { - if (!libc.has_thread_pointer) return; struct pthread *self = __pthread_self(); cb->__next = self->cancelbuf; self->cancelbuf = cb; @@ -128,7 +129,6 @@ void __do_cleanup_push(struct __ptcb *cb) void __do_cleanup_pop(struct __ptcb *cb) { - if (!libc.has_thread_pointer) return; __pthread_self()->cancelbuf = cb->__next; } @@ -268,6 +268,7 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att do_sched = new->startlock[0] = 1; __block_app_sigs(new->sigmask); } + new->robust_list.head = &new->robust_list.head; new->unblock_cancel = self->cancel; new->canary = self->canary;