Changeset 2845 for trunk/kLdr/kLdrDyld.c
- Timestamp:
- Nov 1, 2006, 2:39:03 AM (19 years ago)
- File:
-
- 1 edited
-
trunk/kLdr/kLdrDyld.c (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdrDyld.c
r2843 r2845 168 168 static int kldrDyldStackAddModule(PKLDRDYLDMOD pMod); 169 169 static int kldrDyldStackFrameCompleted(void); 170 static void kldrDyldStackCleanupOne(PKLDRDYLDMOD pMod, int rc); 170 171 static void kldrDyldStackDropFrame(uint32_t iLoad1st, uint32_t iLoadEnd, int rc); 171 172 /** @} */ … … 627 628 rc = kldrDyldDoLoad2(*ppMod, pszPrefix, pszSuffix, enmSearch, fFlags); 628 629 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); 635 631 636 632 /* … … 656 652 int rc = kldrDyldDoLoadPrerequisites(pLoadedMod, pszPrefix, pszSuffix, enmSearch, fFlags); 657 653 uint32_t iLoadEnd = kldrDyldStackFrameCompleted(); 654 if (rc) 655 kldrDyldStackCleanupOne(pLoadedMod, rc); /* in case it didn't get pushed onto the stack. */ 658 656 659 657 /* … … 954 952 if (!rc) 955 953 { 956 rc = kldrDyldModAddDep(pMod, pDep); 957 if (!rc) 958 *ppMod = pMod; 954 kldrDyldModAddDep(pMod, pDep); 955 *ppMod = pMod; 959 956 } 960 957 return rc; … … 1023 1020 static int kldrDyldStackAddModule(PKLDRDYLDMOD pMod) 1024 1021 { 1025 int rc;1026 1027 1022 /* 1028 1023 * Grow the stack if necessary. … … 1043 1038 * Add a reference and push the module onto the stack. 1044 1039 */ 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; 1049 1043 } 1050 1044 … … 1058 1052 { 1059 1053 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 */ 1063 static 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 } 1060 1132 } 1061 1133 … … 1080 1152 { 1081 1153 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); 1149 1155 } 1150 1156 … … 1277 1283 { 1278 1284 PKLDRDYLDMOD pNext = pMod->Load.pNext; 1285 kldrDyldModAddRef(pMod); 1286 1279 1287 switch (pMod->enmState) 1280 1288 { … … 1284 1292 pMod->enmState = KLDRSTATE_GC; 1285 1293 kldrDyldModUnmap(pMod); 1294 KLDRDYLD_ASSERT(pMod->enmState == KLDRSTATE_PENDING_DESTROY); 1286 1295 kldrDyldModDestroy(pMod); 1296 KLDRDYLD_ASSERT(pMod->enmState == KLDRSTATE_DESTROYED); 1287 1297 break; 1288 1298 … … 1293 1303 break; 1294 1304 } 1305 1306 kldrDyldModDeref(pMod); 1295 1307 1296 1308 /* next */
Note:
See TracChangeset
for help on using the changeset viewer.
