Add setPriority to allow wallpapers to run at lower cpu priority than default.
diff --git a/rs.spec b/rs.spec
index da25a27..be988e7 100644
--- a/rs.spec
+++ b/rs.spec
@@ -43,7 +43,7 @@
 	}
 
 ContextSetPriority {
-	param uint32_t priority
+	param int32_t priority
 	}
 
 AssignName {
diff --git a/rsContext.cpp b/rsContext.cpp
index c835dda..deb9592 100644
--- a/rsContext.cpp
+++ b/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/rsContext.h b/rsContext.h
index f3803a5..fb878eb 100644
--- a/rsContext.h
+++ b/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;