- deps = gKernelModules[i].Dependencies;
-
- if( deps )
- {
- for( j = 0; deps[j]; j++ )
- {
- for( k = 0; k < giNumBuiltinModules; k++ ) {
- if(strcmp(deps[j], gKernelModules[k].Name) == 0)
- break;
- }
- // `k` is assumed to be less than `giNumBuiltinModules`
- // We checked this in pass 1
-
- // If a dependency failed, skip and mark as failed
- if( baIsLoaded[k] == -1 ) {
- baIsLoaded[i] = -1;
- numToInit --;
- break;
- }
- // If a dependency is not intialised, skip this module
- // and come back later
- if( !baIsLoaded[k] ) break;
- }
- // Check for breakouts
- if( deps[j] ) continue;
- }
-
- // All Dependencies OK? Initialise
- StartupPrint(gKernelModules[i].Name);
- Log("[MOD ] Initialising %p '%s' v%i.%i...",
- &gKernelModules[i],
- gKernelModules[i].Name,
- gKernelModules[i].Version>>8, gKernelModules[i].Version & 0xFF
- );
-
- ret = gKernelModules[i].Init(NULL);
- if( ret != MODULE_ERR_OK ) {
- Log("[MOD ] Loading Failed, all modules that depend on this will also fail");
- switch(ret)
- {
- case MODULE_ERR_MISC:
- Log("[MOD ] Reason: Miscelanious");
- break;
- case MODULE_ERR_NOTNEEDED:
- Log("[MOD ] Reason: Module not needed (probably hardware not found)");
- break;
- case MODULE_ERR_MALLOC:
- Log("[MOD ] Reason: Error in malloc/realloc/calloc, probably not good");
- break;
- default:
- Log("[MOD ] Reason - Unknown code %i", ret);
- break;
- }
- baIsLoaded[i] = -1;
- }
- // Mark as loaded
- else
- baIsLoaded[i] = 1;
- numToInit --;
+ // Ok, check if it's loading
+ for( mod = gLoadingModules->Next; mod; mod = mod->Next )
+ {
+ if(strcmp(deps[j], mod->Name) == 0)
+ break;
+ }
+ if( mod ) {
+ Warning("[MOD ] Circular dependency detected");
+ LEAVE_RET('i', -1);
+ }
+
+ // So, if it's not loaded, we better load it then
+ for( i = 0; i < giNumBuiltinModules; i ++ )
+ {
+ if( strcmp(deps[j], gKernelModules[i].Name) == 0 )
+ break;
+ }
+ if( i == giNumBuiltinModules ) {
+ Warning("[MOD ] Dependency '%s' for module '%s' failed");
+ return -1;