Sfoglia il codice sorgente

Merge pull request #915 from Azaezel/alpha402/sortSorting

correct the moduleDependencySort callback
Brian Roberts 2 anni fa
parent
commit
84f1e673fc

+ 52 - 36
Engine/source/module/moduleManager.cpp

@@ -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.

+ 4 - 3
Engine/source/module/moduleManager.h

@@ -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

+ 2 - 2
Engine/source/module/moduleManager_ScriptBinding.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 );

+ 6 - 2
Templates/BaseGame/game/core/utility/scripts/module.tscript

@@ -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();