Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b3292ce authored by Romain Guy's avatar Romain Guy Committed by Android (Google) Code Review
Browse files

Merge "Avoid deadlock when deleting layers Bug #7217459" into jb-mr1-dev

parents 916b2b5a 97dc9172
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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);
}
+2 −1
Original line number Diff line number Diff line
@@ -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.
+8 −7
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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);