summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTreehugger Robot2018-03-23 20:12:08 -0500
committerGerrit Code Review2018-03-23 20:12:08 -0500
commite4a97f23c21663c906177345d4cc5e3567917635 (patch)
treed72950bc314017bb0051c4931e45571de26d4858
parentf292d276c59d690f10691a075d1dba989294cacf (diff)
parent56375fda7c4c03339db742c75bb4cdc2f85827b1 (diff)
downloadplatform-hardware-interfaces-e4a97f23c21663c906177345d4cc5e3567917635.tar.gz
platform-hardware-interfaces-e4a97f23c21663c906177345d4cc5e3567917635.tar.xz
platform-hardware-interfaces-e4a97f23c21663c906177345d4cc5e3567917635.zip
Merge "Fix crash on hotplug disconnect"
-rw-r--r--graphics/composer/2.1/default/ComposerClient.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/graphics/composer/2.1/default/ComposerClient.cpp b/graphics/composer/2.1/default/ComposerClient.cpp
index 4e6dd4f7..8aa9af0e 100644
--- a/graphics/composer/2.1/default/ComposerClient.cpp
+++ b/graphics/composer/2.1/default/ComposerClient.cpp
@@ -299,10 +299,17 @@ Return<void> ComposerClient::createLayer(Display display,
299 Error err = mHal.createLayer(display, &layer); 299 Error err = mHal.createLayer(display, &layer);
300 if (err == Error::NONE) { 300 if (err == Error::NONE) {
301 std::lock_guard<std::mutex> lock(mDisplayDataMutex); 301 std::lock_guard<std::mutex> lock(mDisplayDataMutex);
302
303 auto dpy = mDisplayData.find(display); 302 auto dpy = mDisplayData.find(display);
304 auto ly = dpy->second.Layers.emplace(layer, LayerBuffers()).first; 303 // The display entry may have already been removed by onHotplug.
305 ly->second.Buffers.resize(bufferSlotCount); 304 if (dpy != mDisplayData.end()) {
305 auto ly = dpy->second.Layers.emplace(layer, LayerBuffers()).first;
306 ly->second.Buffers.resize(bufferSlotCount);
307 } else {
308 err = Error::BAD_DISPLAY;
309 // Note: We do not destroy the layer on this error as the hotplug
310 // disconnect invalidates the display id. The implementation should
311 // ensure all layers for the display are destroyed.
312 }
306 } 313 }
307 314
308 hidl_cb(err, layer); 315 hidl_cb(err, layer);
@@ -316,7 +323,10 @@ Return<Error> ComposerClient::destroyLayer(Display display, Layer layer)
316 std::lock_guard<std::mutex> lock(mDisplayDataMutex); 323 std::lock_guard<std::mutex> lock(mDisplayDataMutex);
317 324
318 auto dpy = mDisplayData.find(display); 325 auto dpy = mDisplayData.find(display);
319 dpy->second.Layers.erase(layer); 326 // The display entry may have already been removed by onHotplug.
327 if (dpy != mDisplayData.end()) {
328 dpy->second.Layers.erase(layer);
329 }
320 } 330 }
321 331
322 return err; 332 return err;