1/* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef _LIBS_UTILS_ANDROID_THREADS_H 18#define _LIBS_UTILS_ANDROID_THREADS_H 19 20#include <stdint.h> 21#include <sys/types.h> 22 23#if defined(HAVE_PTHREADS) 24# include <pthread.h> 25#endif 26 27#include <utils/ThreadDefs.h> 28 29// --------------------------------------------------------------------------- 30// C API 31 32#ifdef __cplusplus 33extern "C" { 34#endif 35 36// Create and run a new thread. 37extern int androidCreateThread(android_thread_func_t, void *); 38 39// Create thread with lots of parameters 40extern int androidCreateThreadEtc(android_thread_func_t entryFunction, 41 void *userData, 42 const char* threadName, 43 int32_t threadPriority, 44 size_t threadStackSize, 45 android_thread_id_t *threadId); 46 47// Get some sort of unique identifier for the current thread. 48extern android_thread_id_t androidGetThreadId(); 49 50// Low-level thread creation -- never creates threads that can 51// interact with the Java VM. 52extern int androidCreateRawThreadEtc(android_thread_func_t entryFunction, 53 void *userData, 54 const char* threadName, 55 int32_t threadPriority, 56 size_t threadStackSize, 57 android_thread_id_t *threadId); 58 59// Used by the Java Runtime to control how threads are created, so that 60// they can be proper and lovely Java threads. 61typedef int (*android_create_thread_fn)(android_thread_func_t entryFunction, 62 void *userData, 63 const char* threadName, 64 int32_t threadPriority, 65 size_t threadStackSize, 66 android_thread_id_t *threadId); 67 68extern void androidSetCreateThreadFunc(android_create_thread_fn func); 69 70// ------------------------------------------------------------------ 71// Extra functions working with raw pids. 72 73// Get pid for the current thread. 74extern pid_t androidGetTid(); 75 76#ifdef HAVE_ANDROID_OS 77// Change the priority AND scheduling group of a particular thread. The priority 78// should be one of the ANDROID_PRIORITY constants. Returns INVALID_OPERATION 79// if the priority set failed, else another value if just the group set failed; 80// in either case errno is set. Thread ID zero means current thread. 81extern int androidSetThreadPriority(pid_t tid, int prio); 82 83// Get the current priority of a particular thread. Returns one of the 84// ANDROID_PRIORITY constants or a negative result in case of error. 85extern int androidGetThreadPriority(pid_t tid); 86#endif 87 88#ifdef __cplusplus 89} // extern "C" 90#endif 91 92// ---------------------------------------------------------------------------- 93// C++ API 94#ifdef __cplusplus 95namespace android { 96// ---------------------------------------------------------------------------- 97 98// Create and run a new thread. 99inline bool createThread(thread_func_t f, void *a) { 100 return androidCreateThread(f, a) ? true : false; 101} 102 103// Create thread with lots of parameters 104inline bool createThreadEtc(thread_func_t entryFunction, 105 void *userData, 106 const char* threadName = "android:unnamed_thread", 107 int32_t threadPriority = PRIORITY_DEFAULT, 108 size_t threadStackSize = 0, 109 thread_id_t *threadId = 0) 110{ 111 return androidCreateThreadEtc(entryFunction, userData, threadName, 112 threadPriority, threadStackSize, threadId) ? true : false; 113} 114 115// Get some sort of unique identifier for the current thread. 116inline thread_id_t getThreadId() { 117 return androidGetThreadId(); 118} 119 120// ---------------------------------------------------------------------------- 121}; // namespace android 122#endif // __cplusplus 123// ---------------------------------------------------------------------------- 124 125#endif // _LIBS_UTILS_ANDROID_THREADS_H 126