don't kill surfaceflinger when system process dies

Change-Id: I2d3ed87b590f9ccea3fa4af41d92911de070b315
This commit is contained in:
Mathias Agopian 2011-07-01 17:08:43 -07:00
parent 277950e699
commit 1f339ff387
3 changed files with 35 additions and 0 deletions

View File

@ -103,6 +103,11 @@ void DisplayHardware::init(uint32_t dpy)
{
mNativeWindow = new FramebufferNativeWindow();
framebuffer_device_t const * fbDev = mNativeWindow->getDevice();
if (!fbDev) {
LOGE("Display subsystem failed to initialize. check logs. exiting...");
exit(0);
}
mDpiX = mNativeWindow->xdpi;
mDpiY = mNativeWindow->ydpi;
mRefreshRate = fbDev->fps;

View File

@ -163,9 +163,34 @@ void SurfaceFlinger::bootFinished()
const nsecs_t duration = now - mBootTime;
LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
mBootFinished = true;
// wait patiently for the window manager death
const String16 name("window");
sp<IBinder> window(defaultServiceManager()->getService(name));
if (window != 0) {
window->linkToDeath(this);
}
// stop boot animation
property_set("ctl.stop", "bootanim");
}
void SurfaceFlinger::binderDied(const wp<IBinder>& who)
{
// the window manager died on us. prepare its eulogy.
// unfreeze the screen in case it was... frozen
mFreezeDisplayTime = 0;
mFreezeCount = 0;
mFreezeDisplay = false;
// reset screen orientation
setOrientation(0, eOrientationDefault, 0);
// restart the boot-animation
property_set("ctl.start", "bootanim");
}
void SurfaceFlinger::onFirstRef()
{
run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY);

View File

@ -147,6 +147,7 @@ enum {
class SurfaceFlinger :
public BinderService<SurfaceFlinger>,
public BnSurfaceComposer,
public IBinder::DeathRecipient,
protected Thread
{
public:
@ -192,6 +193,10 @@ public:
sp<Layer> getLayer(const sp<ISurface>& sur) const;
private:
// DeathRecipient interface
virtual void binderDied(const wp<IBinder>& who);
private:
friend class Client;
friend class LayerBase;