Merge "Scheduling group cleanup"

This commit is contained in:
Glenn Kasten 2012-04-23 17:11:51 -07:00 committed by Android (Google) Code Review
commit 0f00cca168
4 changed files with 6 additions and 83 deletions

View File

@ -74,12 +74,6 @@ extern void androidSetCreateThreadFunc(android_create_thread_fn func);
extern pid_t androidGetTid(); extern pid_t androidGetTid();
#ifdef HAVE_ANDROID_OS #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 // Change the priority AND scheduling group of a particular thread. The priority
// should be one of the ANDROID_PRIORITY constants. Returns INVALID_OPERATION // 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; // 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 // Get the current priority of a particular thread. Returns one of the
// ANDROID_PRIORITY constants or a negative result in case of error. // ANDROID_PRIORITY constants or a negative result in case of error.
extern int androidGetThreadPriority(pid_t tid); 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 #endif
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -79,13 +79,6 @@ enum {
ANDROID_PRIORITY_LESS_FAVORABLE = +1, 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 #ifdef __cplusplus
} // extern "C" } // extern "C"
#endif #endif

View File

@ -20,6 +20,7 @@
#include <binder/Binder.h> #include <binder/Binder.h>
#include <binder/BpBinder.h> #include <binder/BpBinder.h>
#include <cutils/sched_policy.h>
#include <utils/Debug.h> #include <utils/Debug.h>
#include <utils/Log.h> #include <utils/Log.h>
#include <utils/TextOutput.h> #include <utils/TextOutput.h>
@ -428,9 +429,9 @@ void IPCThreadState::joinThreadPool(bool isMain)
mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER); mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);
// This thread may have been spawned by a thread that was in the background // 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. // one to avoid performing an initial transaction in the background.
androidSetThreadSchedulingGroup(mMyThreadId, ANDROID_TGROUP_DEFAULT); set_sched_policy(mMyThreadId, SP_FOREGROUND);
status_t result; status_t result;
do { do {
@ -473,13 +474,13 @@ void IPCThreadState::joinThreadPool(bool isMain)
} }
// After executing the command, ensure that the thread is returned to the // 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 // 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 // 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 // sure to go in the foreground after executing a transaction, but
// there are other callbacks into user code that could have changed // there are other callbacks into user code that could have changed
// our group so we want to make absolutely sure it is put back. // 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 // Let this thread exit the thread pool if it is no longer
// needed and it is not the main process thread. // 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. // since the driver won't modify scheduling classes for us.
// The scheduling group is reset to default by the caller // The scheduling group is reset to default by the caller
// once this method returns after the transaction is complete. // once this method returns after the transaction is complete.
androidSetThreadSchedulingGroup(mMyThreadId, set_sched_policy(mMyThreadId, SP_BACKGROUND);
ANDROID_TGROUP_BG_NONINTERACT);
} }
} }

View File

@ -324,29 +324,6 @@ pid_t androidGetTid()
} }
#ifdef HAVE_ANDROID_OS #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 androidSetThreadPriority(pid_t tid, int pri)
{ {
int rc = 0; int rc = 0;
@ -392,40 +369,6 @@ int androidGetThreadPriority(pid_t tid) {
#endif #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 #endif
namespace android { namespace android {