Ignore:
Timestamp:
Oct 28, 2006, 5:59:21 AM (19 years ago)
Author:
bird
Message:

in progress...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdrDyldMod.c

    r2835 r2837  
    3535
    3636
     37/*******************************************************************************
     38*   Defined Constants And Macros                                               *
     39*******************************************************************************/
     40/** @def KLDRDYLDMOD_ASSERT
     41 * Assert that an expression is true when KLDRDYLD_STRICT is defined.
     42 */
     43#ifdef KLDRDYLD_STRICT
     44# define KLDRDYLDMOD_ASSERT(expr)  kldrHlpAssert(expr)
     45#else
     46# define KLDRDYLDMOD_ASSERT(expr)  do {} while (0)
     47#endif
    3748
    3849
    3950
     51
     52void kldrDyldModUnloadPrerequisites(PKLDRDYLDMOD pMod)
     53{
     54
     55}
     56
     57
     58void kldrDyldModDeref(PKLDRDYLDMOD pMod)
     59{
     60    /* validate input */
     61    KLDRDYLDMOD_ASSERT(pMod->enmState > KLDRSTATE_INVALID && pMod->enmState < KLDRSTATE_END);
     62    KLDRDYLDMOD_ASSERT(pMod->cRefs > 0);
     63    KLDRDYLDMOD_ASSERT(pMod->cRefs >= pMod->cDepRefs + pMod->cDynRefs);
     64
     65    /* decrement. */
     66    if (pMod->cRefs > 0)
     67        pMod->cRefs--;
     68
     69    /*
     70     * Drop prerequisites for stats that implies that no recursion can have taken place yet.
     71     * This ASSUMES that we're only dereferencing modules when an operation completes.
     72     * (This is *required* for the reloaded state.)
     73     */
     74    switch (pMod->enmState)
     75    {
     76        case KLDRSTATE_MAPPED:
     77        case KLDRSTATE_LOADED_PREREQUISITES:
     78        case KLDRSTATE_FIXED_UP:
     79        case KLDRSTATE_RELOADED:
     80            kldrDyldModUnloadPrerequisites(pMod);
     81            pMod->enmState = KLDRSTATE_PENDING_GC;
     82            break;
     83
     84        case KLDRSTATE_PENDING_INITIALIZATION:
     85        case KLDRSTATE_INITIALIZING:
     86        case KLDRSTATE_GOOD:
     87        case KLDRSTATE_PENDING_TERMINATION:
     88        case KLDRSTATE_TERMINATING:
     89        case KLDRSTATE_PENDING_GC:
     90        case KLDRSTATE_GC:
     91        case KLDRSTATE_PENDING_DESTROY:
     92            break;
     93
     94        default:
     95            KLDRDYLDMOD_ASSERT(!"Invalid deref state");
     96            break;
     97    }
     98
     99    /*
     100     * Also drop prerequisites if noone is referencing the module.
     101     */
     102    if (!pMod->cDepRefs && !pMod->cDynRefs)
     103    {
     104        switch (pMod->enmState)
     105        {
     106            case KLDRSTATE_MAPPED:
     107            case KLDRSTATE_LOADED_PREREQUISITES:
     108            case KLDRSTATE_FIXED_UP:
     109            case KLDRSTATE_RELOADED:
     110                /* already dropped. */
     111                break;
     112
     113            case KLDRSTATE_PENDING_INITIALIZATION:
     114                kldrDyldModUnloadPrerequisites(pMod);
     115                pMod->enmState = KLDRSTATE_PENDING_GC;
     116                break;
     117
     118            case KLDRSTATE_GOOD:
     119                pMod->enmState = KLDRSTATE_PENDING_TERMINATION;
     120            case KLDRSTATE_PENDING_TERMINATION:
     121            case KLDRSTATE_PENDING_GC:
     122                kldrDyldModUnloadPrerequisites(pMod);
     123                break;
     124
     125            case KLDRSTATE_TERMINATING:
     126            case KLDRSTATE_GC:
     127            case KLDRSTATE_PENDING_DESTROY:
     128                break;
     129
     130            default:
     131                KLDRDYLDMOD_ASSERT(!"Invalid deref state (b)");
     132                break;
     133        }
     134    }
     135
     136    /*
     137     * If there are no references whatsoever now and the module
     138     * is pending destruction, destroy it.
     139     */
     140    if (    !pMod->cRefs
     141        &&  (   pMod->enmState == KLDRSTATE_PENDING_DESTROY
     142             || pMod->enmState == KLDRSTATE_GC))
     143        kldrDyldModDestroy(pMod);
     144}
Note: See TracChangeset for help on using the changeset viewer.