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