/** Updates all modules */ static orxINLINE void orxPlugin_UpdateAllModule() { orxU32 i; /* For all core plugins */ for(i = 0; i < orxPLUGIN_CORE_ID_NUMBER; i++) { /* Is plugin dirty? */ if(sstPlugin.astCoreInfo[i].u32Flags & orxPLUGIN_KU32_CORE_KU32_FLAG_FLAG_DIRTY) { orxU32 j; orxBOOL bLoaded; /* Checks all functions */ for(j = 0, bLoaded = orxTRUE; (j < sstPlugin.astCoreInfo[i].u32CoreFunctionCounter) && (bLoaded != orxFALSE); j++) { /* Tests if function is loaded */ bLoaded = (*(sstPlugin.astCoreInfo[i].pstCoreFunctionTable[j].pfnFunction) != sstPlugin.astCoreInfo[i].pstCoreFunctionTable[j].pfnDefaultFunction) ? orxTRUE : orxFALSE; } /* Was not already loaded */ if(!(sstPlugin.astCoreInfo[i].u32Flags & orxPLUGIN_KU32_CORE_KU32_FLAG_FLAG_LOADED)) { /* Is now loaded? */ if(bLoaded != orxFALSE) { /* Marks as loaded */ sstPlugin.astCoreInfo[i].u32Flags |= orxPLUGIN_KU32_CORE_KU32_FLAG_FLAG_LOADED; #ifndef __orxEMBEDDED__ /* Tries to init associated module */ orxModule_Init(sstPlugin.astCoreInfo[i].eModuleID); #endif /* !__orxEMBEDDED__ */ } } /* Was already loaded */ else { /* Isn't loaded any longer */ if(bLoaded == orxFALSE) { /* Marks as not loaded */ sstPlugin.astCoreInfo[i].u32Flags &= ~orxPLUGIN_KU32_CORE_KU32_FLAG_FLAG_LOADED; #ifndef __orxEMBEDDED__ /* Tries to exit from associated module */ orxModule_Exit(sstPlugin.astCoreInfo[i].eModuleID); #endif /* !__orxEMBEDDED__ */ } } /* Removes dirty flag */ sstPlugin.astCoreInfo[i].u32Flags &= ~orxPLUGIN_KU32_CORE_KU32_FLAG_FLAG_DIRTY; } } /* Done! */ return; }
/** Inits a module recursively */ orxSTATUS orxFASTCALL orxModule_Init(orxMODULE_ID _eModuleID) { orxU64 u64Depend; orxU32 u32Index; orxSTATUS eResult = orxSTATUS_SUCCESS; /* Checks */ orxASSERT(orxMODULE_ID_NUMBER <= orxMODULE_ID_MAX_NUMBER); orxASSERT(_eModuleID < orxMODULE_ID_NUMBER); /* Increases loop counter */ sstModule.u32InitLoopCounter++; /* Is module registered? */ if(sstModule.astModuleInfo[_eModuleID].u32StatusFlags & orxMODULE_KU32_STATUS_FLAG_REGISTERED) { /* Is not initialized? */ if(!(sstModule.astModuleInfo[_eModuleID].u32StatusFlags & (orxMODULE_KU32_STATUS_FLAG_INITIALIZED|orxMODULE_KU32_STATUS_FLAG_PENDING))) { /* For all dependencies */ for(u64Depend = sstModule.astModuleInfo[_eModuleID].u64DependFlags, u32Index = 0; u64Depend != (orxU64)0; u64Depend >>= 1, u32Index++) { /* Depends? */ if(u64Depend & (orxU64)1) { /* Not already initialized */ if(!(sstModule.astModuleInfo[u32Index].u32StatusFlags & (orxMODULE_KU32_STATUS_FLAG_INITIALIZED|orxMODULE_KU32_STATUS_FLAG_PENDING))) { /* Inits it */ eResult = orxModule_Init((orxMODULE_ID)u32Index); /* Success ? */ if(eResult != orxSTATUS_FAILURE) { /* Updates flags */ sstModule.astModuleInfo[u32Index].u64ParentFlags |= (orxU64)1 << _eModuleID; } else { /* Stops init here */ break; } } } } /* Success? */ if(eResult != orxSTATUS_FAILURE) { /* For all optional dependencies */ for(u64Depend = sstModule.astModuleInfo[_eModuleID].u64OptionalDependFlags, u32Index = 0; u64Depend != (orxU64)0; u64Depend >>= 1, u32Index++) { /* Depends? */ if(u64Depend & (orxU64)1) { /* Not already initialized */ if(!(sstModule.astModuleInfo[u32Index].u32StatusFlags & orxMODULE_KU32_STATUS_FLAG_INITIALIZED)) { /* Inits it */ if(orxModule_Init((orxMODULE_ID)u32Index) != orxSTATUS_FAILURE) { /* Updates flags */ sstModule.astModuleInfo[u32Index].u64ParentFlags |= (orxU64)1 << _eModuleID; } } } } /* Not already initialized */ if(!(sstModule.astModuleInfo[_eModuleID].u32StatusFlags & orxMODULE_KU32_STATUS_FLAG_INITIALIZED)) { /* Updates temp flag */ sstModule.astModuleInfo[_eModuleID].u32StatusFlags |= orxMODULE_KU32_STATUS_FLAG_PENDING; /* Calls module init function */ eResult = (sstModule.astModuleInfo[_eModuleID].pfnInit != orxNULL) ? sstModule.astModuleInfo[_eModuleID].pfnInit() : orxSTATUS_SUCCESS; /* Successful? */ if(eResult != orxSTATUS_FAILURE) { /* Updates initialized flag */ sstModule.astModuleInfo[_eModuleID].u32StatusFlags |= orxMODULE_KU32_STATUS_FLAG_INITIALIZED; } else { /* Updates temp flag */ sstModule.astModuleInfo[_eModuleID].u32StatusFlags &= ~orxMODULE_KU32_STATUS_FLAG_PENDING; } } } } } else {