summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2013-08-19 17:26:18 -0700
committerMathias Agopian <mathias@google.com>2013-08-20 11:16:45 -0700
commit4f4f0943489d9113c66ac22b58cfba8c21dfa879 (patch)
tree7b99150e05f5949dfff2fd66f8cf9ca6ce486655 /services
parent8b308ed70ed782f68c8075aac2a6b66bbfcdb9af (diff)
downloadframeworks_native-4f4f0943489d9113c66ac22b58cfba8c21dfa879.zip
frameworks_native-4f4f0943489d9113c66ac22b58cfba8c21dfa879.tar.gz
frameworks_native-4f4f0943489d9113c66ac22b58cfba8c21dfa879.tar.bz2
SurfaceFlinger now runs in the process's main thread
it used to spawn its own thread and return the main thread to the binder thread pool -- this was confusing the naming of things in the kernel. Bug: 10331839 Change-Id: I2d13a6d73409a38109300fcbe6a04b4c41cb5d00
Diffstat (limited to 'services')
-rw-r--r--services/surfaceflinger/Android.mk3
-rw-r--r--services/surfaceflinger/Client.cpp1
-rw-r--r--services/surfaceflinger/DisplayDevice.h1
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp31
-rw-r--r--services/surfaceflinger/SurfaceFlinger.h16
-rw-r--r--services/surfaceflinger/main_surfaceflinger.cpp24
6 files changed, 48 insertions, 28 deletions
diff --git a/services/surfaceflinger/Android.mk b/services/surfaceflinger/Android.mk
index 873bd5d..81b0d14 100644
--- a/services/surfaceflinger/Android.mk
+++ b/services/surfaceflinger/Android.mk
@@ -75,11 +75,14 @@ include $(BUILD_SHARED_LIBRARY)
# build surfaceflinger's executable
include $(CLEAR_VARS)
+LOCAL_CFLAGS:= -DLOG_TAG=\"SurfaceFlinger\"
+
LOCAL_SRC_FILES:= \
main_surfaceflinger.cpp
LOCAL_SHARED_LIBRARIES := \
libsurfaceflinger \
+ liblog \
libbinder \
libutils
diff --git a/services/surfaceflinger/Client.cpp b/services/surfaceflinger/Client.cpp
index dd65348..975631c 100644
--- a/services/surfaceflinger/Client.cpp
+++ b/services/surfaceflinger/Client.cpp
@@ -18,6 +18,7 @@
#include <sys/types.h>
#include <binder/PermissionCache.h>
+#include <binder/IPCThreadState.h>
#include <private/android_filesystem_config.h>
diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h
index 8e24df7..eec0396 100644
--- a/services/surfaceflinger/DisplayDevice.h
+++ b/services/surfaceflinger/DisplayDevice.h
@@ -26,6 +26,7 @@
#include <EGL/eglext.h>
#include <utils/Mutex.h>
+#include <utils/String8.h>
#include <utils/Timers.h>
#include <hardware/hwcomposer_defs.h>
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index dcdd1d0..7e62dae 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -22,6 +22,10 @@
#include <math.h>
#include <dlfcn.h>
+#if defined(HAVE_PTHREADS)
+#include <sys/resource.h>
+#endif
+
#include <EGL/egl.h>
#include <cutils/log.h>
@@ -70,7 +74,6 @@
#include "RenderEngine/RenderEngine.h"
-
#define DISPLAY_COUNT 1
/*
@@ -92,7 +95,7 @@ const String16 sDump("android.permission.DUMP");
// ---------------------------------------------------------------------------
SurfaceFlinger::SurfaceFlinger()
- : BnSurfaceComposer(), Thread(false),
+ : BnSurfaceComposer(),
mTransactionFlags(0),
mTransactionPending(false),
mAnimTransactionPending(false),
@@ -139,14 +142,8 @@ SurfaceFlinger::SurfaceFlinger()
void SurfaceFlinger::onFirstRef()
{
mEventQueue.init(this);
-
- run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY);
-
- // Wait for the main thread to be done with its initialization
- mReadyToRunBarrier.wait();
}
-
SurfaceFlinger::~SurfaceFlinger()
{
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
@@ -414,9 +411,8 @@ success:
return config;
}
+void SurfaceFlinger::init() {
-status_t SurfaceFlinger::readyToRun()
-{
ALOGI( "SurfaceFlinger's main thread ready to run. "
"Initializing graphics H/W...");
@@ -498,16 +494,11 @@ status_t SurfaceFlinger::readyToRun()
// initialize our drawing state
mDrawingState = mCurrentState;
- // We're now ready to accept clients...
- mReadyToRunBarrier.open();
-
// set initial conditions (e.g. unblank default device)
initializeDisplays();
// start boot animation
startBootAnim();
-
- return NO_ERROR;
}
int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
@@ -648,9 +639,13 @@ status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
return res;
}
-bool SurfaceFlinger::threadLoop() {
- waitForEvent();
- return true;
+void SurfaceFlinger::run() {
+#if defined(HAVE_PTHREADS)
+ setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);
+#endif
+ do {
+ waitForEvent();
+ } while (true);
}
void SurfaceFlinger::onVSyncReceived(int type, nsecs_t timestamp) {
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index 0906f80..f746e6b 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -35,7 +35,6 @@
#include <utils/SortedVector.h>
#include <utils/threads.h>
-#include <binder/BinderService.h>
#include <binder/IMemory.h>
#include <ui/PixelFormat.h>
@@ -76,10 +75,8 @@ enum {
eTransactionMask = 0x07
};
-class SurfaceFlinger : public BinderService<SurfaceFlinger>,
- public BnSurfaceComposer,
+class SurfaceFlinger : public BnSurfaceComposer,
private IBinder::DeathRecipient,
- private Thread,
private HWComposer::EventHandler
{
public:
@@ -89,6 +86,12 @@ public:
SurfaceFlinger() ANDROID_API;
+ // must be called before clients can connect
+ void init() ANDROID_API;
+
+ // starts SurfaceFlinger main loop in the current thread
+ void run() ANDROID_API;
+
enum {
EVENT_VSYNC = HWC_EVENT_VSYNC
};
@@ -209,10 +212,8 @@ private:
virtual void binderDied(const wp<IBinder>& who);
/* ------------------------------------------------------------------------
- * Thread interface
+ * RefBase interface
*/
- virtual bool threadLoop();
- virtual status_t readyToRun();
virtual void onFirstRef();
/* ------------------------------------------------------------------------
@@ -447,7 +448,6 @@ private:
// these are thread safe
mutable MessageQueue mEventQueue;
- mutable Barrier mReadyToRunBarrier;
FrameTracker mAnimFrameTracker;
// protected by mDestroyedLayerLock;
diff --git a/services/surfaceflinger/main_surfaceflinger.cpp b/services/surfaceflinger/main_surfaceflinger.cpp
index 8503d4e..a609b6f 100644
--- a/services/surfaceflinger/main_surfaceflinger.cpp
+++ b/services/surfaceflinger/main_surfaceflinger.cpp
@@ -14,7 +14,10 @@
* limitations under the License.
*/
-#include <binder/BinderService.h>
+#include <binder/IServiceManager.h>
+#include <binder/IPCThreadState.h>
+#include <binder/ProcessState.h>
+#include <binder/IServiceManager.h>
#include "SurfaceFlinger.h"
using namespace android;
@@ -23,6 +26,23 @@ int main(int argc, char** argv) {
// When SF is launched in its own process, limit the number of
// binder threads to 4.
ProcessState::self()->setThreadPoolMaxThreadCount(4);
- SurfaceFlinger::publishAndJoinThreadPool(true);
+
+ // 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();
+
+ // publish surface flinger
+ sp<IServiceManager> sm(defaultServiceManager());
+ sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);
+
+ // run in this thread
+ flinger->run();
+
return 0;
}