| /* |
| * Copyright (C) 2007 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef _LIBS_UTILS_ANDROID_THREADS_H |
| #define _LIBS_UTILS_ANDROID_THREADS_H |
| |
| #include <stdint.h> |
| #include <sys/types.h> |
| |
| #if !defined(_WIN32) |
| # include <pthread.h> |
| #endif |
| |
| #include <utils/ThreadDefs.h> |
| |
| // --------------------------------------------------------------------------- |
| // C API |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| // Create and run a new thread. |
| extern int androidCreateThread(android_thread_func_t, void *); |
| |
| // Create thread with lots of parameters |
| extern int androidCreateThreadEtc(android_thread_func_t entryFunction, |
| void *userData, |
| const char* threadName, |
| int32_t threadPriority, |
| size_t threadStackSize, |
| android_thread_id_t *threadId); |
| |
| // Get some sort of unique identifier for the current thread. |
| extern android_thread_id_t androidGetThreadId(); |
| |
| // Low-level thread creation -- never creates threads that can |
| // interact with the Java VM. |
| extern int androidCreateRawThreadEtc(android_thread_func_t entryFunction, |
| void *userData, |
| const char* threadName, |
| int32_t threadPriority, |
| size_t threadStackSize, |
| android_thread_id_t *threadId); |
| |
| // set the same of the running thread |
| extern void androidSetThreadName(const char* name); |
| |
| // Used by the Java Runtime to control how threads are created, so that |
| // they can be proper and lovely Java threads. |
| typedef int (*android_create_thread_fn)(android_thread_func_t entryFunction, |
| void *userData, |
| const char* threadName, |
| int32_t threadPriority, |
| size_t threadStackSize, |
| android_thread_id_t *threadId); |
| |
| extern void androidSetCreateThreadFunc(android_create_thread_fn func); |
| |
| // ------------------------------------------------------------------ |
| // Extra functions working with raw pids. |
| |
| #ifdef HAVE_ANDROID_OS |
| // Change the priority AND scheduling group of a particular thread. The priority |
| // should be one of the ANDROID_PRIORITY constants. Returns INVALID_OPERATION |
| // if the priority set failed, else another value if just the group set failed; |
| // in either case errno is set. Thread ID zero means current thread. |
| extern int androidSetThreadPriority(pid_t tid, int prio); |
| |
| // Get the current priority of a particular thread. Returns one of the |
| // ANDROID_PRIORITY constants or a negative result in case of error. |
| extern int androidGetThreadPriority(pid_t tid); |
| #endif |
| |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif |
| |
| // ---------------------------------------------------------------------------- |
| // C++ API |
| #ifdef __cplusplus |
| namespace android { |
| // ---------------------------------------------------------------------------- |
| |
| // Create and run a new thread. |
| inline bool createThread(thread_func_t f, void *a) { |
| return androidCreateThread(f, a) ? true : false; |
| } |
| |
| // Create thread with lots of parameters |
| inline bool createThreadEtc(thread_func_t entryFunction, |
| void *userData, |
| const char* threadName = "android:unnamed_thread", |
| int32_t threadPriority = PRIORITY_DEFAULT, |
| size_t threadStackSize = 0, |
| thread_id_t *threadId = 0) |
| { |
| return androidCreateThreadEtc(entryFunction, userData, threadName, |
| threadPriority, threadStackSize, threadId) ? true : false; |
| } |
| |
| // Get some sort of unique identifier for the current thread. |
| inline thread_id_t getThreadId() { |
| return androidGetThreadId(); |
| } |
| |
| // ---------------------------------------------------------------------------- |
| }; // namespace android |
| #endif // __cplusplus |
| // ---------------------------------------------------------------------------- |
| |
| #endif // _LIBS_UTILS_ANDROID_THREADS_H |