From a26e1cfbbcb7dc5e0b1cd79a815362d6a048ef26 Mon Sep 17 00:00:00 2001 From: Glenn Kasten Date: Fri, 16 Mar 2012 07:15:23 -0700 Subject: [PATCH] Scheduling group cleanup Remove C++ APIs androidSetThreadSchedulingGroup and androidGetThreadSchedulingGroup, and the ANDROID_TGROUP_* constants. Former callers of these should now use the C APIs set_sched_policy and get_sched_policy, and the SP_* constants. Note: debug.sys.noschedgroups is not supported by the C APIs, this needs to be discussed. Change-Id: I32bbfc539ef4090faf9ef0320380e8cca9eae07c --- include/utils/AndroidThreads.h | 13 -------- include/utils/ThreadDefs.h | 7 ----- libs/binder/IPCThreadState.cpp | 12 +++---- libs/utils/Threads.cpp | 57 ---------------------------------- 4 files changed, 6 insertions(+), 83 deletions(-) diff --git a/include/utils/AndroidThreads.h b/include/utils/AndroidThreads.h index 5bda0fd63..f67648fd6 100644 --- a/include/utils/AndroidThreads.h +++ b/include/utils/AndroidThreads.h @@ -74,12 +74,6 @@ extern void androidSetCreateThreadFunc(android_create_thread_fn func); extern pid_t androidGetTid(); #ifdef HAVE_ANDROID_OS -// Change the scheduling group of a particular thread. The group -// should be one of the ANDROID_TGROUP constants. Returns BAD_VALUE if -// grp is out of range, else another non-zero value with errno set if -// the operation failed. Thread ID zero means current thread. -extern int androidSetThreadSchedulingGroup(pid_t tid, int grp); - // 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; @@ -89,13 +83,6 @@ 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); - -// 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); #endif #ifdef __cplusplus diff --git a/include/utils/ThreadDefs.h b/include/utils/ThreadDefs.h index 3e563734e..a8f8eb3d9 100644 --- a/include/utils/ThreadDefs.h +++ b/include/utils/ThreadDefs.h @@ -79,13 +79,6 @@ enum { ANDROID_PRIORITY_LESS_FAVORABLE = +1, }; -enum { - ANDROID_TGROUP_DEFAULT = 0, - ANDROID_TGROUP_BG_NONINTERACT = 1, - ANDROID_TGROUP_FG_BOOST = 2, - ANDROID_TGROUP_MAX = ANDROID_TGROUP_FG_BOOST, -}; - #ifdef __cplusplus } // extern "C" #endif diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp index 96cef2c1f..7a3a3b9f5 100644 --- a/libs/binder/IPCThreadState.cpp +++ b/libs/binder/IPCThreadState.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -428,9 +429,9 @@ void IPCThreadState::joinThreadPool(bool isMain) mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER); // This thread may have been spawned by a thread that was in the background - // scheduling group, so first we will make sure it is in the default/foreground + // scheduling group, so first we will make sure it is in the foreground // one to avoid performing an initial transaction in the background. - androidSetThreadSchedulingGroup(mMyThreadId, ANDROID_TGROUP_DEFAULT); + set_sched_policy(mMyThreadId, SP_FOREGROUND); status_t result; do { @@ -473,13 +474,13 @@ void IPCThreadState::joinThreadPool(bool isMain) } // After executing the command, ensure that the thread is returned to the - // default cgroup before rejoining the pool. The driver takes care of + // foreground cgroup before rejoining the pool. The driver takes care of // restoring the priority, but doesn't do anything with cgroups so we // need to take care of that here in userspace. Note that we do make // sure to go in the foreground after executing a transaction, but // there are other callbacks into user code that could have changed // our group so we want to make absolutely sure it is put back. - androidSetThreadSchedulingGroup(mMyThreadId, ANDROID_TGROUP_DEFAULT); + set_sched_policy(mMyThreadId, SP_FOREGROUND); // Let this thread exit the thread pool if it is no longer // needed and it is not the main process thread. @@ -1010,8 +1011,7 @@ status_t IPCThreadState::executeCommand(int32_t cmd) // since the driver won't modify scheduling classes for us. // The scheduling group is reset to default by the caller // once this method returns after the transaction is complete. - androidSetThreadSchedulingGroup(mMyThreadId, - ANDROID_TGROUP_BG_NONINTERACT); + set_sched_policy(mMyThreadId, SP_BACKGROUND); } } diff --git a/libs/utils/Threads.cpp b/libs/utils/Threads.cpp index f9277de73..bc1c285f3 100644 --- a/libs/utils/Threads.cpp +++ b/libs/utils/Threads.cpp @@ -324,29 +324,6 @@ pid_t androidGetTid() } #ifdef HAVE_ANDROID_OS -int androidSetThreadSchedulingGroup(pid_t tid, int grp) -{ - if (grp > ANDROID_TGROUP_MAX || grp < 0) { - return BAD_VALUE; - } - -#if defined(HAVE_PTHREADS) - pthread_once(&gDoSchedulingGroupOnce, checkDoSchedulingGroup); - if (gDoSchedulingGroup) { - // set_sched_policy does not support tid == 0 - if (tid == 0) { - tid = androidGetTid(); - } - if (set_sched_policy(tid, (grp == ANDROID_TGROUP_BG_NONINTERACT) ? - SP_BACKGROUND : SP_FOREGROUND)) { - return PERMISSION_DENIED; - } - } -#endif - - return NO_ERROR; -} - int androidSetThreadPriority(pid_t tid, int pri) { int rc = 0; @@ -392,40 +369,6 @@ int androidGetThreadPriority(pid_t tid) { #endif } -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; -} #endif namespace android {