diff options
author | Glenn Kasten <gkasten@google.com> | 2011-06-22 16:20:37 -0700 |
---|---|---|
committer | Glenn Kasten <gkasten@google.com> | 2011-07-08 10:11:08 -0700 |
commit | 4fb24275919aab88d0ce346f530c9911d6c08422 (patch) | |
tree | 4c59794144a5af73950cfc924ed0fbea3999d835 | |
parent | 555b49d09bfe6ea2fc4bae9461f083cd6f8a1330 (diff) | |
download | frameworks_native-4fb24275919aab88d0ce346f530c9911d6c08422.zip frameworks_native-4fb24275919aab88d0ce346f530c9911d6c08422.tar.gz frameworks_native-4fb24275919aab88d0ce346f530c9911d6c08422.tar.bz2 |
Add C++ thread API androidGetThreadSchedulingGroup
This API is intended for applications that need to read a thread's
scheduling group, while using the higher-level (C++) family of thread APIs.
Change-Id: I5e58017f74c3989b20b5b1cc2bc4483c95720520
-rw-r--r-- | include/utils/threads.h | 7 | ||||
-rw-r--r-- | libs/utils/Threads.cpp | 35 |
2 files changed, 42 insertions, 0 deletions
diff --git a/include/utils/threads.h b/include/utils/threads.h index c8e9c04..79e02eb 100644 --- a/include/utils/threads.h +++ b/include/utils/threads.h @@ -142,6 +142,13 @@ extern int androidSetThreadSchedulingGroup(pid_t tid, int grp); // in either case errno is set. Thread ID zero means current thread. extern int androidSetThreadPriority(pid_t tid, int prio); +// Get the current scheduling group of a particular thread. Normally returns +// one of the ANDROID_TGROUP constants other than ANDROID_TGROUP_DEFAULT. +// Returns ANDROID_TGROUP_DEFAULT if no pthread support (e.g. on host) or if +// scheduling groups are disabled. Returns INVALID_OPERATION if unexpected error. +// Thread ID zero means current thread. +extern int androidGetThreadSchedulingGroup(pid_t tid); + #ifdef __cplusplus } #endif diff --git a/libs/utils/Threads.cpp b/libs/utils/Threads.cpp index 50312e7..6d5067b 100644 --- a/libs/utils/Threads.cpp +++ b/libs/utils/Threads.cpp @@ -367,6 +367,41 @@ int androidSetThreadPriority(pid_t tid, int pri) return rc; } +int androidGetThreadSchedulingGroup(pid_t tid) +{ + int ret = ANDROID_TGROUP_DEFAULT; + +#if defined(HAVE_PTHREADS) + // convention is to not call get/set_sched_policy methods if disabled by property + pthread_once(&gDoSchedulingGroupOnce, checkDoSchedulingGroup); + if (gDoSchedulingGroup) { + SchedPolicy policy; + // get_sched_policy does not support tid == 0 + if (tid == 0) { + tid = androidGetTid(); + } + if (get_sched_policy(tid, &policy) < 0) { + ret = INVALID_OPERATION; + } else { + switch (policy) { + case SP_BACKGROUND: + ret = ANDROID_TGROUP_BG_NONINTERACT; + break; + case SP_FOREGROUND: + ret = ANDROID_TGROUP_FG_BOOST; + break; + default: + // should not happen, as enum SchedPolicy does not have any other values + ret = INVALID_OPERATION; + break; + } + } + } +#endif + + return ret; +} + namespace android { /* |