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/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);