diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 041fea625..a982057b4 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3278,34 +3278,55 @@ char* multiSlsDetector::getNetworkParameter(networkParameter p) { */ char* multiSlsDetector::setNetworkParameter(networkParameter p, string s){ - if (s.find('+')==string::npos) { - for (int idet=0; idetnumberOfDetectors; idet++) { - if (detectors[idet]) { - detectors[idet]->setNetworkParameter(p,s); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<setNetworkParameter(p,s.substr(p1,p2-p1)); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<=thisMultiDetector->numberOfDetectors) - break; - } + int posmin=0, posmax=thisMultiDetector->numberOfDetectors; - } - return getNetworkParameter(p); + if(!threadpool){ + cout << "Error in creating threadpool. Exiting" << endl; + return getNetworkParameter(p); + }else{ + string* sret[thisMultiDetector->numberOfDetectors]; + for(int idet=0; idetnumberOfDetectors; idet++){ + if(detectors[idet]){ + sret[idet]=new string("error"); + Task* task = new Task(new func2_t (&slsDetector::setNetworkParameter, + detectors[idet],p,s,sret[idet])); + threadpool->add_task(task); + } + } + threadpool->wait_for_tasks_to_complete(); + for(int idet=0; idetnumberOfDetectors; idet++){ + if(detectors[idet]){ + //doing nothing with the return values + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<setNetworkParameter(p,s.substr(p1,p2-p1)); + if(detectors[id]->getErrorMask()) + setErrorMask(getErrorMask()|(1<=thisMultiDetector->numberOfDetectors) + break; + } + + } + return getNetworkParameter(p); } diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 55af4c622..6ba9dc99e 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -851,6 +851,7 @@ int slsDetector::initializeDetectorSize(detectorType type) { settingsFile=thisDetector->settingsFile; filePath=thisDetector->filePath; + pthread_mutex_lock(&ms); fileName=parentDet->fileName; fileIndex=parentDet->fileIndex; framesPerFile=parentDet->framesPerFile; @@ -862,6 +863,7 @@ int slsDetector::initializeDetectorSize(detectorType type) { setFramesPerFile(JFRAU_MAX_FRAMES_PER_FILE); if (thisDetector->myDetectorType==JUNGFRAUCTB) setFramesPerFile(JFCTB_MAX_FRAMES_PER_FILE); + pthread_mutex_unlock(&ms); thisReceiver = new receiverInterface(dataSocket); // setAngularConversionPointer(thisDetector->angOff,&thisDetector->nMods, thisDetector->nChans*thisDetector->nChips); @@ -1679,8 +1681,11 @@ int slsDetector::setNumberOfModules(int n, dimension d){ #endif } - if(n != GET_FLAG) + if(n != GET_FLAG){ + pthread_mutex_lock(&ms); parentDet->updateOffsets(); + pthread_mutex_unlock(&ms); + } return thisDetector->nMod[d]; }; @@ -5397,8 +5402,10 @@ char* slsDetector::setReceiver(string receiverIP){ std::cout << "file path:" << fileIO::getFilePath() << endl; std::cout << "file name:" << fileIO::getFileName() << endl; std::cout << "file index:" << fileIO::getFileIndex() << endl; + pthread_mutex_lock(&ms); std::cout << "write enable:" << parentDet->enableWriteToFileMask() << endl; std::cout << "overwrite enable:" << parentDet->enableOverwriteMask() << endl; + pthread_mutex_unlock(&ms); std::cout << "frame index needed:" << ((thisDetector->timerValue[FRAME_NUMBER]*thisDetector->timerValue[CYCLES_NUMBER])>1) << endl; std::cout << "frame period:" << thisDetector->timerValue[FRAME_PERIOD] << endl; std::cout << "frame number:" << thisDetector->timerValue[FRAME_NUMBER] << endl; @@ -5411,9 +5418,14 @@ char* slsDetector::setReceiver(string receiverIP){ setFilePath(fileIO::getFilePath()); setFileName(fileIO::getFileName()); setFileIndex(fileIO::getFileIndex()); - enableWriteToFile(parentDet->enableWriteToFileMask()); - overwriteFile(parentDet->enableOverwriteMask()); - + pthread_mutex_lock(&ms); + int imask = parentDet->enableWriteToFileMask(); + pthread_mutex_unlock(&ms); + enableWriteToFile(imask); + pthread_mutex_lock(&ms); + imask = parentDet->enableOverwriteMask(); + pthread_mutex_unlock(&ms); + overwriteFile(imask); if ((thisDetector->timerValue[FRAME_NUMBER]*thisDetector->timerValue[CYCLES_NUMBER])>1) setFrameIndex(0); else @@ -5706,11 +5718,12 @@ int slsDetector::configureMAC(){ } else if (thisDetector->myDetectorType==GOTTHARD){ //set frames per file - only for gotthard + pthread_mutex_lock(&ms); if(retval==-1) setFramesPerFile(MAX_FRAMES_PER_FILE); else setFramesPerFile(SHORT_MAX_FRAMES_PER_FILE); - + pthread_mutex_unlock(&ms); //connect to receiver if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){ @@ -6709,12 +6722,14 @@ string slsDetector::setFileName(string s) { char retval[MAX_STR_LENGTH]=""; if(!s.empty()){ + pthread_mutex_lock(&ms); fileIO::setFileName(s); if(thisDetector->myDetectorType == EIGER) parentDet->setDetectorIndex(detId); else if(parentDet->getNumberOfDetectors()>1) parentDet->setDetectorIndex(detId); s=parentDet->createReceiverFilePrefix(); + pthread_mutex_unlock(&ms); } if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ @@ -6730,7 +6745,10 @@ string slsDetector::setFileName(string s) { #ifdef VERBOSE std::cout << "Complete file prefix from receiver: " << retval << std::endl; #endif + pthread_mutex_lock(&ms); fileIO::setFileName(parentDet->getNameFromReceiverFilePrefix(string(retval))); + pthread_mutex_unlock(&ms); + } if(ret==FORCE_UPDATE) updateReceiver(); @@ -6752,8 +6770,11 @@ int slsDetector::setFileIndex(int i) { if(thisDetector->receiverOnlineFlag==OFFLINE_FLAG){ - if(i>=0) + if(i>=0){ + pthread_mutex_lock(&ms); fileIO::setFileIndex(i); + pthread_mutex_unlock(&ms); + } } else if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){ @@ -6763,8 +6784,11 @@ int slsDetector::setFileIndex(int i) { if (connectData() == OK) ret=thisReceiver->sendInt(fnum,retval,arg); disconnectData(); - if(ret!=FAIL) + if(ret!=FAIL){ + pthread_mutex_lock(&ms); fileIO::setFileIndex(retval); + pthread_mutex_unlock(&ms); + } if(ret==FORCE_UPDATE) updateReceiver(); } @@ -7102,11 +7126,15 @@ int slsDetector::updateReceiverNoWait() { cout << "Updating receiver last modified by " << lastClientIP << std::endl; #endif n = dataSocket->ReceiveDataOnly(&ind,sizeof(ind)); + pthread_mutex_lock(&ms); fileIO::setFileIndex(ind); + pthread_mutex_unlock(&ms); n = dataSocket->ReceiveDataOnly(path,MAX_STR_LENGTH); fileIO::setFilePath(path); n = dataSocket->ReceiveDataOnly(path,MAX_STR_LENGTH); + pthread_mutex_lock(&ms); fileIO::setFileName(path); + pthread_mutex_unlock(&ms); return OK; } @@ -7176,8 +7204,11 @@ int slsDetector::enableWriteToFile(int enable){ if(thisDetector->receiverOnlineFlag==OFFLINE_FLAG){ - if(enable>=0) + if(enable>=0){ + pthread_mutex_lock(&ms); parentDet->enableWriteToFileMask(enable); + pthread_mutex_unlock(&ms); + } } else if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){ @@ -7187,13 +7218,20 @@ int slsDetector::enableWriteToFile(int enable){ if (connectData() == OK) ret=thisReceiver->sendInt(fnum,retval,arg); disconnectData(); - if(ret!=FAIL) + if(ret!=FAIL){ + pthread_mutex_lock(&ms); parentDet->enableWriteToFileMask(retval); + pthread_mutex_unlock(&ms); + } if(ret==FORCE_UPDATE) updateReceiver(); } - return parentDet->enableWriteToFileMask(); + pthread_mutex_lock(&ms); + retval = parentDet->enableWriteToFileMask(); + pthread_mutex_unlock(&ms); + + return retval; } @@ -7207,8 +7245,11 @@ int slsDetector::overwriteFile(int enable){ if(thisDetector->receiverOnlineFlag==OFFLINE_FLAG){ - if(enable>=0) + if(enable>=0){ + pthread_mutex_lock(&ms); parentDet->enableOverwriteMask(enable); + pthread_mutex_unlock(&ms); + } } else if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){ @@ -7218,13 +7259,20 @@ int slsDetector::overwriteFile(int enable){ if (connectData() == OK) ret=thisReceiver->sendInt(fnum,retval,arg); disconnectData(); - if(ret!=FAIL) + if(ret!=FAIL){ + pthread_mutex_lock(&ms); parentDet->enableOverwriteMask(retval); + pthread_mutex_unlock(&ms); + } if(ret==FORCE_UPDATE) updateReceiver(); } - return parentDet->enableOverwriteMask(); + pthread_mutex_lock(&ms); + retval = parentDet->enableOverwriteMask(); + pthread_mutex_unlock(&ms); + + return retval; } @@ -7291,10 +7339,14 @@ int slsDetector::calibratePedestal(int frames){ int64_t slsDetector::clearAllErrorMask(){ clearErrorMask(); + + pthread_mutex_lock(&ms); for(int i=0;igetNumberOfDetectors();i++){ if(parentDet->getDetectorId(i) == getDetectorId()) parentDet->setErrorMask(parentDet->getErrorMask()|(0<* t): m1(t),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0){}; + Task(func1_t * t): m1(t),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0),m11(0){}; /* Return: int, Param: string,int */ - Task(func2_t * t): m1(0),m2(t),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0){}; + Task(func2_t * t): m1(0),m2(t),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0),m11(0){}; /* Return: string, Param: string */ - Task(func1_t * t): m1(0),m2(0),m3(t),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0){}; + Task(func1_t * t): m1(0),m2(0),m3(t),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0),m11(0){}; /* Return: char*, Param: char* */ - Task(func1_t * t): m1(0),m2(0),m3(0),m4(t),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0){}; + Task(func1_t * t): m1(0),m2(0),m3(0),m4(t),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0),m11(0){}; /* Return: detectorSettings, Param: int */ - Task(func1_t * t): m1(0),m2(0),m3(0),m4(0),m5(t),m6(0),m7(0),m8(0),m9(0),m10(0){}; + Task(func1_t * t): m1(0),m2(0),m3(0),m4(0),m5(t),m6(0),m7(0),m8(0),m9(0),m10(0),m11(0){}; /* Return: detectorSettings, Param: detectorSettings,int */ - Task(func2_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(t),m7(0),m8(0),m9(0),m10(0){}; + Task(func2_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(t),m7(0),m8(0),m9(0),m10(0),m11(0){}; /* Return: int, Param: int,int */ - Task(func2_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(t),m8(0),m9(0),m10(0){}; + Task(func2_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(t),m8(0),m9(0),m10(0),m11(0){}; /* Return: int, Param: int,int */ - Task(func3_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(t),m9(0),m10(0){}; + Task(func3_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(t),m9(0),m10(0),m11(0){}; /* Return: int, Param: trimMode,int,int,int */ - Task(func4_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(t),m10(0){}; + Task(func4_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(t),m10(0),m11(0){}; /* Return: int, Param: int */ - Task(func0_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(t){}; - + Task(func0_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(t),m11(0){}; + /* Return: char*, Param: networkParameter,string,string */ + Task(func2_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0),m11(t){}; ~Task(){} void operator()(){ @@ -127,6 +128,7 @@ public: else if(m8) (*m8)(); else if(m9) (*m9)(); else if(m10) (*m10)(); + else if(m11) (*m11)(); } private: @@ -150,6 +152,8 @@ private: func4_t * m9; /* Return: int, Param: int */ func0_t * m10; + /* Return: char*, Param: networkParameter,string,string */ + func2_t * m11; };