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, &param) == -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