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
This commit is contained in:
Mathias Agopian 2013-08-23 15:56:38 -07:00
parent 464febc449
commit 9414d67f46
3 changed files with 17 additions and 13 deletions

View File

@ -82,6 +82,7 @@ LOCAL_SRC_FILES:= \
LOCAL_SHARED_LIBRARIES := \ LOCAL_SHARED_LIBRARIES := \
libsurfaceflinger \ libsurfaceflinger \
libcutils \
liblog \ liblog \
libbinder \ libbinder \
libutils libutils

View File

@ -22,10 +22,6 @@
#include <math.h> #include <math.h>
#include <dlfcn.h> #include <dlfcn.h>
#if defined(HAVE_PTHREADS)
#include <sys/resource.h>
#endif
#include <EGL/egl.h> #include <EGL/egl.h>
#include <cutils/log.h> #include <cutils/log.h>
@ -640,9 +636,6 @@ status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
} }
void SurfaceFlinger::run() { void SurfaceFlinger::run() {
#if defined(HAVE_PTHREADS)
setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);
#endif
do { do {
waitForEvent(); waitForEvent();
} while (true); } while (true);

View File

@ -14,6 +14,11 @@
* limitations under the License. * limitations under the License.
*/ */
#if defined(HAVE_PTHREADS)
#include <sys/resource.h>
#endif
#include <cutils/sched_policy.h>
#include <binder/IServiceManager.h> #include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h> #include <binder/IPCThreadState.h>
#include <binder/ProcessState.h> #include <binder/ProcessState.h>
@ -27,16 +32,21 @@ int main(int argc, char** argv) {
// binder threads to 4. // binder threads to 4.
ProcessState::self()->setThreadPoolMaxThreadCount(4); ProcessState::self()->setThreadPoolMaxThreadCount(4);
// instantiate surfaceflinger
sp<SurfaceFlinger> flinger = new SurfaceFlinger();
// initialize before clients can connect
flinger->init();
// start the thread pool // start the thread pool
sp<ProcessState> ps(ProcessState::self()); sp<ProcessState> ps(ProcessState::self());
ps->startThreadPool(); 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 // publish surface flinger
sp<IServiceManager> sm(defaultServiceManager()); sp<IServiceManager> sm(defaultServiceManager());
sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false); sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);