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

Commit 6118ea4d authored by Lloyd Pique's avatar Lloyd Pique Committed by Android (Google) Code Review
Browse files

Merge "Fix crash on hotplug disconnect"

parents 6327b866 2765f9d4
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;
}
}