pthread_internal.h revision 50af69e8f326b2762a44d5fea2b118e7616e5d20
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> 32bfeab1bbe7e8d0c08b7e3f46aedab64e3b2bf706Elliott Hughes#include <stdbool.h> 3336fa67bcdd90f18a3c68f8637ae836762407fa51Elliott Hughes#include <sys/cdefs.h> 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef struct pthread_internal_t 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct pthread_internal_t* next; 404f251bee5d51228217c1bf4dfc9219f3058bd3edElliott Hughes struct pthread_internal_t* prev; 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pthread_attr_t attr; 4240eabe24e4e3ae8ebe437f1f4e43cf39cbba2e9eElliott Hughes pid_t tid; 434f251bee5d51228217c1bf4dfc9219f3058bd3edElliott Hughes bool allocated_on_heap; 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pthread_cond_t join_cond; 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project void* return_value; 46d0c884d3595ecca03c3e70de9909c090cd5f9caePierre Peiffer int internal_flags; 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project __pthread_cleanup_t* cleanup_stack; 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project void** tls; /* thread-local storage area */ 495419b9474753d25dff947c7740532f86d130c0beElliott Hughes 5084114c8dd5b17efecf7988f263ce431208d7be5aElliott Hughes void* alternate_signal_stack; 5184114c8dd5b17efecf7988f263ce431208d7be5aElliott Hughes 525419b9474753d25dff947c7740532f86d130c0beElliott Hughes /* 535419b9474753d25dff947c7740532f86d130c0beElliott Hughes * The dynamic linker implements dlerror(3), which makes it hard for us to implement this 545419b9474753d25dff947c7740532f86d130c0beElliott Hughes * per-thread buffer by simply using malloc(3) and free(3). 555419b9474753d25dff947c7740532f86d130c0beElliott Hughes */ 565419b9474753d25dff947c7740532f86d130c0beElliott Hughes#define __BIONIC_DLERROR_BUFFER_SIZE 512 575419b9474753d25dff947c7740532f86d130c0beElliott Hughes char dlerror_buffer[__BIONIC_DLERROR_BUFFER_SIZE]; 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} pthread_internal_t; 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6040eabe24e4e3ae8ebe437f1f4e43cf39cbba2e9eElliott Hughesint _init_thread(pthread_internal_t* thread, bool add_to_thread_list); 6140eabe24e4e3ae8ebe437f1f4e43cf39cbba2e9eElliott Hughesvoid __init_tls(pthread_internal_t* thread); 629d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughesvoid _pthread_internal_add(pthread_internal_t* thread); 631a78fbb5c8228e4aea2a516818828b76044310f2Evgeniy Stepanovpthread_internal_t* __get_thread(void); 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6544b53ad6818de344e0b499ad8fdbb21fcb0ff2b6Elliott Hughes__LIBC_HIDDEN__ void pthread_key_clean_all(void); 669d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes__LIBC_HIDDEN__ void _pthread_internal_remove_locked(pthread_internal_t* thread); 6744b53ad6818de344e0b499ad8fdbb21fcb0ff2b6Elliott Hughes 680f020d18b138e24b1fe34074808e07ac412f35a4msg/* Has the thread been detached by a pthread_join or pthread_detach call? */ 693e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes#define PTHREAD_ATTR_FLAG_DETACHED 0x00000001 700f020d18b138e24b1fe34074808e07ac412f35a4msg 710f020d18b138e24b1fe34074808e07ac412f35a4msg/* Was the thread's stack allocated by the user rather than by us? */ 723e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes#define PTHREAD_ATTR_FLAG_USER_STACK 0x00000002 733e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 740f020d18b138e24b1fe34074808e07ac412f35a4msg/* Has the thread been joined by another thread? */ 750f020d18b138e24b1fe34074808e07ac412f35a4msg#define PTHREAD_ATTR_FLAG_JOINED 0x00000004 760f020d18b138e24b1fe34074808e07ac412f35a4msg 770f020d18b138e24b1fe34074808e07ac412f35a4msg/* Has the thread already exited but not been joined? */ 780f020d18b138e24b1fe34074808e07ac412f35a4msg#define PTHREAD_ATTR_FLAG_ZOMBIE 0x00000008 790f020d18b138e24b1fe34074808e07ac412f35a4msg 8050af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom/* 8150af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom * Traditionally we give threads a 1MiB stack. When we started 8250af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom * allocating per-thread alternate signal stacks to ease debugging of 8350af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom * stack overflows, we subtracted the same amount we were using there 8450af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom * from the default thread stack size. This should keep memory usage 8550af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom * roughly constant. 8650af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom */ 8750af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom#define PTHREAD_STACK_SIZE_DEFAULT ((1 * 1024 * 1024) - SIGSTKSZ) 8850af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom 899d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes__LIBC_HIDDEN__ extern pthread_internal_t* gThreadList; 909d23e04c43dbb8480bea8be28b8a2f37423bec49Elliott Hughes__LIBC_HIDDEN__ extern pthread_mutex_t gThreadListLock; 9144b53ad6818de344e0b499ad8fdbb21fcb0ff2b6Elliott Hughes 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* needed by fork.c */ 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern void __timer_table_start_stop(int stop); 944f086aeb4aa06e13079b7fec71a8178ceeacf318Matt Fischerextern void __bionic_atfork_run_prepare(); 954f086aeb4aa06e13079b7fec71a8178ceeacf318Matt Fischerextern void __bionic_atfork_run_child(); 964f086aeb4aa06e13079b7fec71a8178ceeacf318Matt Fischerextern void __bionic_atfork_run_parent(); 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _PTHREAD_INTERNAL_H_ */ 101