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

Commit 1ce7c1d3 authored by Dan Stoza's avatar Dan Stoza Committed by android-build-merger
Browse files

SF: Fix a couple of Layer ref count issues

am: de84eb6b

Change-Id: I779b869d340ce5320f7924ccd6579cada3227899
parents 58719ff7 de84eb6b
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -43,10 +43,7 @@ Client::~Client()
{
    const size_t count = mLayers.size();
    for (size_t i=0 ; i<count ; i++) {
        sp<Layer> layer(mLayers.valueAt(i).promote());
        if (layer != 0) {
            mFlinger->removeLayer(layer);
        }
        mFlinger->removeLayer(mLayers.valueAt(i));
    }
}

+8 −3
Original line number Diff line number Diff line
@@ -1289,9 +1289,14 @@ void Layer::pushPendingState() {
    // If this transaction is waiting on the receipt of a frame, generate a sync
    // point and send it to the remote layer.
    if (mCurrentState.handle != nullptr) {
        sp<Handle> handle = static_cast<Handle*>(mCurrentState.handle.get());
        sp<Layer> handleLayer = handle->owner.promote();
        if (handleLayer == nullptr) {
        sp<IBinder> strongBinder = mCurrentState.handle.promote();
        sp<Handle> handle = nullptr;
        sp<Layer> handleLayer = nullptr;
        if (strongBinder != nullptr) {
            handle = static_cast<Handle*>(strongBinder.get());
            handleLayer = handle->owner.promote();
        }
        if (strongBinder == nullptr || handleLayer == nullptr) {
            ALOGE("[%s] Unable to promote Layer handle", mName.string());
            // If we can't promote the layer we are intended to wait on,
            // then it is expired or otherwise invalid. Allow this transaction
+1 −1
Original line number Diff line number Diff line
@@ -124,7 +124,7 @@ public:

        // If set, defers this state update until the Layer identified by handle
        // receives a frame with the given frameNumber
        sp<IBinder> handle;
        wp<IBinder> handle;
        uint64_t frameNumber;

        // the transparentRegion hint is a bit special, it's latched only
+8 −9
Original line number Diff line number Diff line
@@ -2106,8 +2106,14 @@ status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
    return NO_ERROR;
}

status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) {
status_t SurfaceFlinger::removeLayer(const wp<Layer>& weakLayer) {
    Mutex::Autolock _l(mStateLock);
    sp<Layer> layer = weakLayer.promote();
    if (layer == nullptr) {
        // The layer has already been removed, carry on
        return NO_ERROR;
    }

    ssize_t index = mCurrentState.layersSortedByZ.remove(layer);
    if (index >= 0) {
        mLayersPendingRemoval.push(layer);
@@ -2448,14 +2454,7 @@ status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
{
    // called by ~LayerCleaner() when all references to the IBinder (handle)
    // are gone
    status_t err = NO_ERROR;
    sp<Layer> l(layer.promote());
    if (l != NULL) {
        err = removeLayer(l);
        ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
                "error removing layer=%p (%s)", l.get(), strerror(-err));
    }
    return err;
    return removeLayer(layer);
}

// ---------------------------------------------------------------------------
+1 −1
Original line number Diff line number Diff line
@@ -311,7 +311,7 @@ private:
    status_t onLayerDestroyed(const wp<Layer>& layer);

    // remove a layer from SurfaceFlinger immediately
    status_t removeLayer(const sp<Layer>& layer);
    status_t removeLayer(const wp<Layer>& layer);

    // add a layer to SurfaceFlinger
    status_t addClientLayer(const sp<Client>& client,
Loading