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

Commit 38f8d9d7 authored by Jason Sams's avatar Jason Sams Committed by Stephen Hines
Browse files

Correctly free resouces bound to scripts when the scripts are deleted.

Change-Id: Idfcc30f1a7de0badeb6d8254ed508938d89f4070
b: 3381615
parent 64a2c359
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -528,6 +528,7 @@ void * Context::threadProc(void *vrsc) {

void Context::destroyWorkerThreadResources() {
    //LOGV("destroyWorkerThreadResources 1");
    ObjectBase::zeroAllUserRef(this);
    if (mIsGraphicsContext) {
         mRaster.clear();
         mFragment.clear();
@@ -542,7 +543,6 @@ void Context::destroyWorkerThreadResources() {
         mStateFont.deinit(this);
         mShaderCache.cleanupAll();
    }
    ObjectBase::zeroAllUserRef(this);
    //LOGV("destroyWorkerThreadResources 2");
    mExit = true;
}
+9 −12
Original line number Diff line number Diff line
@@ -74,6 +74,15 @@ bool Font::init(const char *name, float fontSize, uint32_t dpi, const void *data
    return true;
}

void Font::preDestroy() const {
    for (uint32_t ct = 0; ct < mRSC->mStateFont.mActiveFonts.size(); ct++) {
        if (mRSC->mStateFont.mActiveFonts[ct] == this) {
            mRSC->mStateFont.mActiveFonts.removeAt(ct);
            break;
        }
    }
}

void Font::invalidateTextureCache() {
    for (uint32_t i = 0; i < mCachedGlyphs.size(); i ++) {
        mCachedGlyphs.valueAt(i)->mIsValid = false;
@@ -309,13 +318,6 @@ Font::~Font() {
        FT_Done_Face(mFace);
    }

    for (uint32_t ct = 0; ct < mRSC->mStateFont.mActiveFonts.size(); ct++) {
        if (mRSC->mStateFont.mActiveFonts[ct] == this) {
            mRSC->mStateFont.mActiveFonts.removeAt(ct);
            break;
        }
    }

    for (uint32_t i = 0; i < mCachedGlyphs.size(); i ++) {
        CachedGlyphInfo *glyph = mCachedGlyphs.valueAt(i);
        delete glyph;
@@ -799,11 +801,6 @@ void FontState::deinit(Context *rsc) {

    mDefault.clear();

    Vector<Font*> fontsToDereference = mActiveFonts;
    for (uint32_t i = 0; i < fontsToDereference.size(); i ++) {
        fontsToDereference[i]->zeroUserRef();
    }

    if (mLibrary) {
        FT_Done_FreeType( mLibrary );
        mLibrary = NULL;
+1 −0
Original line number Diff line number Diff line
@@ -119,6 +119,7 @@ protected:
    Font(Context *rsc);
    bool init(const char *name, float fontSize, uint32_t dpi, const void *data = NULL, uint32_t dataLen = 0);

    virtual void preDestroy() const;
    FT_Face mFace;
    bool mInitialized;
    bool mHasKerning;
+0 −2
Original line number Diff line number Diff line
@@ -78,8 +78,6 @@ void Script::setVarObj(uint32_t slot, ObjectBase *val) {
            (*destPtr)->decSysRef();
        }
        *destPtr = val;
    } else {
        LOGV("Calling setVarObj on slot = %i which is null.  This is dangerous because the script will not hold a ref count on the object.", slot);
    }
}

+21 −3
Original line number Diff line number Diff line
@@ -94,16 +94,24 @@ char *genCacheFileName(const char *cacheDir,
}

ScriptC::ScriptC(Context *rsc) : Script(rsc) {
    LOGD(">>>> ScriptC ctor called, obj=%p", this);
    mBccScript = NULL;
    memset(&mProgram, 0, sizeof(mProgram));
}

ScriptC::~ScriptC() {
    LOGD(">>>> ~ScriptC() mBccScript = %p", mBccScript);
    if (mBccScript) {
        if (mProgram.mObjectSlotList) {
            for (size_t ct=0; ct < mProgram.mObjectSlotCount; ct++) {
                setVarObj(mProgram.mObjectSlotList[ct], NULL);
            }
            delete [] mProgram.mObjectSlotList;
            mProgram.mObjectSlotList = NULL;
            mProgram.mObjectSlotCount = 0;
        }


        LOGD(">>>> ~ScriptC  bccDisposeScript(%p)", mBccScript);
        bccDisposeScript(mBccScript);
        LOGD(">>>> ~ScriptC(mBCCScript)");
    }
    free(mEnviroment.mScriptText);
    mEnviroment.mScriptText = NULL;
@@ -589,6 +597,16 @@ bool ScriptCState::runCompiler(Context *rsc,
            return false;
        }
    }

    size_t objectSlotCount = bccGetObjectSlotCount(s->mBccScript);
    uint32_t *objectSlots = NULL;
    if (objectSlotCount) {
        objectSlots = new uint32_t[objectSlotCount];
        bccGetObjectSlotList(s->mBccScript, objectSlotCount, objectSlots);
        s->mProgram.mObjectSlotList = objectSlots;
        s->mProgram.mObjectSlotCount = objectSlotCount;
    }

    return true;
}

Loading