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

Commit 6059c395 authored by Stephen Hines's avatar Stephen Hines Committed by Android Git Automerger
Browse files

am 55f8f121: Merge "Correctly free resouces bound to scripts when the scripts...

am 55f8f121: Merge "Correctly free resouces bound to scripts when the scripts are deleted." into honeycomb

* commit '55f8f121':
  Correctly free resouces bound to scripts when the scripts are deleted.
parents 1bc3cbbf 55f8f121
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