Merge "Scheduling group cleanup"
This commit is contained in:
commit
0f00cca168
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user