Changeset 2837 for trunk/kLdr/kLdrDyldMod.c
- Timestamp:
- Oct 28, 2006, 5:59:21 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdrDyldMod.c
r2835 r2837 35 35 36 36 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 37 48 38 49 39 50 51 52 void kldrDyldModUnloadPrerequisites(PKLDRDYLDMOD pMod) 53 { 54 55 } 56 57 58 void 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.