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

Commit 8835aeae authored by Lloyd Pique's avatar Lloyd Pique Committed by android-build-merger
Browse files

Merge "Fix crash on hotplug disconnect"

am: e4a97f23

Change-Id: Id4e07f31f399bfb6f236155435fbcfe6464c5b49
parents a315e23f e4a97f23
Loading
Loading
Loading
Loading
+14 −4
Original line number Original line Diff line number Diff line
@@ -299,10 +299,17 @@ Return<void> ComposerClient::createLayer(Display display,
    Error err = mHal.createLayer(display, &layer);
    Error err = mHal.createLayer(display, &layer);
    if (err == Error::NONE) {
    if (err == Error::NONE) {
        std::lock_guard<std::mutex> lock(mDisplayDataMutex);
        std::lock_guard<std::mutex> lock(mDisplayDataMutex);

        auto dpy = mDisplayData.find(display);
        auto dpy = mDisplayData.find(display);
        // The display entry may have already been removed by onHotplug.
        if (dpy != mDisplayData.end()) {
            auto ly = dpy->second.Layers.emplace(layer, LayerBuffers()).first;
            auto ly = dpy->second.Layers.emplace(layer, LayerBuffers()).first;
            ly->second.Buffers.resize(bufferSlotCount);
            ly->second.Buffers.resize(bufferSlotCount);
        } else {
            err = Error::BAD_DISPLAY;
            // Note: We do not destroy the layer on this error as the hotplug
            // disconnect invalidates the display id. The implementation should
            // ensure all layers for the display are destroyed.
        }
    }
    }


    hidl_cb(err, layer);
    hidl_cb(err, layer);
@@ -316,8 +323,11 @@ Return<Error> ComposerClient::destroyLayer(Display display, Layer layer)
        std::lock_guard<std::mutex> lock(mDisplayDataMutex);
        std::lock_guard<std::mutex> lock(mDisplayDataMutex);


        auto dpy = mDisplayData.find(display);
        auto dpy = mDisplayData.find(display);
        // The display entry may have already been removed by onHotplug.
        if (dpy != mDisplayData.end()) {
            dpy->second.Layers.erase(layer);
            dpy->second.Layers.erase(layer);
        }
        }
    }


    return err;
    return err;
}
}