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

Commit 4616ea8c authored by tazhang's avatar tazhang Committed by Gerrit - the friendly Code Review server
Browse files

Fix HWUI Path Cache dangling pointer

When precache, PathTexture is added to PathCache, and it is released
after drawn if we want to clean it. But the PathCache LRU still
holds the entry of the PathTexture object. When trim the cache in
the end of each frame, LRU finds that its mListener is not NULL and
invoke the functor, however, mListener points to the released
PathTexture object and is a dangling pointer, thus leads to crash.
Smart pointer don't help here since they only manage scopes, while
PathTexture is also controled by its cleanup field.

The fix is to also remove the LRU entry of PathTexture*, it will
also release the texture object and there won't be texture leaks.

Change-Id: Iaa0621df5dc71532e9e75b38ad94384353930b95
parent 6f785860
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -2325,12 +2325,15 @@ void OpenGLRenderer::drawPath(const SkPath* path, const SkPaint* paint) {

    PathTexture* texture = mCaches.pathCache.get(path, paint);
    if (!texture) return;
    const AutoTexture autoCleanup(texture);

    const float x = texture->left - texture->offset;
    const float y = texture->top - texture->offset;

    drawPathTexture(texture, x, y, paint);

    if (texture->cleanup) {
        mCaches.pathCache.remove(path, paint);
    }
    mDirty = true;
}

+7 −0
Original line number Diff line number Diff line
@@ -400,6 +400,13 @@ PathTexture* PathCache::get(const SkPath* path, const SkPaint* paint) {
    return texture;
}

void PathCache::remove(const SkPath* path, const SkPaint* paint)
{
    PathDescription entry(kShapePath, paint);
    entry.shape.path.mGenerationID = path->getGenerationID();
    mCache.remove(entry);
}

void PathCache::precache(const SkPath* path, const SkPaint* paint) {
    if (!Caches::getInstance().tasks.canRunTasks()) {
        return;
+1 −0
Original line number Diff line number Diff line
@@ -201,6 +201,7 @@ public:
    PathTexture* getArc(float width, float height, float startAngle, float sweepAngle,
            bool useCenter, const SkPaint* paint);
    PathTexture* get(const SkPath* path, const SkPaint* paint);
    void         remove(const SkPath* path, const SkPaint* paint);

    /**
     * Removes the specified path. This is meant to be called from threads