make sure SF initialization is ran at target priority and correct thread group

SF can spawn threads (indirectly) during initialization
and we want those to be spawned at URGENT_DISPLAY_PRIORITY
(in theory they should set their own, but some code lives
in vendor libraries and doesn't).

Bug: 10430209
Change-Id: I5b3a8f979297de287614c8eafd8267bef1176e4b
diff --git a/services/surfaceflinger/Android.mk b/services/surfaceflinger/Android.mk
index 81b0d14..3888d7e 100644
--- a/services/surfaceflinger/Android.mk
+++ b/services/surfaceflinger/Android.mk
@@ -82,6 +82,7 @@
 
 LOCAL_SHARED_LIBRARIES := \
 	libsurfaceflinger \
+	libcutils \
 	liblog \
 	libbinder \
 	libutils
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index a151142..9fd3f25 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -22,10 +22,6 @@
 #include <math.h>
 #include <dlfcn.h>
 
-#if defined(HAVE_PTHREADS)
-#include <sys/resource.h>
-#endif
-
 #include <EGL/egl.h>
 
 #include <cutils/log.h>
@@ -640,9 +636,6 @@
 }
 
 void SurfaceFlinger::run() {
-#if defined(HAVE_PTHREADS)
-    setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);
-#endif
     do {
         waitForEvent();
     } while (true);
diff --git a/services/surfaceflinger/main_surfaceflinger.cpp b/services/surfaceflinger/main_surfaceflinger.cpp
index a609b6f..b161480 100644
--- a/services/surfaceflinger/main_surfaceflinger.cpp
+++ b/services/surfaceflinger/main_surfaceflinger.cpp
@@ -14,6 +14,11 @@
  * limitations under the License.
  */
 
+#if defined(HAVE_PTHREADS)
+#include <sys/resource.h>
+#endif
+
+#include <cutils/sched_policy.h>
 #include <binder/IServiceManager.h>
 #include <binder/IPCThreadState.h>
 #include <binder/ProcessState.h>
@@ -27,16 +32,21 @@
     // binder threads to 4.
     ProcessState::self()->setThreadPoolMaxThreadCount(4);
 
-    // instantiate surfaceflinger
-    sp<SurfaceFlinger> flinger = new SurfaceFlinger();
-
-    // initialize before clients can connect
-    flinger->init();
-
     // start the thread pool
     sp<ProcessState> ps(ProcessState::self());
     ps->startThreadPool();
 
+    // instantiate surfaceflinger
+    sp<SurfaceFlinger> flinger = new SurfaceFlinger();
+
+#if defined(HAVE_PTHREADS)
+    setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);
+#endif
+    set_sched_policy(0, SP_FOREGROUND);
+
+    // initialize before clients can connect
+    flinger->init();
+
     // publish surface flinger
     sp<IServiceManager> sm(defaultServiceManager());
     sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);