summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/surfaceflinger/Client.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/services/surfaceflinger/Client.cpp b/services/surfaceflinger/Client.cpp
index a69940a42e..0c9f0e21e1 100644
--- a/services/surfaceflinger/Client.cpp
+++ b/services/surfaceflinger/Client.cpp
@@ -47,12 +47,21 @@ Client::Client(const sp<SurfaceFlinger>& flinger, const sp<Layer>& parentLayer)
Client::~Client()
{
+ // We need to post a message to remove our remaining layers rather than
+ // do so directly by acquiring the SurfaceFlinger lock. If we were to
+ // attempt to directly call the lock it becomes effectively impossible
+ // to use sp<Client> while holding the SF lock as descoping it could
+ // then trigger a dead-lock.
+
const size_t count = mLayers.size();
for (size_t i=0 ; i<count ; i++) {
sp<Layer> l = mLayers.valueAt(i).promote();
- if (l != nullptr) {
- mFlinger->removeLayer(l);
+ if (l == nullptr) {
+ continue;
}
+ mFlinger->postMessageAsync(new LambdaMessage([flinger = mFlinger, l]() {
+ flinger->removeLayer(l);
+ }));
}
}