Skip to content

Commit 97dc917

Browse files
author
Romain Guy
committed
Avoid deadlock when deleting layers
Bug #7217459 Change-Id: I12bfa6c30c5030bd1b23ea6a3ce64240ab1dfba3
1 parent 4285de3 commit 97dc917

File tree

4 files changed

+18
-9
lines changed

4 files changed

+18
-9
lines changed

libs/hwui/Layer.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,13 @@ Layer::~Layer() {
5050
deleteTexture();
5151
}
5252

53+
void Layer::freeResourcesLocked() {
54+
if (colorFilter) {
55+
Caches::getInstance().resourceCache.decrementRefcountLocked(colorFilter);
56+
colorFilter = NULL;
57+
}
58+
}
59+
5360
void Layer::setPaint(SkPaint* paint) {
5461
OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode);
5562
}

libs/hwui/Layer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,11 @@ class DisplayList;
4545
* A layer has dimensions and is backed by an OpenGL texture or FBO.
4646
*/
4747
struct Layer {
48-
4948
Layer(const uint32_t layerWidth, const uint32_t layerHeight);
5049
~Layer();
5150

51+
void freeResourcesLocked();
52+
5253
/**
5354
* Sets this layer's region to a rectangle. Computes the appropriate
5455
* texture coordinates.

libs/hwui/ResourceCache.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ void ResourceCache::decrementRefcountLocked(void* resource) {
155155
}
156156
ref->refCount--;
157157
if (ref->refCount == 0) {
158-
deleteResourceReference(resource, ref);
158+
deleteResourceReferenceLocked(resource, ref);
159159
}
160160
}
161161

@@ -201,7 +201,7 @@ void ResourceCache::destructorLocked(SkPath* resource) {
201201
}
202202
ref->destroyed = true;
203203
if (ref->refCount == 0) {
204-
deleteResourceReference(resource, ref);
204+
deleteResourceReferenceLocked(resource, ref);
205205
}
206206
}
207207

@@ -223,7 +223,7 @@ void ResourceCache::destructorLocked(SkBitmap* resource) {
223223
}
224224
ref->destroyed = true;
225225
if (ref->refCount == 0) {
226-
deleteResourceReference(resource, ref);
226+
deleteResourceReferenceLocked(resource, ref);
227227
}
228228
}
229229

@@ -242,7 +242,7 @@ void ResourceCache::destructorLocked(SkiaShader* resource) {
242242
}
243243
ref->destroyed = true;
244244
if (ref->refCount == 0) {
245-
deleteResourceReference(resource, ref);
245+
deleteResourceReferenceLocked(resource, ref);
246246
}
247247
}
248248

@@ -261,7 +261,7 @@ void ResourceCache::destructorLocked(SkiaColorFilter* resource) {
261261
}
262262
ref->destroyed = true;
263263
if (ref->refCount == 0) {
264-
deleteResourceReference(resource, ref);
264+
deleteResourceReferenceLocked(resource, ref);
265265
}
266266
}
267267

@@ -284,15 +284,15 @@ void ResourceCache::recycleLocked(SkBitmap* resource) {
284284
}
285285
ref->recycled = true;
286286
if (ref->refCount == 0) {
287-
deleteResourceReference(resource, ref);
287+
deleteResourceReferenceLocked(resource, ref);
288288
}
289289
}
290290

291291
/**
292292
* This method should only be called while the mLock mutex is held (that mutex is grabbed
293293
* by the various destructor() and recycle() methods which call this method).
294294
*/
295-
void ResourceCache::deleteResourceReference(void* resource, ResourceReference* ref) {
295+
void ResourceCache::deleteResourceReferenceLocked(void* resource, ResourceReference* ref) {
296296
if (ref->recycled && ref->resourceType == kBitmap) {
297297
((SkBitmap*) resource)->setPixels(NULL, NULL);
298298
}
@@ -326,6 +326,7 @@ void ResourceCache::deleteResourceReference(void* resource, ResourceReference* r
326326
break;
327327
case kLayer: {
328328
Layer* layer = (Layer*) resource;
329+
layer->freeResourcesLocked();
329330
delete layer;
330331
}
331332
break;

libs/hwui/ResourceCache.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class ANDROID_API ResourceCache {
103103
void recycleLocked(SkBitmap* resource);
104104

105105
private:
106-
void deleteResourceReference(void* resource, ResourceReference* ref);
106+
void deleteResourceReferenceLocked(void* resource, ResourceReference* ref);
107107

108108
void incrementRefcount(void* resource, ResourceType resourceType);
109109
void incrementRefcountLocked(void* resource, ResourceType resourceType);

0 commit comments

Comments
 (0)