summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Glenn Kasten <gkasten@google.com> 2011-08-29 14:38:52 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2011-08-29 14:38:52 -0700
commit940673f92ed8a0f4e6448b86ec08cee91ef3fc45 (patch)
treeb67596f3dcbc24f361e43bb7891ed3ea70b67d37
parent6552e46f99dc810e0e85ceac41b3fc1bf55d5507 (diff)
parent4fb24275919aab88d0ce346f530c9911d6c08422 (diff)
Merge "Add C++ thread API androidGetThreadSchedulingGroup"
-rw-r--r--include/utils/threads.h7
-rw-r--r--libs/utils/Threads.cpp35
2 files changed, 42 insertions, 0 deletions
diff --git a/include/utils/threads.h b/include/utils/threads.h
index c84a9b448c..c685625055 100644
--- a/include/utils/threads.h
+++ b/include/utils/threads.h
@@ -143,6 +143,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 d18c0a2f5a..02c380b0e5 100644
--- a/libs/utils/Threads.cpp
+++ b/libs/utils/Threads.cpp
@@ -368,6 +368,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 {
/*