Ignore:
Timestamp:
Nov 12, 2006, 3:47:25 AM (19 years ago)
Author:
bird
Message:

the simple testcase works.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdrDyldMod.c

    r2868 r2869  
    567567    uint32_t        i;
    568568
    569     KLDRDYLDMOD_ASSERT(pMod->papPrereqs);
     569    KLDRDYLDMOD_ASSERT(pMod->papPrereqs || !pMod->cPrereqs);
    570570
    571571    /*
     
    584584            pMod2->cDepRefs--;
    585585            pMod2->cRefs--;
    586             cToUnload += !pMod2->cRefs;
     586            cToUnload += !pMod2->cDepRefs && !pMod2->cDynRefs;
    587587        }
    588588    }
     
    661661        for (pMod = kLdrDyldHead; pMod; pMod = pMod->Load.pNext)
    662662        {
    663             if (    pMod->cRefs
     663            if (    pMod->cDepRefs
     664                ||  pMod->cDynRefs
    664665                ||  pMod->enmState >= KLDRSTATE_PENDING_TERMINATION
    665666                ||  pMod->enmState < KLDRSTATE_LOADED_PREREQUISITES)
     
    760761
    761762    /* sanity */
    762     KLDRDYLDMOD_ASSERT(pMod->cRefs > 0);
    763763    KLDRDYLDMOD_ASSERT(pMod->enmState == KLDRSTATE_OPEN);
    764764    KLDRDYLDMOD_ASSERT(!pMod->fMapped);
     
    10031003    int rc;
    10041004
    1005     KLDRDYLDMOD_ASSERT(pMod->enmState == KLDRSTATE_INITIALIZING);
    1006 
     1005    KLDRDYLDMOD_ASSERT(pMod->enmState == KLDRSTATE_PENDING_INITIALIZATION);
     1006
     1007    pMod->enmState = KLDRSTATE_INITIALIZING;
    10071008    rc = kLdrModCallInit(pMod->pMod, (uintptr_t)pMod->hMod);
    10081009    if (!rc)
     1010    {
    10091011        pMod->enmState = KLDRSTATE_GOOD;
     1012        /* push it onto the termination list.*/
     1013        pMod->InitTerm.pPrev = NULL;
     1014        pMod->InitTerm.pNext = g_pkLdrDyldTermHead;
     1015        if (g_pkLdrDyldTermHead)
     1016            g_pkLdrDyldTermHead->InitTerm.pPrev = pMod;
     1017        else
     1018            g_pkLdrDyldTermTail = pMod;
     1019        g_pkLdrDyldTermHead = pMod;
     1020    }
    10101021    else
    10111022        pMod->enmState = KLDRSTATE_INITIALIZATION_FAILED;
     
    10241035void kldrDyldModCallTerm(PKLDRDYLDMOD pMod)
    10251036{
    1026     KLDRDYLDMOD_ASSERT(pMod->enmState == KLDRSTATE_TERMINATING);
    1027 
     1037    KLDRDYLDMOD_ASSERT(pMod->enmState == KLDRSTATE_PENDING_TERMINATION);
     1038
     1039    pMod->enmState = KLDRSTATE_TERMINATING;
    10281040    kLdrModCallTerm(pMod->pMod, (uintptr_t)pMod->hMod);
    10291041    pMod->enmState = KLDRSTATE_PENDING_GC;
     1042    /* unlinking on destruction. */
    10301043}
    10311044
Note: See TracChangeset for help on using the changeset viewer.