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

Commit 91f635ea authored by Dominik Laskowski's avatar Dominik Laskowski
Browse files

SF: Fix leak in unit tests

Remove the sp<SurfaceFlinger> cycle in WindowInfosListenerInvoker, such
that TestableSurfaceFlinger can delete its SurfaceFlinger instance.

Also, remove the indirection for the windowInfosReported callback.

Bug: 213688734
Test: No spam/aborts regarding leaks.
Change-Id: I50450881e8a37ff64dab12bf6afe02711cdd93b7
parent 08843dfa
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -385,7 +385,7 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag)
        mInternalDisplayDensity(getDensityFromProperty("ro.sf.lcd_density", true)),
        mEmulatedDisplayDensity(getDensityFromProperty("qemu.sf.lcd_density", false)),
        mPowerAdvisor(*this),
        mWindowInfosListenerInvoker(new WindowInfosListenerInvoker(this)) {
        mWindowInfosListenerInvoker(sp<WindowInfosListenerInvoker>::make(*this)) {
    ALOGI("Using HWComposer service: %s", mHwcServiceName.c_str());
}

+10 −13
Original line number Diff line number Diff line
@@ -25,24 +25,21 @@ using gui::DisplayInfo;
using gui::IWindowInfosListener;
using gui::WindowInfo;

struct WindowInfosReportedListener : gui::BnWindowInfosReportedListener {
    explicit WindowInfosReportedListener(std::function<void()> listenerCb)
          : mListenerCb(listenerCb) {}
struct WindowInfosListenerInvoker::WindowInfosReportedListener
      : gui::BnWindowInfosReportedListener {
    explicit WindowInfosReportedListener(WindowInfosListenerInvoker& invoker) : mInvoker(invoker) {}

    binder::Status onWindowInfosReported() override {
        if (mListenerCb != nullptr) {
            mListenerCb();
        }
        mInvoker.windowInfosReported();
        return binder::Status::ok();
    }

    std::function<void()> mListenerCb;
    WindowInfosListenerInvoker& mInvoker;
};

WindowInfosListenerInvoker::WindowInfosListenerInvoker(const sp<SurfaceFlinger>& sf) : mSf(sf) {
    mWindowInfosReportedListener =
            new WindowInfosReportedListener([&]() { windowInfosReported(); });
}
WindowInfosListenerInvoker::WindowInfosListenerInvoker(SurfaceFlinger& flinger)
      : mFlinger(flinger),
        mWindowInfosReportedListener(sp<WindowInfosReportedListener>::make(*this)) {}

void WindowInfosListenerInvoker::addWindowInfosListener(
        const sp<IWindowInfosListener>& windowInfosListener) {
@@ -91,7 +88,7 @@ void WindowInfosListenerInvoker::windowInfosChanged(const std::vector<WindowInfo
void WindowInfosListenerInvoker::windowInfosReported() {
    mCallbacksPending--;
    if (mCallbacksPending == 0) {
        mSf->windowInfosReported();
        mFlinger.windowInfosReported();
    }
}

+6 −3
Original line number Diff line number Diff line
@@ -31,7 +31,8 @@ class SurfaceFlinger;

class WindowInfosListenerInvoker : public IBinder::DeathRecipient {
public:
    WindowInfosListenerInvoker(const sp<SurfaceFlinger>& sf);
    explicit WindowInfosListenerInvoker(SurfaceFlinger&);

    void addWindowInfosListener(const sp<gui::IWindowInfosListener>& windowInfosListener);
    void removeWindowInfosListener(const sp<gui::IWindowInfosListener>& windowInfosListener);

@@ -42,13 +43,15 @@ protected:
    void binderDied(const wp<IBinder>& who) override;

private:
    struct WindowInfosReportedListener;
    void windowInfosReported();

    const sp<SurfaceFlinger> mSf;
    SurfaceFlinger& mFlinger;
    std::mutex mListenersMutex;
    std::unordered_map<wp<IBinder>, const sp<gui::IWindowInfosListener>, WpHash>
            mWindowInfosListeners GUARDED_BY(mListenersMutex);
    sp<gui::IWindowInfosReportedListener> mWindowInfosReportedListener;
    std::atomic<size_t> mCallbacksPending{0};
};

} // namespace android