vm: Add support for using scheduler policies instead of cgroups

Signed-off-by: San Mehat <san@google.com>
diff --git a/vm/Thread.c b/vm/Thread.c
index 4cce9f8..8f3650f 100644
--- a/vm/Thread.c
+++ b/vm/Thread.c
@@ -3067,7 +3067,7 @@
  *
  * Returns 0 on success.
  */
-int dvmChangeThreadSchedulerGroup(const char *cgroup)
+static int dvmChangeThreadSchedulerGroup(const char *cgroup)
 {
 #ifdef HAVE_ANDROID_OS
     int fd;
@@ -3103,6 +3103,29 @@
 }
 
 /*
+ * Change the scheduling policy of the current thread
+ */
+void dvmChangeThreadSchedulerPolicy(SchedPolicy policy)
+{
+    if (gDvm.kernelGroupScheduling) {
+        const char *grp = NULL;
+
+        if (policy == SCHED_BACKGROUND) {
+            grp = "bg_non_interactive";
+        }
+
+        dvmChangeThreadSchedulerGroup(grp);
+    } else {
+        struct sched_param param;
+
+        param.sched_priority = 0;
+        sched_setscheduler(getpid(),
+                           (policy == SCHED_BACKGROUND) ? 5 : 0,
+                            &param);
+    }
+}
+
+/*
  * Change the priority of a system thread to match that of the Thread object.
  *
  * We map a priority value from 1-10 to Linux "nice" values, where lower
@@ -3120,9 +3143,9 @@
     newNice = kNiceValues[newPriority-1];
 
     if (newNice >= ANDROID_PRIORITY_BACKGROUND) {
-        dvmChangeThreadSchedulerGroup("bg_non_interactive");
+        dvmChangeThreadSchedulerPolicy(SCHED_BACKGROUND);
     } else if (getpriority(PRIO_PROCESS, pid) >= ANDROID_PRIORITY_BACKGROUND) {
-        dvmChangeThreadSchedulerGroup(NULL);
+        dvmChangeThreadSchedulerPolicy(SCHED_FOREGROUND);
     }
 
     if (setpriority(PRIO_PROCESS, pid, newNice) != 0) {