Changeset 2845 for trunk/kLdr/kLdrDyld.c


Ignore:
Timestamp:
Nov 1, 2006, 2:39:03 AM (19 years ago)
Author:
bird
Message:

kldrDyldMod* in progress.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdrDyld.c

    r2843 r2845  
    168168static int          kldrDyldStackAddModule(PKLDRDYLDMOD pMod);
    169169static int          kldrDyldStackFrameCompleted(void);
     170static void         kldrDyldStackCleanupOne(PKLDRDYLDMOD pMod, int rc);
    170171static void         kldrDyldStackDropFrame(uint32_t iLoad1st, uint32_t iLoadEnd, int rc);
    171172/** @} */
     
    627628        rc = kldrDyldDoLoad2(*ppMod, pszPrefix, pszSuffix, enmSearch, fFlags);
    628629    else
    629     {
    630         /** @todo this is probably not quite right. */
    631         /* If the reference count is 0 do a quick ref/deref to trigger destruction. */
    632         kldrDyldModAddRef(*ppMod);
    633         kldrDyldModDeref(*ppMod);
    634     }
     630        kldrDyldStackCleanupOne(*ppMod, rc);
    635631
    636632    /*
     
    656652    int rc = kldrDyldDoLoadPrerequisites(pLoadedMod, pszPrefix, pszSuffix, enmSearch, fFlags);
    657653    uint32_t iLoadEnd = kldrDyldStackFrameCompleted();
     654    if (rc)
     655        kldrDyldStackCleanupOne(pLoadedMod, rc); /* in case it didn't get pushed onto the stack. */
    658656
    659657    /*
     
    954952    if (!rc)
    955953    {
    956         rc = kldrDyldModAddDep(pMod, pDep);
    957         if (!rc)
    958             *ppMod = pMod;
     954        kldrDyldModAddDep(pMod, pDep);
     955        *ppMod = pMod;
    959956    }
    960957    return rc;
     
    10231020static int kldrDyldStackAddModule(PKLDRDYLDMOD pMod)
    10241021{
    1025     int rc;
    1026 
    10271022    /*
    10281023     * Grow the stack if necessary.
     
    10431038     * Add a reference and push the module onto the stack.
    10441039     */
    1045     rc = kldrDyldModAddRef(pMod);
    1046     if (!rc)
    1047         g_papStackMods[g_cStackMods++] = pMod;
    1048     return rc;
     1040    kldrDyldModAddRef(pMod);
     1041    g_papStackMods[g_cStackMods++] = pMod;
     1042    return 0;
    10491043}
    10501044
     
    10581052{
    10591053    return g_cStackMods;
     1054}
     1055
     1056
     1057/**
     1058 * Worker routine for kldrDyldStackDropFrame() and kldrDyldDoLoad().
     1059 *
     1060 * @param   pMod            The module to perform cleanups on.
     1061 * @param   rc              Used for state verification.
     1062 */
     1063static void kldrDyldStackCleanupOne(PKLDRDYLDMOD pMod, int rc)
     1064{
     1065    switch (pMod->enmState)
     1066    {
     1067        /*
     1068         * Just push it along to the PENDING_DESTROY state.
     1069         */
     1070        case KLDRSTATE_MAPPED:
     1071            KLDRDYLD_ASSERT(rc);
     1072            kldrDyldModUnmap(pMod);
     1073            KLDRDYLD_ASSERT(pMod->enmState == KLDRSTATE_PENDING_DESTROY);
     1074            break;
     1075
     1076        /*
     1077         * Move back to PENDING_GC.
     1078         */
     1079        case KLDRSTATE_RELOADED:
     1080            KLDRDYLD_ASSERT(rc);
     1081            pMod->enmState = KLDRSTATE_PENDING_GC;
     1082            break;
     1083
     1084        /*
     1085         * Unload prerequisites and unmap the modules.
     1086         */
     1087        case KLDRSTATE_LOADED_PREREQUISITES:
     1088        case KLDRSTATE_FIXED_UP:
     1089            KLDRDYLD_ASSERT(rc);
     1090            kldrDyldModUnloadPrerequisites(pMod);
     1091            KLDRDYLD_ASSERT(pMod->enmState == KLDRSTATE_PENDING_DESTROY);
     1092            kldrDyldModUnmap(pMod);
     1093            KLDRDYLD_ASSERT(pMod->enmState == KLDRSTATE_PENDING_DESTROY);
     1094            break;
     1095
     1096        /*
     1097         * Unload prerequisites and push it back to PENDING_GC.
     1098         */
     1099        case KLDRSTATE_RELOADED_LOADED_PREREQUISITES:
     1100        case KLDRSTATE_RELOADED_FIXED_UP:
     1101            kldrDyldModUnloadPrerequisites(pMod);
     1102            KLDRDYLD_ASSERT(pMod->enmState == KLDRSTATE_PENDING_GC);
     1103            break;
     1104
     1105        /*
     1106         * Nothing to do, just asserting sanity.
     1107         */
     1108        case KLDRSTATE_INITIALIZING:
     1109            /* Implies there is another load going on. */
     1110            KLDRDYLD_ASSERT(g_cActiveLoadCalls > 1);
     1111            break;
     1112        case KLDRSTATE_TERMINATING:
     1113            /* GC in progress. */
     1114            KLDRDYLD_ASSERT(g_fActiveGC);
     1115            break;
     1116        case KLDRSTATE_PENDING_TERMINATION:
     1117        case KLDRSTATE_PENDING_INITIALIZATION:
     1118        case KLDRSTATE_PENDING_GC:
     1119        case KLDRSTATE_PENDING_DESTROY:
     1120            KLDRDYLD_ASSERT(rc);
     1121            break;
     1122        case KLDRSTATE_GOOD:
     1123            break;
     1124
     1125        /*
     1126         * Bad states.
     1127         */
     1128        default:
     1129            KLDRDYLD_ASSERT(!"drop frame bad state (a)");
     1130            break;
     1131    }
    10601132}
    10611133
     
    10801152    {
    10811153        PKLDRDYLDMOD pMod = g_papStackMods[--iLoad1st];
    1082         switch (pMod->enmState)
    1083         {
    1084             /*
    1085              * Just push it along to the PENDING_DESTROY state.
    1086              */
    1087             case KLDRSTATE_MAPPED:
    1088                 KLDRDYLD_ASSERT(rc);
    1089                 kldrDyldModUnmap(pMod);
    1090                 KLDRDYLD_ASSERT(pMod->enmState == KLDRSTATE_PENDING_DESTROY);
    1091                 break;
    1092 
    1093             /*
    1094              * Move back to PENDING_GC.
    1095              */
    1096             case KLDRSTATE_RELOADED:
    1097                 KLDRDYLD_ASSERT(rc);
    1098                 pMod->enmState = KLDRSTATE_PENDING_GC;
    1099                 break;
    1100 
    1101             /*
    1102              * Unload prerequisites and unmap the modules.
    1103              */
    1104             case KLDRSTATE_LOADED_PREREQUISITES:
    1105             case KLDRSTATE_FIXED_UP:
    1106                 KLDRDYLD_ASSERT(rc);
    1107                 kldrDyldModUnloadPrerequisites(pMod);
    1108                 KLDRDYLD_ASSERT(pMod->enmState == KLDRSTATE_PENDING_DESTROY);
    1109                 kldrDyldModUnmap(pMod);
    1110                 KLDRDYLD_ASSERT(pMod->enmState == KLDRSTATE_PENDING_DESTROY);
    1111                 break;
    1112 
    1113             /*
    1114              * Unload prerequisites and push it back to PENDING_GC.
    1115              */
    1116             case KLDRSTATE_RELOADED_LOADED_PREREQUISITES:
    1117             case KLDRSTATE_RELOADED_FIXED_UP:
    1118                 kldrDyldModUnloadPrerequisites(pMod);
    1119                 KLDRDYLD_ASSERT(pMod->enmState == KLDRSTATE_PENDING_GC);
    1120                 break;
    1121 
    1122             /*
    1123              * Nothing to do, just asserting sanity.
    1124              */
    1125             case KLDRSTATE_INITIALIZING:
    1126                 /* Implies there is another load going on. */
    1127                 KLDRDYLD_ASSERT(g_cActiveLoadCalls > 1);
    1128                 break;
    1129             case KLDRSTATE_TERMINATING:
    1130                 /* GC in progress. */
    1131                 KLDRDYLD_ASSERT(g_fActiveGC);
    1132                 break;
    1133             case KLDRSTATE_PENDING_TERMINATION:
    1134             case KLDRSTATE_PENDING_INITIALIZATION:
    1135             case KLDRSTATE_PENDING_GC:
    1136             case KLDRSTATE_PENDING_DESTROY:
    1137                 KLDRDYLD_ASSERT(rc);
    1138                 break;
    1139             case KLDRSTATE_GOOD:
    1140                 break;
    1141 
    1142             /*
    1143              * Bad states.
    1144              */
    1145             default:
    1146                 KLDRDYLD_ASSERT(!"drop frame bad state (a)");
    1147                 break;
    1148         }
     1154        kldrDyldStackCleanupOne(pMod, rc);
    11491155    }
    11501156
     
    12771283    {
    12781284        PKLDRDYLDMOD pNext = pMod->Load.pNext;
     1285        kldrDyldModAddRef(pMod);
     1286
    12791287        switch (pMod->enmState)
    12801288        {
     
    12841292                pMod->enmState = KLDRSTATE_GC;
    12851293                kldrDyldModUnmap(pMod);
     1294                KLDRDYLD_ASSERT(pMod->enmState == KLDRSTATE_PENDING_DESTROY);
    12861295                kldrDyldModDestroy(pMod);
     1296                KLDRDYLD_ASSERT(pMod->enmState == KLDRSTATE_DESTROYED);
    12871297                break;
    12881298
     
    12931303                break;
    12941304        }
     1305
     1306        kldrDyldModDeref(pMod);
    12951307
    12961308        /* next */
Note: See TracChangeset for help on using the changeset viewer.