summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLloyd Pique <lpique@google.com>2018-10-09 11:53:39 -0700
committerLloyd Pique <lpique@google.com>2018-10-09 12:22:52 -0700
commit08c66224767ece5fd16d31a34f46d77eed4f7c56 (patch)
treea3870886605d2a77f7590d91653ec60dde116fee
parentd7cf7f4f02900bdfc8374366039a210e61c4e1f7 (diff)
downloadnative-08c66224767ece5fd16d31a34f46d77eed4f7c56.tar.gz
[SF] Fix unittest crash
(Manual cherrypick to aosp) Some of the values passed to HWC2::Display by FakeHwcDisplayInjector as used by the test were passed by reference, with the reference being owned by the injector. However, the lifetime of the injector was effectively temporary, and so the constructed Display instance ended up holding a reference to a dead instance. This patch uses statically constructed default values for those parameters instead, so that the values will not be destroyed. The test code can also still override the values used if non-default values are ever desired. It also adds a comment warning of the possibility so it hopefully does not happen again. Bug: 111454533 Bug: 117451794 Test: atest libsurfaceflinger_unittest # On aosp_cf_x86_phone-userdebug Change-Id: I8dfe6e31111a558a7892f0eef91bd96b8dd71f59 Merged-In: I8dfe6e31111a558a7892f0eef91bd96b8dd71f59
-rw-r--r--services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h15
1 files changed, 11 insertions, 4 deletions
diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
index f1556d8bc7..eec505ec58 100644
--- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
+++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
@@ -211,13 +211,20 @@ public:
return *this;
}
- auto& addCapability(HWC2::Capability cap) {
- mCapabilities.emplace(cap);
+ auto& setCapabilities(const std::unordered_set<HWC2::Capability>* capabilities) {
+ mCapabilities = capabilities;
return *this;
}
void inject(TestableSurfaceFlinger* flinger, Hwc2::Composer* composer) {
- auto display = std::make_unique<HWC2Display>(*composer, mCapabilities, mHwcDisplayId,
+ static const std::unordered_set<HWC2::Capability> defaultCapabilities;
+ if (mCapabilities == nullptr) mCapabilities = &defaultCapabilities;
+
+ // Caution - Make sure that any values passed by reference here do
+ // not refer to an instance owned by FakeHwcDisplayInjector. This
+ // class has temporary lifetime, while the constructed HWC2::Display
+ // is much longer lived.
+ auto display = std::make_unique<HWC2Display>(*composer, *mCapabilities, mHwcDisplayId,
mHwcDisplayType);
auto config = HWC2::Display::Config::Builder(*display, mActiveConfig);
@@ -247,7 +254,7 @@ public:
int32_t mDpiX = DEFAULT_DPI;
int32_t mDpiY = DEFAULT_DPI;
int32_t mActiveConfig = DEFAULT_ACTIVE_CONFIG;
- std::unordered_set<HWC2::Capability> mCapabilities;
+ const std::unordered_set<HWC2::Capability>* mCapabilities = nullptr;
};
class FakeDisplayDeviceInjector {