1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * you may not use this file except in compliance with the License. 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * You may obtain a copy of the License at 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See the License for the specific language governing permissions and 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * limitations under the License. 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef _LIBS_CUTILS_THREADS_H 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define _LIBS_CUTILS_THREADS_H 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 20b3a36ca5ee79411c18984b85b224d9285b4468afDan Albert#include <sys/types.h> 21b3a36ca5ee79411c18984b85b224d9285b4468afDan Albert 22b3a36ca5ee79411c18984b85b224d9285b4468afDan Albert#if !defined(_WIN32) 23b3a36ca5ee79411c18984b85b224d9285b4468afDan Albert#include <pthread.h> 24b3a36ca5ee79411c18984b85b224d9285b4468afDan Albert#else 25b3a36ca5ee79411c18984b85b224d9285b4468afDan Albert#include <windows.h> 26b3a36ca5ee79411c18984b85b224d9285b4468afDan Albert#endif 27b3a36ca5ee79411c18984b85b224d9285b4468afDan Albert 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef __cplusplus 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern "C" { 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/***********************************************************************/ 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/***********************************************************************/ 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/***** *****/ 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/***** local thread storage *****/ 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/***** *****/ 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/***********************************************************************/ 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/***********************************************************************/ 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 40b3a36ca5ee79411c18984b85b224d9285b4468afDan Albertextern pid_t gettid(); 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 42b3a36ca5ee79411c18984b85b224d9285b4468afDan Albert#if !defined(_WIN32) 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef struct { 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_t lock; 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int has_tls; 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_key_t tls; 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} thread_store_t; 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define THREAD_STORE_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0, 0 } 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 524a6e5a3b641dd99b658c4c336490371a3a5ae180Yabin Cui#else // !defined(_WIN32) 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef struct { 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int lock_init; 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int has_tls; 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DWORD tls; 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project CRITICAL_SECTION lock; 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} thread_store_t; 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define THREAD_STORE_INITIALIZER { 0, 0, 0, {0, 0, 0, 0, 0, 0} } 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 634a6e5a3b641dd99b658c4c336490371a3a5ae180Yabin Cui#endif // !defined(_WIN32) 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef void (*thread_store_destruct_t)(void* value); 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern void* thread_store_get(thread_store_t* store); 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 694a6e5a3b641dd99b658c4c336490371a3a5ae180Yabin Cuiextern void thread_store_set(thread_store_t* store, 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project void* value, 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project thread_store_destruct_t destroy); 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/***********************************************************************/ 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/***********************************************************************/ 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/***** *****/ 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/***** mutexes *****/ 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/***** *****/ 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/***********************************************************************/ 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/***********************************************************************/ 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 814a6e5a3b641dd99b658c4c336490371a3a5ae180Yabin Cui#if !defined(_WIN32) 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef pthread_mutex_t mutex_t; 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void mutex_lock(mutex_t* lock) 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_lock(lock); 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void mutex_unlock(mutex_t* lock) 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_unlock(lock); 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int mutex_init(mutex_t* lock) 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return pthread_mutex_init(lock, NULL); 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void mutex_destroy(mutex_t* lock) 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_destroy(lock); 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1044a6e5a3b641dd99b658c4c336490371a3a5ae180Yabin Cui#else // !defined(_WIN32) 1054a6e5a3b641dd99b658c4c336490371a3a5ae180Yabin Cui 1064a6e5a3b641dd99b658c4c336490371a3a5ae180Yabin Cuitypedef struct { 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int init; 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project CRITICAL_SECTION lock[1]; 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} mutex_t; 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define MUTEX_INITIALIZER { 0, {{ NULL, 0, 0, NULL, NULL, 0 }} } 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void mutex_lock(mutex_t* lock) 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!lock->init) { 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lock->init = 1; 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project InitializeCriticalSection( lock->lock ); 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lock->init = 2; 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else while (lock->init != 2) 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project Sleep(10); 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project EnterCriticalSection(lock->lock); 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void mutex_unlock(mutex_t* lock) 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project LeaveCriticalSection(lock->lock); 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ int mutex_init(mutex_t* lock) 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project InitializeCriticalSection(lock->lock); 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lock->init = 2; 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic __inline__ void mutex_destroy(mutex_t* lock) 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (lock->init) { 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lock->init = 0; 1394a6e5a3b641dd99b658c4c336490371a3a5ae180Yabin Cui DeleteCriticalSection(lock->lock); 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1424a6e5a3b641dd99b658c4c336490371a3a5ae180Yabin Cui#endif // !defined(_WIN32) 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef __cplusplus 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* _LIBS_CUTILS_THREADS_H */ 149