Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0f00cca1 authored by Glenn Kasten's avatar Glenn Kasten Committed by Android (Google) Code Review
Browse files

Merge "Scheduling group cleanup"

parents 64a1e08b a26e1cfb
Loading
Loading
Loading
Loading
+0 −13
Original line number Diff line number Diff line
@@ -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
+0 −7
Original line number Diff line number Diff line
@@ -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
+6 −6
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@

#include <binder/Binder.h>
#include <binder/BpBinder.h>
#include <cutils/sched_policy.h>
#include <utils/Debug.h>
#include <utils/Log.h>
#include <utils/TextOutput.h>
@@ -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);
                }
            }

+0 −57
Original line number Diff line number Diff line
@@ -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 {