AndroidThreads.h revision f91bb05132dccbb61a69351752d9ae47cc31f30d
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// Change the scheduling group of a particular thread.  The group
77// should be one of the ANDROID_TGROUP constants.  Returns BAD_VALUE if
78// grp is out of range, else another non-zero value with errno set if
79// the operation failed.  Thread ID zero means current thread.
80extern int androidSetThreadSchedulingGroup(pid_t tid, int grp);
81
82// Change the priority AND scheduling group of a particular thread.  The priority
83// should be one of the ANDROID_PRIORITY constants.  Returns INVALID_OPERATION
84// if the priority set failed, else another value if just the group set failed;
85// in either case errno is set.  Thread ID zero means current thread.
86extern int androidSetThreadPriority(pid_t tid, int prio);
87
88// Get the current priority of a particular thread. Returns one of the
89// ANDROID_PRIORITY constants or a negative result in case of error.
90extern int androidGetThreadPriority(pid_t tid);
91
92// Get the current scheduling group of a particular thread. Normally returns
93// one of the ANDROID_TGROUP constants other than ANDROID_TGROUP_DEFAULT.
94// Returns ANDROID_TGROUP_DEFAULT if no pthread support (e.g. on host) or if
95// scheduling groups are disabled.  Returns INVALID_OPERATION if unexpected error.
96// Thread ID zero means current thread.
97extern int androidGetThreadSchedulingGroup(pid_t tid);
98
99#ifdef __cplusplus
100} // extern "C"
101#endif
102
103// ----------------------------------------------------------------------------
104// C++ API
105#ifdef __cplusplus
106namespace android {
107// ----------------------------------------------------------------------------
108
109// Create and run a new thread.
110inline bool createThread(thread_func_t f, void *a) {
111    return androidCreateThread(f, a) ? true : false;
112}
113
114// Create thread with lots of parameters
115inline bool createThreadEtc(thread_func_t entryFunction,
116                            void *userData,
117                            const char* threadName = "android:unnamed_thread",
118                            int32_t threadPriority = PRIORITY_DEFAULT,
119                            size_t threadStackSize = 0,
120                            thread_id_t *threadId = 0)
121{
122    return androidCreateThreadEtc(entryFunction, userData, threadName,
123        threadPriority, threadStackSize, threadId) ? true : false;
124}
125
126// Get some sort of unique identifier for the current thread.
127inline thread_id_t getThreadId() {
128    return androidGetThreadId();
129}
130
131// ----------------------------------------------------------------------------
132}; // namespace android
133#endif  // __cplusplus
134// ----------------------------------------------------------------------------
135
136#endif // _LIBS_UTILS_ANDROID_THREADS_H
137