ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/s10k/XmlTools/xmlcustomcode.cpp
(Generate patch)

Comparing s10k/XmlTools/xmlcustomcode.cpp (file contents):
Revision 1073 by s10k, Thu Oct 5 17:48:32 2017 UTC vs.
Revision 1112 by s10k, Sun Sep 8 13:21:41 2019 UTC

# Line 36 | Line 36 | XmlCustomCode::XmlCustomCode(): numThrea
36          // Note the () around the function
37          e.getXmlDataFunction = new QScriptValue(e.scriptEngine->evaluate("(function getXmlData() { return $xmlData; })"));
38          e.setXmlDataFunction = new QScriptValue(e.scriptEngine->evaluate("(function setXmlData(newXmlData) { $xmlData=newXmlData; })"));
39 <        e.isAvailable = true;
39 >        e.mutexForEngine = new QMutex;
40  
41          // Add echo function so user can debug the code
42          QScriptValue echoFunction = e.scriptEngine->newFunction(echo);
# Line 74 | Line 74 | void XmlCustomCode::executeCustomCode(co
74      // Single tread if small number of files or number of threads = 1
75      if(filesToProcess.size()<=CUSTOM_FILES_PER_THREAD || numThreads == 1){
76  
77 <        jsCustomCodeEngine &jsEngine = getAvailableJsEngine();
77 >        jsCustomCodeEngine &jsEngine = this->jsScriptEngines.first();
78  
79          // Process all XmlFiles
80          for(int i=0; i<filesToProcess.size(); i++){
# Line 87 | Line 87 | void XmlCustomCode::executeCustomCode(co
87  
88          QVector<QFuture<void>> executingThreads;
89  
90 <        for(int i=0; i<=filesToProcess.size()-CUSTOM_FILES_PER_THREAD; i+=CUSTOM_FILES_PER_THREAD){
90 >        for(int i=0, iteration = 0; i<=filesToProcess.size()-CUSTOM_FILES_PER_THREAD; i+=CUSTOM_FILES_PER_THREAD, ++iteration){
91  
92 <            executingThreads <<
93 <            QtConcurrent::run(&this->myThreadPool, [=]()
92 >            executingThreads << QtConcurrent::run(&this->myThreadPool, [=]()
93              {
94 <                mutexIsAvailable.lock();
95 <                jsCustomCodeEngine &jsEngine = getAvailableJsEngine();
96 <                jsEngine.isAvailable = false;
97 <                mutexIsAvailable.unlock();
94 >
95 >                const int indexJsEngine = iteration % this->numThreads;
96 >
97 >                jsCustomCodeEngine &jsEngine = this->jsScriptEngines[indexJsEngine];
98 >
99 >                jsEngine.mutexForEngine->lock();
100  
101                  QString currXmlFileStringThread;
102  
# Line 115 | Line 116 | void XmlCustomCode::executeCustomCode(co
116                  customCodeUnwinding(filesToProcess.at(i+3),currXmlFileStringThread,*jsEngine.scriptEngine,beginThread,elapsedSecsThread,engineResultThread,
117                                      *jsEngine.jsFunction,*jsEngine.getXmlDataFunction,*jsEngine.setXmlDataFunction,backupsEnabled,verboseEnabled);
118  
119 <                mutexIsAvailable.lock();
119 <                jsEngine.isAvailable = true;
120 <                mutexIsAvailable.unlock();
119 >                jsEngine.mutexForEngine->unlock();
120              });
121          }
122  
# Line 130 | Line 129 | void XmlCustomCode::executeCustomCode(co
129  
130              int alreadyProcessedFiles=(filesToProcess.size()/CUSTOM_FILES_PER_THREAD)*CUSTOM_FILES_PER_THREAD;
131  
132 <            jsCustomCodeEngine &jsEngine = getAvailableJsEngine();
132 >            jsCustomCodeEngine &jsEngine = this->jsScriptEngines.first();
133  
134              for(int i=alreadyProcessedFiles; i<filesToProcess.size(); i++){
135  
# Line 146 | Line 145 | void XmlCustomCode::displayJsException(Q
145          UtilXmlTools::displayErrorMessage("@CUSTOM_CODE","Uncaught js exception (user code) at line " +QString::number(engine.uncaughtExceptionLineNumber()) + ":\n" + engineResult.toString());
146      }
147   }
149
150 XmlCustomCode::jsCustomCodeEngine& XmlCustomCode::getAvailableJsEngine(){
151    for(jsCustomCodeEngine &e : this->jsScriptEngines){
152        if(e.isAvailable){
153            return e;
154        }
155    }
156
157    throw std::runtime_error("Could't find an available js engine for custom command.");
158 }

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)