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); 1663c7c38b2bb93b2faad372ff9a464dea00f0eb96eDavid 'Digit' Turner#if 0 /* MISSING FROM BIONIC */ 167c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutex_timedlock(pthread_mutex_t *mutex, struct timespec* ts); 1683c7c38b2bb93b2faad372ff9a464dea00f0eb96eDavid 'Digit' Turner#endif /* MISSING */ 169c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 1707012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_condattr_init(pthread_condattr_t *attr); 1717012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_condattr_getpshared(pthread_condattr_t *attr, int *pshared); 1727012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_condattr_setpshared(pthread_condattr_t* attr, int pshared); 1737012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_condattr_destroy(pthread_condattr_t *attr); 1747012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner 175c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_init(pthread_cond_t *cond, 176c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const pthread_condattr_t *attr); 177c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_destroy(pthread_cond_t *cond); 178c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_broadcast(pthread_cond_t *cond); 179c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_signal(pthread_cond_t *cond); 180c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); 181c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_timedwait(pthread_cond_t *cond, 182c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner pthread_mutex_t * mutex, 183c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const struct timespec *abstime); 184c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 185c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/* BIONIC: same as pthread_cond_timedwait, except the 'abstime' given refers 186c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * to the CLOCK_MONOTONIC clock instead, to avoid any problems when 187c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * the wall-clock time is changed brutally 188c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner */ 189c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_timedwait_monotonic_np(pthread_cond_t *cond, 190c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner pthread_mutex_t *mutex, 191c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const struct timespec *abstime); 192c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 193c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/* BIONIC: DEPRECATED. same as pthread_cond_timedwait_monotonic_np() 194c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * unfortunately pthread_cond_timedwait_monotonic has shipped already 195c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner */ 196c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_timedwait_monotonic(pthread_cond_t *cond, 197c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner pthread_mutex_t *mutex, 198c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const struct timespec *abstime); 199c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 200c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC 1 201c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 202c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/* BIONIC: same as pthread_cond_timedwait, except the 'reltime' given refers 203c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * is relative to the current time. 204c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner */ 205c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_timedwait_relative_np(pthread_cond_t *cond, 206c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner pthread_mutex_t *mutex, 207c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner const struct timespec *reltime); 208c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 209c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE 1 210c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 211c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 212c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 213c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_cond_timeout_np(pthread_cond_t *cond, 214c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner pthread_mutex_t * mutex, 215c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner unsigned msecs); 216c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 217c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/* same as pthread_mutex_lock(), but will wait up to 'msecs' milli-seconds 218c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * before returning. same return values than pthread_mutex_trylock though, i.e. 219c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * returns EBUSY if the lock could not be acquired after the timeout 220c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * expired. 221c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner */ 222c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_mutex_lock_timeout_np(pthread_mutex_t *mutex, unsigned msecs); 223c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 2247012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner/* read-write lock support */ 2257012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner 2267012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnertypedef int pthread_rwlockattr_t; 2277012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner 2287012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnertypedef struct { 2297012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner pthread_mutex_t lock; 2307012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner pthread_cond_t cond; 2317012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner int numLocks; 2327012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner int writerThreadId; 2337012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner int pendingReaders; 2347012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner int pendingWriters; 2357012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner void* reserved[4]; /* for future extensibility */ 2367012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner} pthread_rwlock_t; 2377012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner 238114db2a1c41d686c292c14200c567fe112e1c99eDavid 'Digit' Turner#define PTHREAD_RWLOCK_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, 0, 0, 0, { NULL, NULL, NULL, NULL } } 2397012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner 2407012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_rwlockattr_init(pthread_rwlockattr_t *attr); 2417012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr); 2427012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr, int pshared); 2437012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_rwlockattr_getpshared(pthread_rwlockattr_t *attr, int *pshared); 2447012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner 2457012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr); 2467012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_rwlock_destroy(pthread_rwlock_t *rwlock); 2477012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner 2487012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); 2497012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock); 2507012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_rwlock_timedrdlock(pthread_rwlock_t *rwlock, const struct timespec *abs_timeout); 2517012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner 2527012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); 2537012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock); 2547012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_rwlock_timedwrlock(pthread_rwlock_t *rwlock, const struct timespec *abs_timeout); 2557012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner 2567012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_rwlock_unlock(pthread_rwlock_t *rwlock); 2577012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner 2587012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner 259c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_key_create(pthread_key_t *key, void (*destructor_function)(void *)); 260c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_key_delete (pthread_key_t); 261c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_setspecific(pthread_key_t key, const void *value); 262c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnervoid *pthread_getspecific(pthread_key_t key); 263c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 264c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_kill(pthread_t tid, int sig); 265c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_sigmask(int how, const sigset_t *set, sigset_t *oset); 266c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 267c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_getcpuclockid(pthread_t tid, clockid_t *clockid); 268c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 269c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerint pthread_once(pthread_once_t *once_control, void (*init_routine)(void)); 270c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 2717012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turnerint pthread_setname_np(pthread_t thid, const char *thname); 2727012117d4ae7e9ca9e50812f55757411aa8f93a0David 'Digit' Turner 273c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnertypedef void (*__pthread_cleanup_func_t)(void*); 274c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 275c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnertypedef struct __pthread_cleanup_t { 276c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner struct __pthread_cleanup_t* __cleanup_prev; 277c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner __pthread_cleanup_func_t __cleanup_routine; 278c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void* __cleanup_arg; 279c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner} __pthread_cleanup_t; 280c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 281c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerextern void __pthread_cleanup_push(__pthread_cleanup_t* c, 282c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner __pthread_cleanup_func_t routine, 283c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner void* arg); 284c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 285c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turnerextern void __pthread_cleanup_pop(__pthread_cleanup_t* c, 286c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner int execute); 287c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 288c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/* Believe or not, the definitions of pthread_cleanup_push and 289c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * pthread_cleanup_pop below are correct. Posix states that these 290c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * can be implemented as macros that might introduce opening and 291c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * closing braces, and that using setjmp/longjmp/return/break/continue 292c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * between them results in undefined behaviour. 293c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * 294c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner * And indeed, GLibc and other C libraries use a similar definition 295c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner */ 296c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define pthread_cleanup_push(routine, arg) \ 297c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner do { \ 298c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner __pthread_cleanup_t __cleanup; \ 299c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner __pthread_cleanup_push( &__cleanup, (routine), (arg) ); \ 300c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 301c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define pthread_cleanup_pop(execute) \ 302c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner __pthread_cleanup_pop( &__cleanup, (execute)); \ 303c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner } while (0); 304c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 305e4f252821e642b0fa67d8aa57af2d8cc81538764David 'Digit' Turner#ifdef __cplusplus 306c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner} /* extern "C" */ 307c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#endif 308c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 309c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner/************ TO FIX ************/ 310c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 311c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define LONG_LONG_MAX __LONG_LONG_MAX__ 312c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner#define LONG_LONG_MIN (-__LONG_LONG_MAX__ - 1) 313c817c5210e4207908b83faaf08a2c5b95251f871David 'Digit' Turner 314e4f252821e642b0fa67d8aa57af2d8cc81538764David 'Digit' Turner#endif /* _PTHREAD_H_ */ 315