pthread_create.cpp revision 16c77212792808b9e4d8229e64c5b42f4327b6dc
10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2008 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * All rights reserved. 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Redistribution and use in source and binary forms, with or without 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * modification, are permitted provided that the following conditions 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * are met: 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * * Redistributions of source code must retain the above copyright 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * notice, this list of conditions and the following disclaimer. 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * * Redistributions in binary form must reproduce the above copyright 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * notice, this list of conditions and the following disclaimer in 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the documentation and/or other materials provided with the 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distribution. 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * SUCH DAMAGE. 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <pthread.h> 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <errno.h> 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <string.h> 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <sys/mman.h> 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <unistd.h> 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include "pthread_internal.h" 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include "private/bionic_macros.h" 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include "private/bionic_prctl.h" 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include "private/bionic_ssp.h" 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include "private/bionic_tls.h" 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include "private/libc_logging.h" 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include "private/ErrnoRestorer.h" 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include "private/ScopedPthreadMutexLocker.h" 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville// x86 uses segment descriptors rather than a direct pointer to TLS. 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#if __i386__ 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <asm/ldt.h> 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleextern "C" __LIBC_HIDDEN__ void __init_user_desc(struct user_desc*, int, void*); 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#endif 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleextern "C" int __isthreaded; 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville// This code is used both by each new pthread and the code that initializes the main thread. 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillevoid __init_tls(pthread_internal_t* thread) { 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (thread->mmap_size == 0) { 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // If the TLS area was not allocated by mmap(), it may not have been cleared to zero. 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // So assume the worst and zero the TLS area. 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville memset(thread->tls, 0, sizeof(thread->tls)); 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville memset(thread->key_data, 0, sizeof(thread->key_data)); 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Slot 0 must point to itself. The x86 Linux kernel reads the TLS from %fs:0. 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville thread->tls[TLS_SLOT_SELF] = thread->tls; 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville thread->tls[TLS_SLOT_THREAD_ID] = thread; 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // GCC looks in the TLS for the stack guard on x86, so copy it there from our global. 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville thread->tls[TLS_SLOT_STACK_GUARD] = reinterpret_cast<void*>(__stack_chk_guard); 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillevoid __init_alternate_signal_stack(pthread_internal_t* thread) { 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Create and set an alternate signal stack. 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void* stack_base = mmap(NULL, SIGNAL_STACK_SIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (stack_base != MAP_FAILED) { 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Create a guard page to catch stack overflows in signal handlers. 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mprotect(stack_base, PAGE_SIZE, PROT_NONE) == -1) { 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville munmap(stack_base, SIGNAL_STACK_SIZE); 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville stack_t ss; 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ss.ss_sp = reinterpret_cast<uint8_t*>(stack_base) + PAGE_SIZE; 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ss.ss_size = SIGNAL_STACK_SIZE - PAGE_SIZE; 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ss.ss_flags = 0; 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sigaltstack(&ss, NULL); 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville thread->alternate_signal_stack = stack_base; 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // We can only use const static allocated string for mapped region name, as Android kernel 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // uses the string pointer directly when dumping /proc/pid/maps. 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, stack_base, SIGNAL_STACK_SIZE, "thread signal stack"); 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleint __init_thread(pthread_internal_t* thread) { 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int error = 0; 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (__predict_true((thread->attr.flags & PTHREAD_ATTR_FLAG_DETACHED) == 0)) { 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville atomic_init(&thread->join_state, THREAD_NOT_JOINED); 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville atomic_init(&thread->join_state, THREAD_DETACHED); 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Set the scheduling policy/priority of the thread. 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (thread->attr.sched_policy != SCHED_NORMAL) { 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sched_param param; 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville param.sched_priority = thread->attr.sched_priority; 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (sched_setscheduler(thread->tid, thread->attr.sched_policy, ¶m) == -1) { 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#if __LP64__ 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // For backwards compatibility reasons, we only report failures on 64-bit devices. 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville error = errno; 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#endif 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville __libc_format_log(ANDROID_LOG_WARN, "libc", 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "pthread_create sched_setscheduler call failed: %s", strerror(errno)); 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville thread->cleanup_stack = NULL; 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return error; 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillestatic void* __create_thread_mapped_space(size_t mmap_size, size_t stack_guard_size) { 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Create a new private anonymous map. 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int prot = PROT_READ | PROT_WRITE; 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE; 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void* space = mmap(NULL, mmap_size, prot, flags, -1, 0); 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (space == MAP_FAILED) { 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville __libc_format_log(ANDROID_LOG_WARN, 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "libc", 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "pthread_create failed: couldn't allocate %zu-bytes mapped space: %s", 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mmap_size, strerror(errno)); 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return NULL; 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Stack is at the lower end of mapped space, stack guard region is at the lower end of stack. 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Set the stack guard region to PROT_NONE, so we can detect thread stack overflow. 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mprotect(space, stack_guard_size, PROT_NONE) == -1) { 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville __libc_format_log(ANDROID_LOG_WARN, "libc", 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "pthread_create failed: couldn't mprotect PROT_NONE %zu-byte stack guard region: %s", 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville stack_guard_size, strerror(errno)); 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville munmap(space, mmap_size); 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return NULL; 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return space; 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillestatic int __allocate_thread(pthread_attr_t* attr, pthread_internal_t** threadp, void** child_stack) { 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville size_t mmap_size; 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville uint8_t* stack_top; 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (attr->stack_base == NULL) { 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // The caller didn't provide a stack, so allocate one. 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Make sure the stack size and guard size are multiples of PAGE_SIZE. 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mmap_size = BIONIC_ALIGN(attr->stack_size + sizeof(pthread_internal_t), PAGE_SIZE); 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville attr->guard_size = BIONIC_ALIGN(attr->guard_size, PAGE_SIZE); 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville attr->stack_base = __create_thread_mapped_space(mmap_size, attr->guard_size); 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (attr->stack_base == NULL) { 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return EAGAIN; 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville stack_top = reinterpret_cast<uint8_t*>(attr->stack_base) + mmap_size; 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Remember the mmap size is zero and we don't need to free it. 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mmap_size = 0; 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville stack_top = reinterpret_cast<uint8_t*>(attr->stack_base) + attr->stack_size; 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Mapped space(or user allocated stack) is used for: 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // pthread_internal_t 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // thread stack (including guard page) 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // To safely access the pthread_internal_t and thread stack, we need to find a 16-byte aligned boundary. 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville stack_top = reinterpret_cast<uint8_t*>( 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (reinterpret_cast<uintptr_t>(stack_top) - sizeof(pthread_internal_t)) & ~0xf); 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_internal_t* thread = reinterpret_cast<pthread_internal_t*>(stack_top); 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville attr->stack_size = stack_top - reinterpret_cast<uint8_t*>(attr->stack_base); 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville thread->mmap_size = mmap_size; 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville thread->attr = *attr; 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville __init_tls(thread); 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *threadp = thread; 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *child_stack = stack_top; 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return 0; 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillestatic int __pthread_start(void* arg) { 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_internal_t* thread = reinterpret_cast<pthread_internal_t*>(arg); 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Wait for our creating thread to release us. This lets it have time to 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // notify gdb about this thread before we start doing anything. 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // This also provides the memory barrier needed to ensure that all memory 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // accesses previously made by the creating thread are visible to us. 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_mutex_lock(&thread->startup_handshake_mutex); 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_mutex_destroy(&thread->startup_handshake_mutex); 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville __init_alternate_signal_stack(thread); 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void* result = thread->start_routine(thread->start_routine_arg); 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_exit(result); 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return 0; 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville// A dummy start routine for pthread_create failures where we've created a thread but aren't 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville// going to run user code on it. We swap out the user's start routine for this and take advantage 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville// of the regular thread teardown to free up resources. 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillestatic void* __do_nothing(void*) { 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return NULL; 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleint pthread_create(pthread_t* thread_out, pthread_attr_t const* attr, 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void* (*start_routine)(void*), void* arg) { 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ErrnoRestorer errno_restorer; 2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Inform the rest of the C library that at least one thread was created. 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville __isthreaded = 1; 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_attr_t thread_attr; 2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (attr == NULL) { 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_attr_init(&thread_attr); 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville thread_attr = *attr; 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville attr = NULL; // Prevent misuse below. 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_internal_t* thread = NULL; 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void* child_stack = NULL; 2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int result = __allocate_thread(&thread_attr, &thread, &child_stack); 2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (result != 0) { 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return result; 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Create a mutex for the thread in TLS to wait on once it starts so we can keep 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // it from doing anything until after we notify the debugger about it 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // This also provides the memory barrier we need to ensure that all 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // memory accesses previously performed by this thread are visible to 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the new thread. 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_mutex_init(&thread->startup_handshake_mutex, NULL); 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_mutex_lock(&thread->startup_handshake_mutex); 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville thread->start_routine = start_routine; 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville thread->start_routine_arg = arg; 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville thread->set_cached_pid(getpid()); 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int flags = CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM | 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID; 2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void* tls = reinterpret_cast<void*>(thread->tls); 2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#if defined(__i386__) 2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // On x86 (but not x86-64), CLONE_SETTLS takes a pointer to a struct user_desc rather than 2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // a pointer to the TLS itself. 2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville user_desc tls_descriptor; 2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville __init_user_desc(&tls_descriptor, false, tls); 2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville tls = &tls_descriptor; 2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#endif 2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int rc = clone(__pthread_start, child_stack, flags, thread, &(thread->tid), tls, &(thread->tid)); 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (rc == -1) { 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int clone_errno = errno; 2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // We don't have to unlock the mutex at all because clone(2) failed so there's no child waiting to 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // be unblocked, but we're about to unmap the memory the mutex is stored in, so this serves as a 2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // reminder that you can't rewrite this function to use a ScopedPthreadMutexLocker. 2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_mutex_unlock(&thread->startup_handshake_mutex); 2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (thread->mmap_size != 0) { 2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville munmap(thread->attr.stack_base, thread->mmap_size); 2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville __libc_format_log(ANDROID_LOG_WARN, "libc", "pthread_create failed: clone failed: %s", strerror(errno)); 2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return clone_errno; 2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int init_errno = __init_thread(thread); 2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (init_errno != 0) { 2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Mark the thread detached and replace its start_routine with a no-op. 2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Letting the thread run is the easiest way to clean up its resources. 2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville atomic_store(&thread->join_state, THREAD_DETACHED); 2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville __pthread_internal_add(thread); 2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville thread->start_routine = __do_nothing; 2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_mutex_unlock(&thread->startup_handshake_mutex); 2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return init_errno; 2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Publish the pthread_t and unlock the mutex to let the new thread start running. 2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *thread_out = __pthread_internal_add(thread); 2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pthread_mutex_unlock(&thread->startup_handshake_mutex); 2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return 0; 2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville