diff options
author | Treehugger Robot | 2018-03-23 20:12:08 -0500 |
---|---|---|
committer | Gerrit Code Review | 2018-03-23 20:12:08 -0500 |
commit | e4a97f23c21663c906177345d4cc5e3567917635 (patch) | |
tree | d72950bc314017bb0051c4931e45571de26d4858 | |
parent | f292d276c59d690f10691a075d1dba989294cacf (diff) | |
parent | 56375fda7c4c03339db742c75bb4cdc2f85827b1 (diff) | |
download | platform-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.cpp | 18 |
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; |