Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7fb7460f authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change 26691 into eclair

* changes:
  fix [2132563] stuck in boot animation (framebuffer_device_open: Failed to create flip chain)
parents bc5faabd dd3423c6
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@
#include <stdint.h>
#include <sys/types.h>

#include <binder/IBinder.h>

#include <utils/SortedVector.h>
#include <utils/RefBase.h>
#include <utils/threads.h>
@@ -106,6 +108,8 @@ public:
    static ssize_t getDisplayHeight(DisplayID dpy);
    static ssize_t getDisplayOrientation(DisplayID dpy);

    status_t linkToComposerDeath(const sp<IBinder::DeathRecipient>& recipient,
            void* cookie = NULL, uint32_t flags = 0);

private:
    friend class Surface;
+41 −24
Original line number Diff line number Diff line
@@ -62,11 +62,15 @@ static SortedVector<sp<SurfaceComposerClient> > gOpenTransactions;
static sp<IMemoryHeap>                                      gServerCblkMemory;
static volatile surface_flinger_cblk_t*                     gServerCblk;

const sp<ISurfaceComposer>& _get_surface_manager()
static sp<ISurfaceComposer> getComposerService()
{
    sp<ISurfaceComposer> sc;
    Mutex::Autolock _l(gLock);
    if (gSurfaceManager != 0) {
        return gSurfaceManager;
    }
        sc = gSurfaceManager;
    } else {
        // release the lock while we're waiting...
        gLock.unlock();

        sp<IBinder> binder;
        sp<IServiceManager> sm = defaultServiceManager();
@@ -77,19 +81,23 @@ const sp<ISurfaceComposer>& _get_surface_manager()
                usleep(500000); // 0.5 s
            }
        } while(binder == 0);
    sp<ISurfaceComposer> sc(interface_cast<ISurfaceComposer>(binder));

    Mutex::Autolock _l(gLock);
        // grab the lock again for updating gSurfaceManager
        gLock.lock();
        if (gSurfaceManager == 0) {
            sc = interface_cast<ISurfaceComposer>(binder);
            gSurfaceManager = sc;
        } else {
            sc = gSurfaceManager;
        }
    }
    return gSurfaceManager;
    return sc;
}

static volatile surface_flinger_cblk_t const * get_cblk()
{
    if (gServerCblk == 0) {
        const sp<ISurfaceComposer>& sm(_get_surface_manager());
        sp<ISurfaceComposer> sm(getComposerService());
        Mutex::Autolock _l(gLock);
        if (gServerCblk == 0) {
            gServerCblkMemory = sm->getCblk();
@@ -112,7 +120,7 @@ static inline int compare_type( const layer_state_t& lhs,

SurfaceComposerClient::SurfaceComposerClient()
{
    const sp<ISurfaceComposer>& sm(_get_surface_manager());
    sp<ISurfaceComposer> sm(getComposerService());
    if (sm == 0) {
        _init(0, 0);
        return;
@@ -133,6 +141,15 @@ SurfaceComposerClient::SurfaceComposerClient(
    _init(sm, interface_cast<ISurfaceFlingerClient>(conn));
}


status_t SurfaceComposerClient::linkToComposerDeath(
        const sp<IBinder::DeathRecipient>& recipient,
        void* cookie, uint32_t flags)
{
    sp<ISurfaceComposer> sm(getComposerService());
    return sm->asBinder()->linkToDeath(recipient, cookie, flags);    
}

void SurfaceComposerClient::_init(
        const sp<ISurfaceComposer>& sm, const sp<ISurfaceFlingerClient>& conn)
{
@@ -183,7 +200,7 @@ SurfaceComposerClient::clientForConnection(const sp<IBinder>& conn)

    if (client == 0) {
        // Need to make a new client.
        const sp<ISurfaceComposer>& sm(_get_surface_manager());
        sp<ISurfaceComposer> sm(getComposerService());
        client = new SurfaceComposerClient(sm, conn);
        if (client != 0 && client->initCheck() == NO_ERROR) {
            Mutex::Autolock _l(gLock);
@@ -377,7 +394,7 @@ void SurfaceComposerClient::closeGlobalTransaction()
    const size_t N = clients.size();
    VERBOSE("closeGlobalTransaction (%ld clients)", N);

    const sp<ISurfaceComposer>& sm(_get_surface_manager());
    sp<ISurfaceComposer> sm(getComposerService());
    sm->openGlobalTransaction();
    for (size_t i=0; i<N; i++) {
        clients[i]->closeTransaction();
@@ -389,20 +406,20 @@ void SurfaceComposerClient::closeGlobalTransaction()

status_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags)
{
    const sp<ISurfaceComposer>& sm(_get_surface_manager());
    sp<ISurfaceComposer> sm(getComposerService());
    return sm->freezeDisplay(dpy, flags);
}

status_t SurfaceComposerClient::unfreezeDisplay(DisplayID dpy, uint32_t flags)
{
    const sp<ISurfaceComposer>& sm(_get_surface_manager());
    sp<ISurfaceComposer> sm(getComposerService());
    return sm->unfreezeDisplay(dpy, flags);
}

int SurfaceComposerClient::setOrientation(DisplayID dpy, 
        int orientation, uint32_t flags)
{
    const sp<ISurfaceComposer>& sm(_get_surface_manager());
    sp<ISurfaceComposer> sm(getComposerService());
    return sm->setOrientation(dpy, orientation, flags);
}