19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef _LIBS_UTILS_THREADS_H
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define _LIBS_UTILS_THREADS_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <time.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ------------------------------------------------------------------
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// C API
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef __cplusplus
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" {
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef void* android_thread_id_t;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef int (*android_thread_func_t)(void*);
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ***********************************************
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ** Keep in sync with android.os.Process.java **
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ***********************************************
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This maps directly to the "nice" priorites we use in Android.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A thread priority should be chosen inverse-proportinally to
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the amount of work the thread is expected to do. The more work
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a thread will do, the less favorable priority it should get so that
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it doesn't starve the system. Threads not behaving properly might
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be "punished" by the kernel.
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use the levels below when appropriate. Intermediate values are
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * acceptable, preferably use the {MORE|LESS}_FAVORABLE constants below.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ANDROID_PRIORITY_LOWEST         =  19,
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* use for background tasks */
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ANDROID_PRIORITY_BACKGROUND     =  10,
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* most threads run at normal priority */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ANDROID_PRIORITY_NORMAL         =   0,
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* threads currently running a UI that the user is interacting with */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ANDROID_PRIORITY_FOREGROUND     =  -2,
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* the main UI thread has a slightly more favorable priority */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ANDROID_PRIORITY_DISPLAY        =  -4,
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* ui service treads might want to run at a urgent display (uncommon) */
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ANDROID_PRIORITY_URGENT_DISPLAY =  -8,
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* all normal audio threads */
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ANDROID_PRIORITY_AUDIO          = -16,
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* service audio threads (uncommon) */
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ANDROID_PRIORITY_URGENT_AUDIO   = -19,
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* should never be used in practice. regular process might not
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be allowed to use this level */
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ANDROID_PRIORITY_HIGHEST        = -20,
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ANDROID_PRIORITY_DEFAULT        = ANDROID_PRIORITY_NORMAL,
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ANDROID_PRIORITY_MORE_FAVORABLE = -1,
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ANDROID_PRIORITY_LESS_FAVORABLE = +1,
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehatenum {
83e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    ANDROID_TGROUP_DEFAULT          = 0,
84e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    ANDROID_TGROUP_BG_NONINTERACT   = 1,
85e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    ANDROID_TGROUP_FG_BOOST         = 2,
86e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat    ANDROID_TGROUP_MAX              = ANDROID_TGROUP_FG_BOOST,
87e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat};
88e9d376b801b7890b1ef5006ed55de4208e64bb63San Mehat
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Create and run a new thread.
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int androidCreateThread(android_thread_func_t, void *);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Create thread with lots of parameters
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int androidCreateThreadEtc(android_thread_func_t entryFunction,
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  void *userData,
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  const char* threadName,
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  int32_t threadPriority,
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  size_t threadStackSize,
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  android_thread_id_t *threadId);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Get some sort of unique identifier for the current thread.
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern android_thread_id_t androidGetThreadId();
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Low-level thread creation -- never creates threads that can
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// interact with the Java VM.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int androidCreateRawThreadEtc(android_thread_func_t entryFunction,
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     void *userData,
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     const char* threadName,
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     int32_t threadPriority,
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     size_t threadStackSize,
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     android_thread_id_t *threadId);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Used by the Java Runtime to control how threads are created, so that
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// they can be proper and lovely Java threads.
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef int (*android_create_thread_fn)(android_thread_func_t entryFunction,
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        void *userData,
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const char* threadName,
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int32_t threadPriority,
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        size_t threadStackSize,
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        android_thread_id_t *threadId);
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern void androidSetCreateThreadFunc(android_create_thread_fn func);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef __cplusplus
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ------------------------------------------------------------------
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// C++ API
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef __cplusplus
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h>
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/RefBase.h>
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Timers.h>
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef android_thread_id_t thread_id_t;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef android_thread_func_t thread_func_t;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PRIORITY_LOWEST         = ANDROID_PRIORITY_LOWEST,
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PRIORITY_BACKGROUND     = ANDROID_PRIORITY_BACKGROUND,
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PRIORITY_NORMAL         = ANDROID_PRIORITY_NORMAL,
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PRIORITY_FOREGROUND     = ANDROID_PRIORITY_FOREGROUND,
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PRIORITY_DISPLAY        = ANDROID_PRIORITY_DISPLAY,
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PRIORITY_URGENT_DISPLAY = ANDROID_PRIORITY_URGENT_DISPLAY,
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PRIORITY_AUDIO          = ANDROID_PRIORITY_AUDIO,
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PRIORITY_URGENT_AUDIO   = ANDROID_PRIORITY_URGENT_AUDIO,
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PRIORITY_HIGHEST        = ANDROID_PRIORITY_HIGHEST,
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PRIORITY_DEFAULT        = ANDROID_PRIORITY_DEFAULT,
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PRIORITY_MORE_FAVORABLE = ANDROID_PRIORITY_MORE_FAVORABLE,
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PRIORITY_LESS_FAVORABLE = ANDROID_PRIORITY_LESS_FAVORABLE,
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Create and run a new thread.
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline bool createThread(thread_func_t f, void *a) {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return androidCreateThread(f, a) ? true : false;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Create thread with lots of parameters
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline bool createThreadEtc(thread_func_t entryFunction,
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            void *userData,
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            const char* threadName = "android:unnamed_thread",
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int32_t threadPriority = PRIORITY_DEFAULT,
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            size_t threadStackSize = 0,
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            thread_id_t *threadId = 0)
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return androidCreateThreadEtc(entryFunction, userData, threadName,
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        threadPriority, threadStackSize, threadId) ? true : false;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Get some sort of unique identifier for the current thread.
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline thread_id_t getThreadId() {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return androidGetThreadId();
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Simple mutex class.  The implementation is system-dependent.
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The mutex must be unlocked by the thread that locked it.  They are not
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recursive, i.e. the same thread can't lock it multiple times.
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Mutex {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Mutex();
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Mutex(const char* name);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ~Mutex();
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // lock or unlock the mutex
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t    lock();
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void        unlock();
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // lock if possible; returns 0 on success, error otherwise
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t    tryLock();
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Manages the mutex automatically. It'll be locked when Autolock is
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // constructed and released when Autolock goes out of scope.
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Autolock {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inline Autolock(Mutex& mutex) : mpMutex(&mutex) { mutex.lock(); }
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inline Autolock(Mutex* mutex) : mpMutex(mutex) { mutex->lock(); }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inline ~Autolock() { mpMutex->unlock(); }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Mutex*  mpMutex;
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend class Condition;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // A mutex cannot be copied
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Mutex(const Mutex&);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex&      operator = (const Mutex&);
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void        _init();
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void*   mState;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Automatic mutex.  Declare one of these at the top of a function.
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When the function returns, it will go out of scope, and release the
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mutex.
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef Mutex::Autolock AutoMutex;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Condition variable class.  The implementation is system-dependent.
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Condition variables are paired up with mutexes.  Lock the mutex,
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * call wait(), then either re-wait() if things aren't quite what you want,
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or unlock the mutex and continue.  All threads calling wait() must
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use the same mutex for a given Condition.
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Condition {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Condition();
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ~Condition();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Wait on the condition variable.  Lock the mutex before calling.
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t wait(Mutex& mutex);
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Wait on the condition variable until the given time.  Lock the mutex
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // before calling.
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t wait(Mutex& mutex, nsecs_t abstime);
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // same with relative timeout
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t waitRelative(Mutex& mutex, nsecs_t reltime);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Signal the condition variable, allowing one thread to continue.
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void signal();
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Signal the condition variable, allowing all threads to continue.
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void broadcast();
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void*   mState;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is our spiffy thread object!
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Thread : virtual public RefBase
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Create a Thread object, but doesn't create or start the associated
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // thread. See the run() method.
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Thread(bool canCallJava = true);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual             ~Thread();
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Start the thread in threadLoop() which needs to be implemented.
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t    run(    const char* name = 0,
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int32_t priority = PRIORITY_DEFAULT,
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                size_t stack = 0);
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Ask this object's thread to exit. This function is asynchronous, when the
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // function returns the thread might still be running. Of course, this
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // function can be called from a different thread.
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void        requestExit();
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Good place to do one-time initializations
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t    readyToRun();
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Call requestExit() and wait until this object's thread exits.
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // BE VERY CAREFUL of deadlocks. In particular, it would be silly to call
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // this function from this object's thread. Will return WOULD_BLOCK in
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // that case.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    requestExitAndWait();
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected:
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // exitPending() returns true if requestExit() has been called.
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool        exitPending() const;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Derived class must implemtent threadLoop(). The thread starts its life
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // here. There are two ways of using the Thread object:
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // 1) loop: if threadLoop() returns true, it will be called again if
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //          requestExit() wasn't called.
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // 2) once: if threadLoop() returns false, the thread will exit upon return.
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool        threadLoop() = 0;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Thread& operator=(const Thread&);
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static  int             _threadLoop(void* user);
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const   bool            mCanCallJava;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            thread_id_t     mThread;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Mutex           mLock;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Condition       mThreadExitedCondition;
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t        mStatus;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    volatile bool           mExitPending;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    volatile bool           mRunning;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<Thread>      mHoldSelf;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif  // __cplusplus
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // _LIBS_UTILS_THREADS_H
320