pthread_internal.h revision 877ec6d90418ff1d6597147d355a2229fdffae7e
11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved. 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions of source code must retain the above copyright 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the documentation and/or other materials provided with the 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * distribution. 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _PTHREAD_INTERNAL_H_ 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _PTHREAD_INTERNAL_H_ 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <pthread.h> 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 33c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughesstruct pthread_internal_t { 34877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes struct pthread_internal_t* next; 35877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes struct pthread_internal_t* prev; 36877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes 37877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes pid_t tid; 38877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes 39877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes void** tls; 40877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes 41877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes pthread_attr_t attr; 42877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes bool allocated_on_heap; /* TODO: move this into attr.flags? */ 43877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes int internal_flags; /* TODO: move this into attr.flags? */ 44877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes 45877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes __pthread_cleanup_t* cleanup_stack; 46877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes 47877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes void* (*start_routine)(void*); 48877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes void* start_routine_arg; 49877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes void* return_value; 50877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes 51877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes void* alternate_signal_stack; 52877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes 53877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes /* 54877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes * The dynamic linker implements dlerror(3), which makes it hard for us to implement this 55877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes * per-thread buffer by simply using malloc(3) and free(3). 56877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes */ 575419b9474753d25dff947c7740532f86d130c0beElliott Hughes#define __BIONIC_DLERROR_BUFFER_SIZE 512 58877ec6d90418ff1d6597147d355a2229fdffae7eElliott Hughes char dlerror_buffer[__BIONIC_DLERROR_BUFFER_SIZE]; 59c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughes}; 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 61c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughes__LIBC_HIDDEN__ int _init_thread(pthread_internal_t* thread, bool add_to_thread_list); 62c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughes__LIBC_HIDDEN__ void __init_tls(pthread_internal_t* thread); 6370b24b1cc2a1a4436b1fea3f8b76616fdcb27224Elliott Hughes__LIBC_HIDDEN__ void __init_alternate_signal_stack(pthread_internal_t*); 64c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughes__LIBC_HIDDEN__ void _pthread_internal_add(pthread_internal_t* thread); 65c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughes__LIBC_HIDDEN__ pthread_internal_t* __get_thread(void); 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6744b53ad6818de344e0b499ad8fdbb21fcb0ff2b6Elliott Hughes__LIBC_HIDDEN__ void pthread_key_clean_all(void); 689d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes__LIBC_HIDDEN__ void _pthread_internal_remove_locked(pthread_internal_t* thread); 6944b53ad6818de344e0b499ad8fdbb21fcb0ff2b6Elliott Hughes 700f020d18b138e24b1fe34074808e07ac412f35a4msg/* Has the thread been detached by a pthread_join or pthread_detach call? */ 712b6e43e00ece68b3aba26d8f95f07cd9d9294ab4Elliott Hughes#define PTHREAD_ATTR_FLAG_DETACHED 0x00000001 720f020d18b138e24b1fe34074808e07ac412f35a4msg 730f020d18b138e24b1fe34074808e07ac412f35a4msg/* Was the thread's stack allocated by the user rather than by us? */ 742b6e43e00ece68b3aba26d8f95f07cd9d9294ab4Elliott Hughes#define PTHREAD_ATTR_FLAG_USER_ALLOCATED_STACK 0x00000002 753e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 760f020d18b138e24b1fe34074808e07ac412f35a4msg/* Has the thread been joined by another thread? */ 772b6e43e00ece68b3aba26d8f95f07cd9d9294ab4Elliott Hughes#define PTHREAD_ATTR_FLAG_JOINED 0x00000004 780f020d18b138e24b1fe34074808e07ac412f35a4msg 79eb847bc8666842a3cfc9c06e8458ad1abebebaf0Elliott Hughes#define PTHREAD_INTERNAL_FLAG_THREAD_INIT_FAILED 1 80eb847bc8666842a3cfc9c06e8458ad1abebebaf0Elliott Hughes 8150af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom/* 8250af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom * Traditionally we give threads a 1MiB stack. When we started 8350af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom * allocating per-thread alternate signal stacks to ease debugging of 8450af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom * stack overflows, we subtracted the same amount we were using there 8550af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom * from the default thread stack size. This should keep memory usage 8650af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom * roughly constant. 8750af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom */ 8850af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom#define PTHREAD_STACK_SIZE_DEFAULT ((1 * 1024 * 1024) - SIGSTKSZ) 8950af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom 909d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes__LIBC_HIDDEN__ extern pthread_internal_t* gThreadList; 919d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes__LIBC_HIDDEN__ extern pthread_mutex_t gThreadListLock; 9244b53ad6818de344e0b499ad8fdbb21fcb0ff2b6Elliott Hughes 93c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughes__LIBC_HIDDEN__ int __timespec_to_absolute(timespec*, const timespec*, clockid_t); 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 95c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughes/* needed by fork.c */ 96c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughes__LIBC_HIDDEN__ extern void __timer_table_start_stop(int); 97c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughes__LIBC_HIDDEN__ extern void __bionic_atfork_run_prepare(); 98c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughes__LIBC_HIDDEN__ extern void __bionic_atfork_run_child(); 99c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughes__LIBC_HIDDEN__ extern void __bionic_atfork_run_parent(); 100c3f114037dbf028896310609fd28cf2b3da99c4dElliott Hughes__LIBC_HIDDEN__ extern int __pthread_settid(pthread_t, pid_t); 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _PTHREAD_INTERNAL_H_ */ 103