mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-19 20:24:49 +00:00
Merge pull request #915 from Azaezel/alpha402/sortSorting
correct the moduleDependencySort callback
This commit is contained in:
commit
84f1e673fc
|
|
@ -74,23 +74,29 @@ S32 QSORT_CALLBACK moduleDefinitionVersionIdSort( const void* a, const void* b )
|
|||
return versionId1 > versionId2 ? -1 : versionId1 < versionId2 ? 1 : 0;
|
||||
}
|
||||
|
||||
S32 QSORT_CALLBACK moduleDependencySort(const void* a, const void* b)
|
||||
S32 ModuleManager::moduleDependencySort(ModuleDefinition* const* a, ModuleDefinition* const* b)
|
||||
{
|
||||
// Fetch module definitions.
|
||||
ModuleDefinition* pDefinition1 = *(ModuleDefinition * *)a;
|
||||
ModuleDefinition* pDefinition2 = *(ModuleDefinition * *)b;
|
||||
|
||||
// Fetch version Ids.
|
||||
ModuleDefinition::typeModuleDependencyVector moduleDependencies = pDefinition1->getDependencies();
|
||||
bool foundDependant = false;
|
||||
// if A depends on B move A down the list
|
||||
ModuleDefinition::typeModuleDependencyVector moduleDependencies = (*a)->getDependencies();
|
||||
for (ModuleDefinition::typeModuleDependencyVector::const_iterator dependencyItr = moduleDependencies.begin(); dependencyItr != moduleDependencies.end(); ++dependencyItr)
|
||||
{
|
||||
if (String::compare(dependencyItr->mModuleId, pDefinition2->getModuleId())
|
||||
&& (dependencyItr->mVersionId == pDefinition2->getVersionId()))
|
||||
foundDependant = true;
|
||||
if ((String::compare(dependencyItr->mModuleId, (*b)->getModuleId()) == 0)
|
||||
&& (dependencyItr->mVersionId == (*b)->getVersionId()))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return foundDependant ? 1 : -1;
|
||||
//If B depends on A, move A up the list
|
||||
ModuleDefinition::typeModuleDependencyVector moduleDependencies2 = (*b)->getDependencies();
|
||||
for (ModuleDefinition::typeModuleDependencyVector::const_iterator dependencyItr2 = moduleDependencies2.begin(); dependencyItr2 != moduleDependencies2.end(); ++dependencyItr2)
|
||||
{
|
||||
if ((String::compare(dependencyItr2->mModuleId, (*a)->getModuleId()) == 0)
|
||||
&& (dependencyItr2->mVersionId == (*a)->getVersionId()))
|
||||
return -1;
|
||||
}
|
||||
//didn't find any explicit dependencies between the two, so sort by which has more
|
||||
if (moduleDependencies.size() > moduleDependencies2.size()) return 1;
|
||||
if (moduleDependencies.size() < moduleDependencies2.size()) return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -1066,39 +1072,49 @@ ModuleDefinition* ModuleManager::findLoadedModule( const char* pModuleId )
|
|||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
void ModuleManager::findModules( const bool loadedOnly, typeConstModuleDefinitionVector& moduleDefinitions )
|
||||
void ModuleManager::findModules(const bool loadedOnly, typeModuleDefinitionVector& moduleDefinitions)
|
||||
{
|
||||
// Iterate module Ids.
|
||||
for( typeModuleIdDatabaseHash::iterator moduleIdItr = mModuleIdDatabase.begin(); moduleIdItr != mModuleIdDatabase.end(); ++moduleIdItr )
|
||||
{
|
||||
// Fetch module definition entry.
|
||||
ModuleDefinitionEntry* pModuleDefinitionEntry = moduleIdItr->value;
|
||||
if (loadedOnly)
|
||||
{
|
||||
for (U32 i = 0; i < mModulesLoaded.size(); i++)
|
||||
{
|
||||
moduleDefinitions.push_back(mModulesLoaded[i].mpModuleDefinition);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Iterate module Ids.
|
||||
for (typeModuleIdDatabaseHash::iterator moduleIdItr = mModuleIdDatabase.begin(); moduleIdItr != mModuleIdDatabase.end(); ++moduleIdItr)
|
||||
{
|
||||
// Fetch module definition entry.
|
||||
ModuleDefinitionEntry* pModuleDefinitionEntry = moduleIdItr->value;
|
||||
|
||||
// Iterate module definitions.
|
||||
for ( typeModuleDefinitionVector::iterator moduleDefinitionItr = pModuleDefinitionEntry->begin(); moduleDefinitionItr != pModuleDefinitionEntry->end(); ++moduleDefinitionItr )
|
||||
{
|
||||
// Iterate module definitions.
|
||||
for (typeModuleDefinitionVector::iterator moduleDefinitionItr = pModuleDefinitionEntry->begin(); moduleDefinitionItr != pModuleDefinitionEntry->end(); ++moduleDefinitionItr)
|
||||
{
|
||||
// Fetch module definition.
|
||||
ModuleDefinition* pModuleDefinition = *moduleDefinitionItr;
|
||||
|
||||
// Are we searching for loaded modules only?
|
||||
if ( loadedOnly )
|
||||
if (loadedOnly)
|
||||
{
|
||||
// Yes, so skip if the module is not loaded.
|
||||
if ( pModuleDefinition->getLoadCount() == 0 )
|
||||
continue;
|
||||
// Yes, so skip if the module is not loaded.
|
||||
if (pModuleDefinition->getLoadCount() == 0)
|
||||
continue;
|
||||
|
||||
// Use module definition.
|
||||
moduleDefinitions.push_back( pModuleDefinition );
|
||||
// Use module definition.
|
||||
moduleDefinitions.push_back(pModuleDefinition);
|
||||
|
||||
// Finish iterating module definitions as only a single module in this entry can be loaded concurrently.
|
||||
break;
|
||||
// Finish iterating module definitions as only a single module in this entry can be loaded concurrently.
|
||||
break;
|
||||
}
|
||||
|
||||
// use module definition.
|
||||
moduleDefinitions.push_back( pModuleDefinition );
|
||||
}
|
||||
}
|
||||
dQsort(moduleDefinitions.address(), moduleDefinitions.size(), sizeof(ModuleDefinition*), moduleDependencySort);
|
||||
moduleDefinitions.push_back(pModuleDefinition);
|
||||
}
|
||||
}
|
||||
moduleDefinitions.sort(&moduleDependencySort);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -1571,7 +1587,7 @@ bool ModuleManager::synchronizeDependencies( ModuleDefinition* pRootModuleDefini
|
|||
}
|
||||
|
||||
// Find any target modules left, These are orphaned modules not depended upon by any other module.
|
||||
typeConstModuleDefinitionVector orphanedTargetModules;
|
||||
typeModuleDefinitionVector orphanedTargetModules;
|
||||
targetModuleManager.findModules( false, orphanedTargetModules );
|
||||
|
||||
// Iterate module definitions.
|
||||
|
|
@ -1619,7 +1635,7 @@ bool ModuleManager::canMergeModules( const char* pMergeSourcePath )
|
|||
mergeModuleManager.scanModules( pMergeSourcePath );
|
||||
|
||||
// Find all the merge modules.
|
||||
typeConstModuleDefinitionVector mergeModules;
|
||||
typeModuleDefinitionVector mergeModules;
|
||||
mergeModuleManager.findModules( false, mergeModules );
|
||||
|
||||
// Iterate found merge module definitions.
|
||||
|
|
@ -1708,7 +1724,7 @@ bool ModuleManager::mergeModules( const char* pMergeTargetPath, const bool remov
|
|||
sourceModuleManager.scanModules( mergeSourcePath );
|
||||
|
||||
// Find all the source modules.
|
||||
typeConstModuleDefinitionVector sourceModules;
|
||||
typeModuleDefinitionVector sourceModules;
|
||||
sourceModuleManager.findModules( false, sourceModules );
|
||||
|
||||
// Iterate found merge module definitions.
|
||||
|
|
|
|||
|
|
@ -61,7 +61,8 @@ public:
|
|||
/// Module definitions.
|
||||
typedef Vector<ModuleDefinition*> typeModuleDefinitionVector;
|
||||
typedef Vector<const ModuleDefinition*> typeConstModuleDefinitionVector;
|
||||
|
||||
protected:
|
||||
static S32 moduleDependencySort(ModuleDefinition* const* a, ModuleDefinition* const* b);
|
||||
private:
|
||||
/// Database locking.
|
||||
struct LockDatabase
|
||||
|
|
@ -175,7 +176,7 @@ public:
|
|||
ModuleDefinition* findModule( const char* pModuleId, const U32 versionId );
|
||||
ModuleDefinition* findModuleByFilePath(StringTableEntry filePath);
|
||||
ModuleDefinition* findLoadedModule( const char* pModuleId );
|
||||
void findModules( const bool loadedOnly, typeConstModuleDefinitionVector& moduleDefinitions );
|
||||
void findModules( const bool loadedOnly, typeModuleDefinitionVector& moduleDefinitions );
|
||||
void findModuleTypes( const char* pModuleType, const bool loadedOnly, typeConstModuleDefinitionVector& moduleDefinitions );
|
||||
|
||||
/// Module synchronization.
|
||||
|
|
@ -219,4 +220,4 @@ private:
|
|||
|
||||
extern ModuleManager ModuleDatabase;
|
||||
|
||||
#endif // _MODULE_MANAGER_H
|
||||
#endif // _MODULE_MANAGER_H
|
||||
|
|
|
|||
|
|
@ -151,13 +151,13 @@ DefineEngineMethod(ModuleManager, findModuleByFilePath, String, (const char* fil
|
|||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
DefineEngineMethod(ModuleManager, findModules, String, (bool loadedOnly), (false),
|
||||
DefineEngineMethod(ModuleManager, findModules, String, (bool loadedOnly), (true),
|
||||
"Find all the modules registered with the specified loaded state.\n"
|
||||
"@param loadedOnly Whether to return only modules that are loaded or not.\n"
|
||||
"@return A list of space - separated module definition object Ids.\n")
|
||||
{
|
||||
// Find module type definitions.
|
||||
Vector<const ModuleDefinition*> moduleDefinitions;
|
||||
Vector<ModuleDefinition*> moduleDefinitions;
|
||||
|
||||
// Find modules.
|
||||
object->findModules( loadedOnly, moduleDefinitions );
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
$reportModuleOrder = false;
|
||||
$traceModuleCalls=false;
|
||||
$reportModuleFileConflicts=true;
|
||||
if (!isObject(ExecFilesList))
|
||||
|
|
@ -9,11 +10,12 @@ function callOnModules(%functionName, %moduleGroup, %var0, %var1, %var2, %var3,
|
|||
%execArray = new ArrayObject("callOn" @ %functionName @ "_" @ %moduleGroup);
|
||||
ExecFilesList.push_back(%execArray);
|
||||
//Get our modules so we can exec any specific client-side loading/handling
|
||||
%modulesList = ModuleDatabase.findModules(false);
|
||||
%modulesList = ModuleDatabase.findModules();
|
||||
%modlist = "modlist:";
|
||||
for(%i=0; %i < getWordCount(%modulesList); %i++)
|
||||
{
|
||||
%module = getWord(%modulesList, %i);
|
||||
|
||||
%modlist = %modlist SPC %module.ModuleId;
|
||||
if(%moduleGroup !$= "")
|
||||
{
|
||||
if(%module.group !$= %moduleGroup)
|
||||
|
|
@ -23,6 +25,8 @@ function callOnModules(%functionName, %moduleGroup, %var0, %var1, %var2, %var3,
|
|||
if(isObject(%module.scopeSet) && %module.scopeSet.isMethod(%functionName))
|
||||
%module.scopeSet.call(%functionName, %var0, %var1, %var2, %var3, %var4, %var5, %var6);
|
||||
}
|
||||
if ($reportModuleOrder)
|
||||
warn(%modlist);
|
||||
|
||||
%execFilecount = %execArray.count();
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue