pthread_internal.cpp revision ba8dfc2669d658dc340eb8f9c9b40ca074f05047
19d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes/* 29d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * Copyright (C) 2008 The Android Open Source Project 39d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * All rights reserved. 49d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * 59d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * Redistribution and use in source and binary forms, with or without 69d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * modification, are permitted provided that the following conditions 79d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * are met: 89d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * * Redistributions of source code must retain the above copyright 99d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * notice, this list of conditions and the following disclaimer. 109d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * * Redistributions in binary form must reproduce the above copyright 119d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * notice, this list of conditions and the following disclaimer in 129d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * the documentation and/or other materials provided with the 139d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * distribution. 149d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * 159d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 169d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 179d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 189d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 199d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 209d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 219d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 229d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 239d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 249d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 259d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 269d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes * SUCH DAMAGE. 279d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes */ 289d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes 299d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes#include "pthread_internal.h" 309d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes 318574a0670bf698b8d2f817098f9d825c4be03a68Yabin Cui#include <errno.h> 3275ef63d6cf83787233d1c45489c4ec03b0a67d16Dan Albert#include <stdlib.h> 338574a0670bf698b8d2f817098f9d825c4be03a68Yabin Cui#include <string.h> 348574a0670bf698b8d2f817098f9d825c4be03a68Yabin Cui#include <sys/mman.h> 3575ef63d6cf83787233d1c45489c4ec03b0a67d16Dan Albert 36c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughes#include "private/bionic_futex.h" 37eb847bc8666842a3cfc9c06e8458ad1abebebaf0Elliott Hughes#include "private/bionic_tls.h" 388574a0670bf698b8d2f817098f9d825c4be03a68Yabin Cui#include "private/libc_logging.h" 39eb847bc8666842a3cfc9c06e8458ad1abebebaf0Elliott Hughes#include "private/ScopedPthreadMutexLocker.h" 409d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes 411728b2396591853345507a063ed6075dfd251706Elliott Hughespthread_internal_t* g_thread_list = NULL; 421728b2396591853345507a063ed6075dfd251706Elliott Hughespthread_mutex_t g_thread_list_lock = PTHREAD_MUTEX_INITIALIZER; 439d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes 448cf1b305670123aed7638d984ca39bfd22388440Yabin Cuivoid _pthread_internal_remove_locked(pthread_internal_t* thread, bool free_thread) { 459d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes if (thread->next != NULL) { 469d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes thread->next->prev = thread->prev; 479d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes } 489d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes if (thread->prev != NULL) { 499d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes thread->prev->next = thread->next; 509d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes } else { 511728b2396591853345507a063ed6075dfd251706Elliott Hughes g_thread_list = thread->next; 529d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes } 539d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes 54ba8dfc2669d658dc340eb8f9c9b40ca074f05047Yabin Cui if (free_thread && thread->mmap_size != 0) { 55ba8dfc2669d658dc340eb8f9c9b40ca074f05047Yabin Cui // Free mapped space, including thread stack and pthread_internal_t. 56ba8dfc2669d658dc340eb8f9c9b40ca074f05047Yabin Cui munmap(thread->attr.stack_base, thread->mmap_size); 579d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes } 589d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes} 599d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes 60c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughesvoid _pthread_internal_add(pthread_internal_t* thread) { 611728b2396591853345507a063ed6075dfd251706Elliott Hughes ScopedPthreadMutexLocker locker(&g_thread_list_lock); 629d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes 639d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes // We insert at the head. 641728b2396591853345507a063ed6075dfd251706Elliott Hughes thread->next = g_thread_list; 659d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes thread->prev = NULL; 669d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes if (thread->next != NULL) { 679d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes thread->next->prev = thread; 689d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes } 691728b2396591853345507a063ed6075dfd251706Elliott Hughes g_thread_list = thread; 709d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes} 719d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes 72c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughespthread_internal_t* __get_thread(void) { 732a0b873065edb304fa2d1c54f8de663ea638b8abElliott Hughes return reinterpret_cast<pthread_internal_t*>(__get_tls()[TLS_SLOT_THREAD_ID]); 749d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes} 75