1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 1999-2006 Brian Paul 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @file 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Thread, mutex, condition variable, barrier, semaphore and 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * thread-specific data functions. 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef OS_THREAD_H_ 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define OS_THREAD_H_ 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_compiler.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h" /* for assert */ 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE) || defined(PIPE_OS_HAIKU) || defined(PIPE_OS_CYGWIN) 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <pthread.h> /* POSIX threads headers */ 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdio.h> /* for perror() */ 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <signal.h> 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* pipe_thread 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef pthread_t pipe_thread; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PIPE_THREAD_ROUTINE( name, param ) \ 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *name( void *param ) 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE pipe_thread pipe_thread_create( void *(* routine)( void *), void *param ) 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_thread thread; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sigset_t saved_set, new_set; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ret; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sigfillset(&new_set); 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pthread_sigmask(SIG_SETMASK, &new_set, &saved_set); 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = pthread_create( &thread, NULL, routine, param ); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pthread_sigmask(SIG_SETMASK, &saved_set, NULL); 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return thread; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int pipe_thread_wait( pipe_thread thread ) 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pthread_join( thread, NULL ); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int pipe_thread_destroy( pipe_thread thread ) 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pthread_detach( thread ); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* pipe_mutex 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef pthread_mutex_t pipe_mutex; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_static_mutex(mutex) \ 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static pipe_mutex mutex = PTHREAD_MUTEX_INITIALIZER 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_mutex_init(mutex) \ 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) pthread_mutex_init(&(mutex), NULL) 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_mutex_destroy(mutex) \ 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pthread_mutex_destroy(&(mutex)) 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_mutex_lock(mutex) \ 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) pthread_mutex_lock(&(mutex)) 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_mutex_unlock(mutex) \ 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) pthread_mutex_unlock(&(mutex)) 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* pipe_condvar 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef pthread_cond_t pipe_condvar; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_static_condvar(mutex) \ 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static pipe_condvar mutex = PTHREAD_COND_INITIALIZER 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_init(cond) \ 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pthread_cond_init(&(cond), NULL) 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_destroy(cond) \ 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pthread_cond_destroy(&(cond)) 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_wait(cond, mutex) \ 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pthread_cond_wait(&(cond), &(mutex)) 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_signal(cond) \ 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pthread_cond_signal(&(cond)) 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_broadcast(cond) \ 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pthread_cond_broadcast(&(cond)) 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER) 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <windows.h> 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* pipe_thread 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef HANDLE pipe_thread; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PIPE_THREAD_ROUTINE( name, param ) \ 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void * WINAPI name( void *param ) 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE pipe_thread pipe_thread_create( void *(WINAPI * routine)( void *), void *param ) 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DWORD id; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE) routine, param, 0, &id ); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int pipe_thread_wait( pipe_thread thread ) 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (WaitForSingleObject( thread, INFINITE ) == WAIT_OBJECT_0) 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int pipe_thread_destroy( pipe_thread thread ) 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (CloseHandle( thread )) 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* pipe_mutex 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef CRITICAL_SECTION pipe_mutex; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* http://locklessinc.com/articles/pthreads_on_windows/ */ 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_static_mutex(mutex) \ 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static pipe_mutex mutex = {(PCRITICAL_SECTION_DEBUG)-1, -1, 0, 0, 0, 0} 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_mutex_init(mutex) \ 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org InitializeCriticalSection(&mutex) 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_mutex_destroy(mutex) \ 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DeleteCriticalSection(&mutex) 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_mutex_lock(mutex) \ 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EnterCriticalSection(&mutex) 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_mutex_unlock(mutex) \ 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LeaveCriticalSection(&mutex) 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* TODO: Need a macro to declare "I don't care about WinXP compatibilty" */ 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 && defined (_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600) 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* CONDITION_VARIABLE is only available on newer versions of Windows 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (Server 2008/Vista or later). 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * http://msdn.microsoft.com/en-us/library/ms682052(VS.85).aspx 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pipe_condvar 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef CONDITION_VARIABLE pipe_condvar; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_static_condvar(cond) \ 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*static*/ pipe_condvar cond = CONDITION_VARIABLE_INIT 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_init(cond) \ 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org InitializeConditionVariable(&(cond)) 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_destroy(cond) \ 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) cond /* nothing to do */ 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_wait(cond, mutex) \ 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SleepConditionVariableCS(&(cond), &(mutex), INFINITE) 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_signal(cond) \ 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WakeConditionVariable(&(cond)) 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_broadcast(cond) \ 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WakeAllConditionVariable(&(cond)) 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else /* need compatibility with pre-Vista Win32 */ 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* pipe_condvar (XXX FIX THIS) 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * See http://www.cs.wustl.edu/~schmidt/win32-cv-1.html 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for potential pitfalls in implementation. 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef DWORD pipe_condvar; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_static_condvar(cond) \ 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*static*/ pipe_condvar cond = 1 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_init(cond) \ 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) (cond = 1) 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_destroy(cond) \ 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) cond 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Poor man's pthread_cond_wait(): 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Just release the mutex and sleep for one millisecond. 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org The caller's while() loop does all the work. */ 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_wait(cond, mutex) \ 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { pipe_mutex_unlock(mutex); \ 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Sleep(cond); \ 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(mutex); \ 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while (0) 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_signal(cond) \ 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) cond 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_broadcast(cond) \ 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) cond 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* pre-Vista win32 */ 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "os/os_time.h" 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Dummy definitions */ 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef unsigned pipe_thread; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PIPE_THREAD_ROUTINE( name, param ) \ 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void * name( void *param ) 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE pipe_thread pipe_thread_create( void *(* routine)( void *), void *param ) 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int pipe_thread_wait( pipe_thread thread ) 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int pipe_thread_destroy( pipe_thread thread ) 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef unsigned pipe_mutex; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_static_mutex(mutex) \ 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static pipe_mutex mutex = 0 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_mutex_init(mutex) \ 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) mutex 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_mutex_destroy(mutex) \ 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) mutex 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_mutex_lock(mutex) \ 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) mutex 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_mutex_unlock(mutex) \ 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) mutex 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef int64_t pipe_condvar; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_static_condvar(condvar) \ 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static pipe_condvar condvar = 1000 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_init(condvar) \ 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) (condvar = 1000) 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_destroy(condvar) \ 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) condvar 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Poor man's pthread_cond_wait(): 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Just release the mutex and sleep for one millisecond. 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org The caller's while() loop does all the work. */ 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_wait(condvar, mutex) \ 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { pipe_mutex_unlock(mutex); \ 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org os_time_sleep(condvar); \ 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(mutex); \ 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while (0) 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_signal(condvar) \ 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) condvar 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define pipe_condvar_broadcast(condvar) \ 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) condvar 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* PIPE_OS_? */ 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pipe_barrier 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if (defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS)) && !defined(PIPE_OS_ANDROID) 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef pthread_barrier_t pipe_barrier; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void pipe_barrier_init(pipe_barrier *barrier, unsigned count) 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pthread_barrier_init(barrier, NULL, count); 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void pipe_barrier_destroy(pipe_barrier *barrier) 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pthread_barrier_destroy(barrier); 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void pipe_barrier_wait(pipe_barrier *barrier) 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pthread_barrier_wait(barrier); 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else /* If the OS doesn't have its own, implement barriers using a mutex and a condvar */ 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef struct { 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned waiters; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t sequence; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex mutex; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_condvar condvar; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} pipe_barrier; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void pipe_barrier_init(pipe_barrier *barrier, unsigned count) 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org barrier->count = count; 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org barrier->waiters = 0; 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org barrier->sequence = 0; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_init(barrier->mutex); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_condvar_init(barrier->condvar); 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void pipe_barrier_destroy(pipe_barrier *barrier) 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(barrier->waiters == 0); 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_destroy(barrier->mutex); 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_condvar_destroy(barrier->condvar); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void pipe_barrier_wait(pipe_barrier *barrier) 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(barrier->mutex); 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(barrier->waiters < barrier->count); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org barrier->waiters++; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (barrier->waiters < barrier->count) { 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t sequence = barrier->sequence; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_condvar_wait(barrier->condvar, barrier->mutex); 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while (sequence == barrier->sequence); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org barrier->waiters = 0; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org barrier->sequence++; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_condvar_broadcast(barrier->condvar); 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(barrier->mutex); 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Semaphores 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef struct 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex mutex; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_condvar cond; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int counter; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} pipe_semaphore; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_semaphore_init(pipe_semaphore *sema, int init_val) 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_init(sema->mutex); 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_condvar_init(sema->cond); 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sema->counter = init_val; 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_semaphore_destroy(pipe_semaphore *sema) 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_destroy(sema->mutex); 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_condvar_destroy(sema->cond); 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Signal/increment semaphore counter */ 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_semaphore_signal(pipe_semaphore *sema) 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(sema->mutex); 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sema->counter++; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_condvar_signal(sema->cond); 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(sema->mutex); 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Wait for semaphore counter to be greater than zero */ 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_semaphore_wait(pipe_semaphore *sema) 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(sema->mutex); 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (sema->counter <= 0) { 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_condvar_wait(sema->cond, sema->mutex); 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sema->counter--; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(sema->mutex); 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Thread-specific data. 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef struct { 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE) || defined(PIPE_OS_HAIKU) || defined(PIPE_OS_CYGWIN) 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pthread_key_t key; 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER) 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DWORD key; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int initMagic; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} pipe_tsd; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PIPE_TSD_INIT_MAGIC 0xff8adc98 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_tsd_init(pipe_tsd *tsd) 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE) || defined(PIPE_OS_HAIKU) || defined(PIPE_OS_CYGWIN) 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pthread_key_create(&tsd->key, NULL/*free*/) != 0) { 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org perror("pthread_key_create(): failed to allocate key for thread specific data"); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exit(-1); 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER) 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tsd->initMagic = PIPE_TSD_INIT_MAGIC; 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void * 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_tsd_get(pipe_tsd *tsd) 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tsd->initMagic != (int) PIPE_TSD_INIT_MAGIC) { 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_tsd_init(tsd); 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE) || defined(PIPE_OS_HAIKU) || defined(PIPE_OS_CYGWIN) 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pthread_getspecific(tsd->key); 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER) 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_tsd_set(pipe_tsd *tsd, void *value) 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tsd->initMagic != (int) PIPE_TSD_INIT_MAGIC) { 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_tsd_init(tsd); 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE) || defined(PIPE_OS_HAIKU) || defined(PIPE_OS_CYGWIN) 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pthread_setspecific(tsd->key, value) != 0) { 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org perror("pthread_set_specific() failed"); 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exit(-1); 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER) 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* OS_THREAD_H_ */ 510