Merge "Avoid deadlock when deleting layers Bug #7217459" into jb-mr1-dev
This commit is contained in:
@@ -50,6 +50,13 @@ Layer::~Layer() {
|
||||
deleteTexture();
|
||||
}
|
||||
|
||||
void Layer::freeResourcesLocked() {
|
||||
if (colorFilter) {
|
||||
Caches::getInstance().resourceCache.decrementRefcountLocked(colorFilter);
|
||||
colorFilter = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void Layer::setPaint(SkPaint* paint) {
|
||||
OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode);
|
||||
}
|
||||
|
||||
@@ -45,10 +45,11 @@ class DisplayList;
|
||||
* A layer has dimensions and is backed by an OpenGL texture or FBO.
|
||||
*/
|
||||
struct Layer {
|
||||
|
||||
Layer(const uint32_t layerWidth, const uint32_t layerHeight);
|
||||
~Layer();
|
||||
|
||||
void freeResourcesLocked();
|
||||
|
||||
/**
|
||||
* Sets this layer's region to a rectangle. Computes the appropriate
|
||||
* texture coordinates.
|
||||
|
||||
@@ -155,7 +155,7 @@ void ResourceCache::decrementRefcountLocked(void* resource) {
|
||||
}
|
||||
ref->refCount--;
|
||||
if (ref->refCount == 0) {
|
||||
deleteResourceReference(resource, ref);
|
||||
deleteResourceReferenceLocked(resource, ref);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,7 +201,7 @@ void ResourceCache::destructorLocked(SkPath* resource) {
|
||||
}
|
||||
ref->destroyed = true;
|
||||
if (ref->refCount == 0) {
|
||||
deleteResourceReference(resource, ref);
|
||||
deleteResourceReferenceLocked(resource, ref);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -223,7 +223,7 @@ void ResourceCache::destructorLocked(SkBitmap* resource) {
|
||||
}
|
||||
ref->destroyed = true;
|
||||
if (ref->refCount == 0) {
|
||||
deleteResourceReference(resource, ref);
|
||||
deleteResourceReferenceLocked(resource, ref);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -242,7 +242,7 @@ void ResourceCache::destructorLocked(SkiaShader* resource) {
|
||||
}
|
||||
ref->destroyed = true;
|
||||
if (ref->refCount == 0) {
|
||||
deleteResourceReference(resource, ref);
|
||||
deleteResourceReferenceLocked(resource, ref);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -261,7 +261,7 @@ void ResourceCache::destructorLocked(SkiaColorFilter* resource) {
|
||||
}
|
||||
ref->destroyed = true;
|
||||
if (ref->refCount == 0) {
|
||||
deleteResourceReference(resource, ref);
|
||||
deleteResourceReferenceLocked(resource, ref);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -284,7 +284,7 @@ void ResourceCache::recycleLocked(SkBitmap* resource) {
|
||||
}
|
||||
ref->recycled = true;
|
||||
if (ref->refCount == 0) {
|
||||
deleteResourceReference(resource, ref);
|
||||
deleteResourceReferenceLocked(resource, ref);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -292,7 +292,7 @@ void ResourceCache::recycleLocked(SkBitmap* resource) {
|
||||
* This method should only be called while the mLock mutex is held (that mutex is grabbed
|
||||
* by the various destructor() and recycle() methods which call this method).
|
||||
*/
|
||||
void ResourceCache::deleteResourceReference(void* resource, ResourceReference* ref) {
|
||||
void ResourceCache::deleteResourceReferenceLocked(void* resource, ResourceReference* ref) {
|
||||
if (ref->recycled && ref->resourceType == kBitmap) {
|
||||
((SkBitmap*) resource)->setPixels(NULL, NULL);
|
||||
}
|
||||
@@ -326,6 +326,7 @@ void ResourceCache::deleteResourceReference(void* resource, ResourceReference* r
|
||||
break;
|
||||
case kLayer: {
|
||||
Layer* layer = (Layer*) resource;
|
||||
layer->freeResourcesLocked();
|
||||
delete layer;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -103,7 +103,7 @@ public:
|
||||
void recycleLocked(SkBitmap* resource);
|
||||
|
||||
private:
|
||||
void deleteResourceReference(void* resource, ResourceReference* ref);
|
||||
void deleteResourceReferenceLocked(void* resource, ResourceReference* ref);
|
||||
|
||||
void incrementRefcount(void* resource, ResourceType resourceType);
|
||||
void incrementRefcountLocked(void* resource, ResourceType resourceType);
|
||||
|
||||
Reference in New Issue
Block a user