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

Commit bd89ff87 authored by Dianne Hackborn's avatar Dianne Hackborn Committed by Android (Google) Code Review
Browse files

Merge "Add system property to turn off scheduling groups." into gingerbread

parents 5ad6c91c 7b0d45c3
Loading
Loading
Loading
Loading
+29 −8
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <utils/Log.h>

#include <cutils/sched_policy.h>
#include <cutils/properties.h>

#include <stdio.h>
#include <stdlib.h>
@@ -57,7 +58,7 @@ using namespace android;
// ----------------------------------------------------------------------------

/*
 * Create and run a new thead.
 * Create and run a new thread.
 *
 * We create it "detached", so it cleans up after itself.
 */
@@ -280,6 +281,20 @@ pid_t androidGetTid()
#endif
}

static pthread_once_t gDoSchedulingGroupOnce = PTHREAD_ONCE_INIT;
static bool gDoSchedulingGroup = true;

static void checkDoSchedulingGroup(void) {
    char buf[PROPERTY_VALUE_MAX];
    int len = property_get("debug.sys.noschedgroups", buf, "");
    if (len > 0) {
        int temp;
        if (sscanf(buf, "%d", &temp) == 1) {
            gDoSchedulingGroup = temp == 0;
        }
    }
}

int androidSetThreadSchedulingGroup(pid_t tid, int grp)
{
    if (grp > ANDROID_TGROUP_MAX || grp < 0) { 
@@ -287,10 +302,13 @@ int androidSetThreadSchedulingGroup(pid_t tid, int grp)
    }

#if defined(HAVE_PTHREADS)
    pthread_once(&gDoSchedulingGroupOnce, checkDoSchedulingGroup);
    if (gDoSchedulingGroup) {
        if (set_sched_policy(tid, (grp == ANDROID_TGROUP_BG_NONINTERACT) ?
                                          SP_BACKGROUND : SP_FOREGROUND)) {
            return PERMISSION_DENIED;
        }
    }
#endif
    
    return NO_ERROR;
@@ -303,11 +321,14 @@ int androidSetThreadPriority(pid_t tid, int pri)
#if defined(HAVE_PTHREADS)
    int lasterr = 0;

    pthread_once(&gDoSchedulingGroupOnce, checkDoSchedulingGroup);
    if (gDoSchedulingGroup) {
        if (pri >= ANDROID_PRIORITY_BACKGROUND) {
            rc = set_sched_policy(tid, SP_BACKGROUND);
        } else if (getpriority(PRIO_PROCESS, tid) >= ANDROID_PRIORITY_BACKGROUND) {
            rc = set_sched_policy(tid, SP_FOREGROUND);
        }
    }

    if (rc) {
        lasterr = errno;