Add setPriority to allow wallpapers to run at lower cpu priority than default.
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index ea11882..a5bceb6 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -67,6 +67,7 @@
     native int  nContextCreate(int dev, int ver, boolean useDepth);
     native void nContextDestroy(int con);
     native void nContextSetSurface(int w, int h, Surface sur);
+    native void nContextSetPriority(int p);
 
     native void nContextBindRootScript(int script);
     native void nContextBindSampler(int sampler, int slot);
@@ -218,6 +219,7 @@
     Element mElement_XY_F32;
     Element mElement_XYZ_F32;
 
+
     ///////////////////////////////////////////////////////////////////////////////////
     //
 
@@ -229,6 +231,20 @@
     }
     public RSMessage mMessageCallback = null;
 
+    public enum Priority {
+        LOW (5),     //ANDROID_PRIORITY_BACKGROUND + 5
+        NORMAL (-4);  //ANDROID_PRIORITY_DISPLAY
+
+        int mID;
+        Priority(int id) {
+            mID = id;
+        }
+    }
+
+    public void contextSetPriority(Priority p) {
+        nContextSetPriority(p.mID);
+    }
+
     private static class MessageThread extends Thread {
         RenderScript mRS;
         boolean mRun = true;
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index 709cb97..d311c33 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -158,6 +158,16 @@
 }
 
 static void
+nContextSetPriority(JNIEnv *_env, jobject _this, jint p)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    LOG_API("ContextSetPriority, con(%p), priority(%i)", con, p);
+    rsContextSetPriority(con, p);
+}
+
+
+
+static void
 nContextSetSurface(JNIEnv *_env, jobject _this, jint width, jint height, jobject wnd)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
@@ -1333,6 +1343,7 @@
 {"nDeviceDestroy",                 "(I)V",                                 (void*)nDeviceDestroy },
 {"nDeviceSetConfig",               "(III)V",                               (void*)nDeviceSetConfig },
 {"nContextCreate",                 "(IIZ)I",                               (void*)nContextCreate },
+{"nContextSetPriority",            "(I)V",                                 (void*)nContextSetPriority },
 {"nContextSetSurface",             "(IILandroid/view/Surface;)V",          (void*)nContextSetSurface },
 {"nContextDestroy",                "(I)V",                                 (void*)nContextDestroy },
 {"nContextPause",                  "()V",                                  (void*)nContextPause },
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index da25a27..be988e7 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -43,7 +43,7 @@
 	}
 
 ContextSetPriority {
-	param uint32_t priority
+	param int32_t priority
 	}
 
 AssignName {
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index c835dda..deb9592 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -20,11 +20,16 @@
 #include <ui/FramebufferNativeWindow.h>
 #include <ui/EGLUtils.h>
 
+#include <sys/types.h>
+#include <sys/resource.h>
+
 #include <cutils/properties.h>
 
 #include <GLES/gl.h>
 #include <GLES/glext.h>
 
+#include <cutils/sched_policy.h>
+
 using namespace android;
 using namespace android::renderscript;
 
@@ -234,6 +239,9 @@
 void * Context::threadProc(void *vrsc)
 {
      Context *rsc = static_cast<Context *>(vrsc);
+     rsc->mNativeThreadId = gettid();
+
+     setpriority(PRIO_PROCESS, rsc->mNativeThreadId, ANDROID_PRIORITY_DISPLAY);
 
      rsc->props.mLogTimes = getProp("debug.rs.profile");
      rsc->props.mLogScripts = getProp("debug.rs.script");
@@ -316,6 +324,25 @@
      return NULL;
 }
 
+void Context::setPriority(int32_t p)
+{
+    // Note: If we put this in the proper "background" policy
+    // the wallpapers can become completly unresponsive at times.
+    // This is probably not what we want for something the user is actively
+    // looking at.
+#if 0
+    SchedPolicy pol = SP_FOREGROUND;
+    if (p > 0) {
+        pol = SP_BACKGROUND;
+    }
+    if (!set_sched_policy(mNativeThreadId, pol)) {
+        // success; reset the priority as well
+    }
+#else
+        setpriority(PRIO_PROCESS, mNativeThreadId, p);
+#endif
+}
+
 Context::Context(Device *dev, bool useDepth)
 {
     pthread_mutex_lock(&gInitMutex);
@@ -351,10 +378,6 @@
         return;
     }
 
-    sched_param sparam;
-    sparam.sched_priority = ANDROID_PRIORITY_DISPLAY;
-    pthread_attr_setschedparam(&threadAttr, &sparam);
-
     mWndSurface = NULL;
 
     objDestroyOOBInit();
@@ -791,8 +814,9 @@
     rsc->setSurface(w, h, (Surface *)sur);
 }
 
-void rsi_ContextSetPriority(Context *rsc, uint32_t p)
+void rsi_ContextSetPriority(Context *rsc, int32_t p)
 {
+    rsc->setPriority(p);
 }
 
 }
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index f3803a5..fb878eb 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -95,6 +95,7 @@
     void pause();
     void resume();
     void setSurface(uint32_t w, uint32_t h, Surface *sur);
+    void setPriority(int32_t p);
 
     void assignName(ObjectBase *obj, const char *name, uint32_t len);
     void removeName(ObjectBase *obj);
@@ -198,6 +199,7 @@
     bool mPaused;
 
     pthread_t mThreadId;
+    pid_t mNativeThreadId;
 
     ObjectBaseRef<Script> mRootScript;
     ObjectBaseRef<ProgramFragment> mFragment;