1c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/* 2c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * Copyright (C) 2008 The Android Open Source Project 3c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * All rights reserved. 4c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * 5c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * Redistribution and use in source and binary forms, with or without 6c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * modification, are permitted provided that the following conditions 7c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * are met: 8c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * * Redistributions of source code must retain the above copyright 9c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * notice, this list of conditions and the following disclaimer. 10c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * * Redistributions in binary form must reproduce the above copyright 11c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * notice, this list of conditions and the following disclaimer in 12c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * the documentation and/or other materials provided with the 13c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * distribution. 14c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * 15c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * SUCH DAMAGE. 27c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner */ 28c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#ifndef _PTHREAD_H_ 29c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define _PTHREAD_H_ 30c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 31c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#include <time.h> 32c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#include <signal.h> 33c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#include <sched.h> 34c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#include <limits.h> 35c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#include <sys/types.h> 36c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 37c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/* 38c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * Types 39c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner */ 40c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnertypedef struct 41c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner{ 42c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner int volatile value; 43c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner} pthread_mutex_t; 44c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 45c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define PTHREAD_MUTEX_INITIALIZER {0} 46c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER {0x4000} 47c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER {0x8000} 48c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 49c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerenum { 50c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner PTHREAD_MUTEX_NORMAL = 0, 51c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner PTHREAD_MUTEX_RECURSIVE = 1, 52c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner PTHREAD_MUTEX_ERRORCHECK = 2, 53c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 54c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner PTHREAD_MUTEX_ERRORCHECK_NP = PTHREAD_MUTEX_ERRORCHECK, 55c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner PTHREAD_MUTEX_RECURSIVE_NP = PTHREAD_MUTEX_RECURSIVE, 56c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 57c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL 58c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner}; 59c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 60c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 61c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 62c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnertypedef struct 63c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner{ 64c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner int volatile value; 65c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner} pthread_cond_t; 66c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 67c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnertypedef struct 68c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner{ 69c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner uint32_t flags; 70c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void * stack_base; 71c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner size_t stack_size; 72c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner size_t guard_size; 73c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner int32_t sched_policy; 74c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner int32_t sched_priority; 75c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner} pthread_attr_t; 76c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 77c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnertypedef long pthread_mutexattr_t; 78c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnertypedef long pthread_condattr_t; 79c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 80c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnertypedef int pthread_key_t; 81c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnertypedef long pthread_t; 82c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 83c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnertypedef volatile int pthread_once_t; 84c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 85c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/* 86c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * Defines 87c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner */ 88c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define PTHREAD_COND_INITIALIZER {0} 89c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 90c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define PTHREAD_STACK_MIN (2 * PAGE_SIZE) 91c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 92c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define PTHREAD_CREATE_DETACHED 0x00000001 93c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define PTHREAD_CREATE_JOINABLE 0x00000000 94c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 95c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define PTHREAD_ONCE_INIT 0 96c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 97c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define PTHREAD_PROCESS_PRIVATE 0 98c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define PTHREAD_PROCESS_SHARED 1 99c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 100c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define PTHREAD_SCOPE_SYSTEM 0 101c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define PTHREAD_SCOPE_PROCESS 1 102c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 103c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/* 104c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * Prototypes 105c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner */ 106e4f252821e642b0fa67d8aa57af2d8cc81538764David 'Digit' Turner#ifdef __cplusplus 107c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerextern "C" { 108c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#endif 109c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 110c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_init(pthread_attr_t * attr); 111c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_destroy(pthread_attr_t * attr); 112c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 113c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_setdetachstate(pthread_attr_t * attr, int state); 114c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_getdetachstate(pthread_attr_t const * attr, int * state); 115c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 116c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_setschedpolicy(pthread_attr_t * attr, int policy); 117c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_getschedpolicy(pthread_attr_t const * attr, int * policy); 118c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 119c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_setschedparam(pthread_attr_t * attr, struct sched_param const * param); 120c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_getschedparam(pthread_attr_t const * attr, struct sched_param * param); 121c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 122c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_setstacksize(pthread_attr_t * attr, size_t stack_size); 123c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_getstacksize(pthread_attr_t const * attr, size_t * stack_size); 124c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 125c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_setstackaddr(pthread_attr_t * attr, void * stackaddr); 126c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_getstackaddr(pthread_attr_t const * attr, void ** stackaddr); 127c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 128c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_setstack(pthread_attr_t * attr, void * stackaddr, size_t stack_size); 129c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_getstack(pthread_attr_t const * attr, void ** stackaddr, size_t * stack_size); 130c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 131c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_setguardsize(pthread_attr_t * attr, size_t guard_size); 132c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_getguardsize(pthread_attr_t const * attr, size_t * guard_size); 133c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 134c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_setscope(pthread_attr_t *attr, int scope); 135c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_attr_getscope(pthread_attr_t const *attr); 136c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 137c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_getattr_np(pthread_t thid, pthread_attr_t * attr); 138c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 139c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_create(pthread_t *thread, pthread_attr_t const * attr, 140c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void *(*start_routine)(void *), void * arg); 141c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnervoid pthread_exit(void * retval); 142c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_join(pthread_t thid, void ** ret_val); 143c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_detach(pthread_t thid); 144c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 145c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerpthread_t pthread_self(void); 146c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_equal(pthread_t one, pthread_t two); 147c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 148c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_getschedparam(pthread_t thid, int * policy, 149c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct sched_param * param); 150c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_setschedparam(pthread_t thid, int poilcy, 151c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct sched_param const * param); 152c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 153c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutexattr_init(pthread_mutexattr_t *attr); 154c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutexattr_destroy(pthread_mutexattr_t *attr); 155c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *type); 156c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type); 157c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared); 158c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutexattr_getpshared(pthread_mutexattr_t *attr, int *pshared); 159c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 160c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutex_init(pthread_mutex_t *mutex, 161c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const pthread_mutexattr_t *attr); 162c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutex_destroy(pthread_mutex_t *mutex); 163c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutex_lock(pthread_mutex_t *mutex); 164c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutex_unlock(pthread_mutex_t *mutex); 165c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutex_trylock(pthread_mutex_t *mutex); 166c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutex_timedlock(pthread_mutex_t *mutex, struct timespec* ts); 167c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 168c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_init(pthread_cond_t *cond, 169c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const pthread_condattr_t *attr); 170c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_destroy(pthread_cond_t *cond); 171c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_broadcast(pthread_cond_t *cond); 172c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_signal(pthread_cond_t *cond); 173c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); 174c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_timedwait(pthread_cond_t *cond, 175c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner pthread_mutex_t * mutex, 176c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const struct timespec *abstime); 177c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 178c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/* BIONIC: same as pthread_cond_timedwait, except the 'abstime' given refers 179c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * to the CLOCK_MONOTONIC clock instead, to avoid any problems when 180c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * the wall-clock time is changed brutally 181c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner */ 182c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_timedwait_monotonic_np(pthread_cond_t *cond, 183c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner pthread_mutex_t *mutex, 184c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const struct timespec *abstime); 185c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 186c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/* BIONIC: DEPRECATED. same as pthread_cond_timedwait_monotonic_np() 187c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * unfortunately pthread_cond_timedwait_monotonic has shipped already 188c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner */ 189c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_timedwait_monotonic(pthread_cond_t *cond, 190c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner pthread_mutex_t *mutex, 191c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const struct timespec *abstime); 192c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 193c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC 1 194c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 195c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/* BIONIC: same as pthread_cond_timedwait, except the 'reltime' given refers 196c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * is relative to the current time. 197c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner */ 198c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_timedwait_relative_np(pthread_cond_t *cond, 199c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner pthread_mutex_t *mutex, 200c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const struct timespec *reltime); 201c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 202c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE 1 203c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 204c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 205c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 206c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_timeout_np(pthread_cond_t *cond, 207c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner pthread_mutex_t * mutex, 208c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned msecs); 209c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 210c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/* same as pthread_mutex_lock(), but will wait up to 'msecs' milli-seconds 211c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * before returning. same return values than pthread_mutex_trylock though, i.e. 212c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * returns EBUSY if the lock could not be acquired after the timeout 213c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * expired. 214c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner */ 215c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutex_lock_timeout_np(pthread_mutex_t *mutex, unsigned msecs); 216c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 217c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_key_create(pthread_key_t *key, void (*destructor_function)(void *)); 218c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_key_delete (pthread_key_t); 219c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_setspecific(pthread_key_t key, const void *value); 220c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnervoid *pthread_getspecific(pthread_key_t key); 221c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 222c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_kill(pthread_t tid, int sig); 223c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_sigmask(int how, const sigset_t *set, sigset_t *oset); 224c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 225c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_getcpuclockid(pthread_t tid, clockid_t *clockid); 226c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 227c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_once(pthread_once_t *once_control, void (*init_routine)(void)); 228c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 229c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnertypedef void (*__pthread_cleanup_func_t)(void*); 230c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 231c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnertypedef struct __pthread_cleanup_t { 232c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct __pthread_cleanup_t* __cleanup_prev; 233c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner __pthread_cleanup_func_t __cleanup_routine; 234c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void* __cleanup_arg; 235c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner} __pthread_cleanup_t; 236c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 237c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerextern void __pthread_cleanup_push(__pthread_cleanup_t* c, 238c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner __pthread_cleanup_func_t routine, 239c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void* arg); 240c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 241c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerextern void __pthread_cleanup_pop(__pthread_cleanup_t* c, 242c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner int execute); 243c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 244c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/* Believe or not, the definitions of pthread_cleanup_push and 245c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * pthread_cleanup_pop below are correct. Posix states that these 246c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * can be implemented as macros that might introduce opening and 247c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * closing braces, and that using setjmp/longjmp/return/break/continue 248c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * between them results in undefined behaviour. 249c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * 250c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * And indeed, GLibc and other C libraries use a similar definition 251c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner */ 252c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define pthread_cleanup_push(routine, arg) \ 253c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner do { \ 254c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner __pthread_cleanup_t __cleanup; \ 255c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner __pthread_cleanup_push( &__cleanup, (routine), (arg) ); \ 256c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 257c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define pthread_cleanup_pop(execute) \ 258c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner __pthread_cleanup_pop( &__cleanup, (execute)); \ 259c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner } while (0); 260c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 261e4f252821e642b0fa67d8aa57af2d8cc81538764David 'Digit' Turner#ifdef __cplusplus 262c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner} /* extern "C" */ 263c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#endif 264c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 265c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/************ TO FIX ************/ 266c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 267c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define LONG_LONG_MAX __LONG_LONG_MAX__ 268c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define LONG_LONG_MIN (-__LONG_LONG_MAX__ - 1) 269c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 270e4f252821e642b0fa67d8aa57af2d8cc81538764David 'Digit' Turner#endif /* _PTHREAD_H_ */ 271