1951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 2951a39d68df598db08dfced8b4707755864a0492Ying Wang * Copyright (C) 2008 The Android Open Source Project 3951a39d68df598db08dfced8b4707755864a0492Ying Wang * All rights reserved. 4951a39d68df598db08dfced8b4707755864a0492Ying Wang * 5951a39d68df598db08dfced8b4707755864a0492Ying Wang * Redistribution and use in source and binary forms, with or without 6951a39d68df598db08dfced8b4707755864a0492Ying Wang * modification, are permitted provided that the following conditions 7951a39d68df598db08dfced8b4707755864a0492Ying Wang * are met: 8951a39d68df598db08dfced8b4707755864a0492Ying Wang * * Redistributions of source code must retain the above copyright 9951a39d68df598db08dfced8b4707755864a0492Ying Wang * notice, this list of conditions and the following disclaimer. 10951a39d68df598db08dfced8b4707755864a0492Ying Wang * * Redistributions in binary form must reproduce the above copyright 11951a39d68df598db08dfced8b4707755864a0492Ying Wang * notice, this list of conditions and the following disclaimer in 12951a39d68df598db08dfced8b4707755864a0492Ying Wang * the documentation and/or other materials provided with the 13951a39d68df598db08dfced8b4707755864a0492Ying Wang * distribution. 14951a39d68df598db08dfced8b4707755864a0492Ying Wang * 15951a39d68df598db08dfced8b4707755864a0492Ying Wang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16951a39d68df598db08dfced8b4707755864a0492Ying Wang * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17951a39d68df598db08dfced8b4707755864a0492Ying Wang * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18951a39d68df598db08dfced8b4707755864a0492Ying Wang * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19951a39d68df598db08dfced8b4707755864a0492Ying Wang * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20951a39d68df598db08dfced8b4707755864a0492Ying Wang * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21951a39d68df598db08dfced8b4707755864a0492Ying Wang * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22951a39d68df598db08dfced8b4707755864a0492Ying Wang * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23951a39d68df598db08dfced8b4707755864a0492Ying Wang * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24951a39d68df598db08dfced8b4707755864a0492Ying Wang * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25951a39d68df598db08dfced8b4707755864a0492Ying Wang * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26951a39d68df598db08dfced8b4707755864a0492Ying Wang * SUCH DAMAGE. 27951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 28951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifndef _PTHREAD_H_ 29951a39d68df598db08dfced8b4707755864a0492Ying Wang#define _PTHREAD_H_ 30951a39d68df598db08dfced8b4707755864a0492Ying Wang 31951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <time.h> 32951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <signal.h> 33951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <sched.h> 34951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <limits.h> 35951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <sys/types.h> 36951a39d68df598db08dfced8b4707755864a0492Ying Wang 37951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 38951a39d68df598db08dfced8b4707755864a0492Ying Wang * Types 39951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 40951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct 41951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 42951a39d68df598db08dfced8b4707755864a0492Ying Wang int volatile value; 43951a39d68df598db08dfced8b4707755864a0492Ying Wang} pthread_mutex_t; 44951a39d68df598db08dfced8b4707755864a0492Ying Wang 45951a39d68df598db08dfced8b4707755864a0492Ying Wang#define PTHREAD_MUTEX_INITIALIZER {0} 46951a39d68df598db08dfced8b4707755864a0492Ying Wang#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER {0x4000} 47951a39d68df598db08dfced8b4707755864a0492Ying Wang#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER {0x8000} 48951a39d68df598db08dfced8b4707755864a0492Ying Wang 49951a39d68df598db08dfced8b4707755864a0492Ying Wangenum { 50951a39d68df598db08dfced8b4707755864a0492Ying Wang PTHREAD_MUTEX_NORMAL = 0, 51951a39d68df598db08dfced8b4707755864a0492Ying Wang PTHREAD_MUTEX_RECURSIVE = 1, 52951a39d68df598db08dfced8b4707755864a0492Ying Wang PTHREAD_MUTEX_ERRORCHECK = 2, 53951a39d68df598db08dfced8b4707755864a0492Ying Wang 54951a39d68df598db08dfced8b4707755864a0492Ying Wang PTHREAD_MUTEX_ERRORCHECK_NP = PTHREAD_MUTEX_ERRORCHECK, 55951a39d68df598db08dfced8b4707755864a0492Ying Wang PTHREAD_MUTEX_RECURSIVE_NP = PTHREAD_MUTEX_RECURSIVE, 56951a39d68df598db08dfced8b4707755864a0492Ying Wang 57951a39d68df598db08dfced8b4707755864a0492Ying Wang PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL 58951a39d68df598db08dfced8b4707755864a0492Ying Wang}; 59951a39d68df598db08dfced8b4707755864a0492Ying Wang 60951a39d68df598db08dfced8b4707755864a0492Ying Wang 61951a39d68df598db08dfced8b4707755864a0492Ying Wang 62951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct 63951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 64951a39d68df598db08dfced8b4707755864a0492Ying Wang int volatile value; 65951a39d68df598db08dfced8b4707755864a0492Ying Wang} pthread_cond_t; 66951a39d68df598db08dfced8b4707755864a0492Ying Wang 67951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct 68951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 69951a39d68df598db08dfced8b4707755864a0492Ying Wang uint32_t flags; 70951a39d68df598db08dfced8b4707755864a0492Ying Wang void * stack_base; 71951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t stack_size; 72951a39d68df598db08dfced8b4707755864a0492Ying Wang size_t guard_size; 73951a39d68df598db08dfced8b4707755864a0492Ying Wang int32_t sched_policy; 74951a39d68df598db08dfced8b4707755864a0492Ying Wang int32_t sched_priority; 75951a39d68df598db08dfced8b4707755864a0492Ying Wang} pthread_attr_t; 76951a39d68df598db08dfced8b4707755864a0492Ying Wang 77951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef long pthread_mutexattr_t; 78951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef long pthread_condattr_t; 79951a39d68df598db08dfced8b4707755864a0492Ying Wang 80951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef int pthread_key_t; 81951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef long pthread_t; 82951a39d68df598db08dfced8b4707755864a0492Ying Wang 83951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef volatile int pthread_once_t; 84951a39d68df598db08dfced8b4707755864a0492Ying Wang 85951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 86951a39d68df598db08dfced8b4707755864a0492Ying Wang * Defines 87951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 88951a39d68df598db08dfced8b4707755864a0492Ying Wang#define PTHREAD_COND_INITIALIZER {0} 89951a39d68df598db08dfced8b4707755864a0492Ying Wang 90951a39d68df598db08dfced8b4707755864a0492Ying Wang#define PTHREAD_STACK_MIN (2 * PAGE_SIZE) 91951a39d68df598db08dfced8b4707755864a0492Ying Wang 92951a39d68df598db08dfced8b4707755864a0492Ying Wang#define PTHREAD_CREATE_DETACHED 0x00000001 93951a39d68df598db08dfced8b4707755864a0492Ying Wang#define PTHREAD_CREATE_JOINABLE 0x00000000 94951a39d68df598db08dfced8b4707755864a0492Ying Wang 95951a39d68df598db08dfced8b4707755864a0492Ying Wang#define PTHREAD_ONCE_INIT 0 96951a39d68df598db08dfced8b4707755864a0492Ying Wang 97951a39d68df598db08dfced8b4707755864a0492Ying Wang#define PTHREAD_PROCESS_PRIVATE 0 98951a39d68df598db08dfced8b4707755864a0492Ying Wang#define PTHREAD_PROCESS_SHARED 1 99951a39d68df598db08dfced8b4707755864a0492Ying Wang 100951a39d68df598db08dfced8b4707755864a0492Ying Wang#define PTHREAD_SCOPE_SYSTEM 0 101951a39d68df598db08dfced8b4707755864a0492Ying Wang#define PTHREAD_SCOPE_PROCESS 1 102951a39d68df598db08dfced8b4707755864a0492Ying Wang 103951a39d68df598db08dfced8b4707755864a0492Ying Wang/* 104951a39d68df598db08dfced8b4707755864a0492Ying Wang * Prototypes 105951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 106951a39d68df598db08dfced8b4707755864a0492Ying Wang#if __cplusplus 107951a39d68df598db08dfced8b4707755864a0492Ying Wangextern "C" { 108951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif 109951a39d68df598db08dfced8b4707755864a0492Ying Wang 110951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_init(pthread_attr_t * attr); 111951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_destroy(pthread_attr_t * attr); 112951a39d68df598db08dfced8b4707755864a0492Ying Wang 113951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_setdetachstate(pthread_attr_t * attr, int state); 114951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_getdetachstate(pthread_attr_t const * attr, int * state); 115951a39d68df598db08dfced8b4707755864a0492Ying Wang 116951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_setschedpolicy(pthread_attr_t * attr, int policy); 117951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_getschedpolicy(pthread_attr_t const * attr, int * policy); 118951a39d68df598db08dfced8b4707755864a0492Ying Wang 119951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_setschedparam(pthread_attr_t * attr, struct sched_param const * param); 120951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_getschedparam(pthread_attr_t const * attr, struct sched_param * param); 121951a39d68df598db08dfced8b4707755864a0492Ying Wang 122951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_setstacksize(pthread_attr_t * attr, size_t stack_size); 123951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_getstacksize(pthread_attr_t const * attr, size_t * stack_size); 124951a39d68df598db08dfced8b4707755864a0492Ying Wang 125951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_setstackaddr(pthread_attr_t * attr, void * stackaddr); 126951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_getstackaddr(pthread_attr_t const * attr, void ** stackaddr); 127951a39d68df598db08dfced8b4707755864a0492Ying Wang 128951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_setstack(pthread_attr_t * attr, void * stackaddr, size_t stack_size); 129951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_getstack(pthread_attr_t const * attr, void ** stackaddr, size_t * stack_size); 130951a39d68df598db08dfced8b4707755864a0492Ying Wang 131951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_setguardsize(pthread_attr_t * attr, size_t guard_size); 132951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_getguardsize(pthread_attr_t const * attr, size_t * guard_size); 133951a39d68df598db08dfced8b4707755864a0492Ying Wang 134951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_setscope(pthread_attr_t *attr, int scope); 135951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_attr_getscope(pthread_attr_t const *attr); 136951a39d68df598db08dfced8b4707755864a0492Ying Wang 137951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_getattr_np(pthread_t thid, pthread_attr_t * attr); 138951a39d68df598db08dfced8b4707755864a0492Ying Wang 139951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_create(pthread_t *thread, pthread_attr_t const * attr, 140951a39d68df598db08dfced8b4707755864a0492Ying Wang void *(*start_routine)(void *), void * arg); 141951a39d68df598db08dfced8b4707755864a0492Ying Wangvoid pthread_exit(void * retval); 142951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_join(pthread_t thid, void ** ret_val); 143951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_detach(pthread_t thid); 144951a39d68df598db08dfced8b4707755864a0492Ying Wang 145951a39d68df598db08dfced8b4707755864a0492Ying Wangpthread_t pthread_self(void); 146951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_equal(pthread_t one, pthread_t two); 147951a39d68df598db08dfced8b4707755864a0492Ying Wang 148951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_getschedparam(pthread_t thid, int * policy, 149951a39d68df598db08dfced8b4707755864a0492Ying Wang struct sched_param * param); 150951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_setschedparam(pthread_t thid, int poilcy, 151951a39d68df598db08dfced8b4707755864a0492Ying Wang struct sched_param const * param); 152951a39d68df598db08dfced8b4707755864a0492Ying Wang 153951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_mutexattr_init(pthread_mutexattr_t *attr); 154951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_mutexattr_destroy(pthread_mutexattr_t *attr); 155951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *type); 156951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type); 157951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared); 158951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_mutexattr_getpshared(pthread_mutexattr_t *attr, int *pshared); 159951a39d68df598db08dfced8b4707755864a0492Ying Wang 160951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_mutex_init(pthread_mutex_t *mutex, 161951a39d68df598db08dfced8b4707755864a0492Ying Wang const pthread_mutexattr_t *attr); 162951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_mutex_destroy(pthread_mutex_t *mutex); 163951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_mutex_lock(pthread_mutex_t *mutex); 164951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_mutex_unlock(pthread_mutex_t *mutex); 165951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_mutex_trylock(pthread_mutex_t *mutex); 166951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_mutex_timedlock(pthread_mutex_t *mutex, struct timespec* ts); 167951a39d68df598db08dfced8b4707755864a0492Ying Wang 168951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_cond_init(pthread_cond_t *cond, 169951a39d68df598db08dfced8b4707755864a0492Ying Wang const pthread_condattr_t *attr); 170951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_cond_destroy(pthread_cond_t *cond); 171951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_cond_broadcast(pthread_cond_t *cond); 172951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_cond_signal(pthread_cond_t *cond); 173951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); 174951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_cond_timedwait(pthread_cond_t *cond, 175951a39d68df598db08dfced8b4707755864a0492Ying Wang pthread_mutex_t * mutex, 176951a39d68df598db08dfced8b4707755864a0492Ying Wang const struct timespec *abstime); 177951a39d68df598db08dfced8b4707755864a0492Ying Wang 178951a39d68df598db08dfced8b4707755864a0492Ying Wang/* BIONIC: same as pthread_cond_timedwait, except the 'abstime' given refers 179951a39d68df598db08dfced8b4707755864a0492Ying Wang * to the CLOCK_MONOTONIC clock instead, to avoid any problems when 180951a39d68df598db08dfced8b4707755864a0492Ying Wang * the wall-clock time is changed brutally 181951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 182951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_cond_timedwait_monotonic(pthread_cond_t *cond, 183951a39d68df598db08dfced8b4707755864a0492Ying Wang pthread_mutex_t *mutex, 184951a39d68df598db08dfced8b4707755864a0492Ying Wang const struct timespec *abstime); 185951a39d68df598db08dfced8b4707755864a0492Ying Wang 186951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_cond_timeout_np(pthread_cond_t *cond, 187951a39d68df598db08dfced8b4707755864a0492Ying Wang pthread_mutex_t * mutex, 188951a39d68df598db08dfced8b4707755864a0492Ying Wang unsigned msecs); 189951a39d68df598db08dfced8b4707755864a0492Ying Wang 190951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_key_create(pthread_key_t *key, void (*destructor_function)(void *)); 191951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_key_delete (pthread_key_t); 192951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_setspecific(pthread_key_t key, const void *value); 193951a39d68df598db08dfced8b4707755864a0492Ying Wangvoid *pthread_getspecific(pthread_key_t key); 194951a39d68df598db08dfced8b4707755864a0492Ying Wang 195951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_kill(pthread_t tid, int sig); 196951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_sigmask(int how, const sigset_t *set, sigset_t *oset); 197951a39d68df598db08dfced8b4707755864a0492Ying Wang 198951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_getcpuclockid(pthread_t tid, clockid_t *clockid); 199951a39d68df598db08dfced8b4707755864a0492Ying Wang 200951a39d68df598db08dfced8b4707755864a0492Ying Wangint pthread_once(pthread_once_t *once_control, void (*init_routine)(void)); 201951a39d68df598db08dfced8b4707755864a0492Ying Wang 202951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef void (*__pthread_cleanup_func_t)(void*); 203951a39d68df598db08dfced8b4707755864a0492Ying Wang 204951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct __pthread_cleanup_t { 205951a39d68df598db08dfced8b4707755864a0492Ying Wang struct __pthread_cleanup_t* __cleanup_prev; 206951a39d68df598db08dfced8b4707755864a0492Ying Wang __pthread_cleanup_func_t __cleanup_routine; 207951a39d68df598db08dfced8b4707755864a0492Ying Wang void* __cleanup_arg; 208951a39d68df598db08dfced8b4707755864a0492Ying Wang} __pthread_cleanup_t; 209951a39d68df598db08dfced8b4707755864a0492Ying Wang 210951a39d68df598db08dfced8b4707755864a0492Ying Wangextern void __pthread_cleanup_push(__pthread_cleanup_t* c, 211951a39d68df598db08dfced8b4707755864a0492Ying Wang __pthread_cleanup_func_t routine, 212951a39d68df598db08dfced8b4707755864a0492Ying Wang void* arg); 213951a39d68df598db08dfced8b4707755864a0492Ying Wang 214951a39d68df598db08dfced8b4707755864a0492Ying Wangextern void __pthread_cleanup_pop(__pthread_cleanup_t* c, 215951a39d68df598db08dfced8b4707755864a0492Ying Wang int execute); 216951a39d68df598db08dfced8b4707755864a0492Ying Wang 217951a39d68df598db08dfced8b4707755864a0492Ying Wang/* Believe or not, the definitions of pthread_cleanup_push and 218951a39d68df598db08dfced8b4707755864a0492Ying Wang * pthread_cleanup_pop below are correct. Posix states that these 219951a39d68df598db08dfced8b4707755864a0492Ying Wang * can be implemented as macros that might introduce opening and 220951a39d68df598db08dfced8b4707755864a0492Ying Wang * closing braces, and that using setjmp/longjmp/return/break/continue 221951a39d68df598db08dfced8b4707755864a0492Ying Wang * between them results in undefined behaviour. 222951a39d68df598db08dfced8b4707755864a0492Ying Wang * 223951a39d68df598db08dfced8b4707755864a0492Ying Wang * And indeed, GLibc and other C libraries use a similar definition 224951a39d68df598db08dfced8b4707755864a0492Ying Wang */ 225951a39d68df598db08dfced8b4707755864a0492Ying Wang#define pthread_cleanup_push(routine, arg) \ 226951a39d68df598db08dfced8b4707755864a0492Ying Wang do { \ 227951a39d68df598db08dfced8b4707755864a0492Ying Wang __pthread_cleanup_t __cleanup; \ 228951a39d68df598db08dfced8b4707755864a0492Ying Wang __pthread_cleanup_push( &__cleanup, (routine), (arg) ); \ 229951a39d68df598db08dfced8b4707755864a0492Ying Wang 230951a39d68df598db08dfced8b4707755864a0492Ying Wang#define pthread_cleanup_pop(execute) \ 231951a39d68df598db08dfced8b4707755864a0492Ying Wang __pthread_cleanup_pop( &__cleanup, (execute)); \ 232951a39d68df598db08dfced8b4707755864a0492Ying Wang } while (0); 233951a39d68df598db08dfced8b4707755864a0492Ying Wang 234951a39d68df598db08dfced8b4707755864a0492Ying Wang#if __cplusplus 235951a39d68df598db08dfced8b4707755864a0492Ying Wang} /* extern "C" */ 236951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif 237951a39d68df598db08dfced8b4707755864a0492Ying Wang 238951a39d68df598db08dfced8b4707755864a0492Ying Wang/************ TO FIX ************/ 239951a39d68df598db08dfced8b4707755864a0492Ying Wang 240951a39d68df598db08dfced8b4707755864a0492Ying Wang#define LONG_LONG_MAX __LONG_LONG_MAX__ 241951a39d68df598db08dfced8b4707755864a0492Ying Wang#define LONG_LONG_MIN (-__LONG_LONG_MAX__ - 1) 242951a39d68df598db08dfced8b4707755864a0492Ying Wang 243951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif // _PTHREAD_H_ 244