migrating more multiSlsDetector calls to the generic function

This commit is contained in:
Erik Frojdh 2018-05-25 15:39:28 +02:00
parent bbd7e7906a
commit 4b72d685f3
2 changed files with 39 additions and 143 deletions

View File

@ -3472,7 +3472,6 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(in
threadpool->wait_for_tasks_to_complete(); threadpool->wait_for_tasks_to_complete();
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
cout << return_values[idet] << "\n";
if (detectors[idet]) { if (detectors[idet]) {
if (ret == -100) if (ret == -100)
ret = return_values[idet]; ret = return_values[idet];
@ -3487,6 +3486,39 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(in
return ret; return ret;
} }
int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)())
{
int ret = -100;
if (!threadpool) {
cout << "Error in creating threadpool. Exiting" << endl;
return -1;
} else {
std::vector<int> return_values(thisMultiDetector->numberOfDetectors, -1);
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
Task* task = new Task(new func0_t<int>(somefunc,
detectors[idet], &return_values[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
if (ret == -100)
ret = return_values[idet];
else if (ret != return_values[idet])
ret = -1;
if (detectors[idet]->getErrorMask())
setErrorMask(getErrorMask() | (1 << idet));
}
}
}
return ret;
}
/** returns the detector trimbit/settings directory */ /** returns the detector trimbit/settings directory */
string multiSlsDetector::getSettingsDir() string multiSlsDetector::getSettingsDir()
@ -5194,39 +5226,7 @@ string multiSlsDetector::setFileName(string s)
int multiSlsDetector::setReceiverFramesPerFile(int f) int multiSlsDetector::setReceiverFramesPerFile(int f)
{ {
int ret = -100; return parallelCallDetectorMember(&slsDetector::setReceiverFramesPerFile, f);
if (!threadpool) {
cout << "Error in creating threadpool. Exiting" << endl;
return -1;
} else {
//return storage values
int* iret[thisMultiDetector->numberOfDetectors];
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
iret[idet] = new int(-1);
Task* task = new Task(new func1_t<int, int>(&slsDetector::setReceiverFramesPerFile,
detectors[idet], f, iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
if (iret[idet] != NULL) {
if (ret == -100)
ret = *iret[idet];
else if (ret != *iret[idet])
ret = -1;
delete iret[idet];
} else
ret = -1;
if (detectors[idet]->getErrorMask())
setErrorMask(getErrorMask() | (1 << idet));
}
}
}
return ret;
} }
slsReceiverDefs::fileFormat multiSlsDetector::setFileFormat(fileFormat f) slsReceiverDefs::fileFormat multiSlsDetector::setFileFormat(fileFormat f)
@ -5249,42 +5249,7 @@ slsReceiverDefs::fileFormat multiSlsDetector::setFileFormat(fileFormat f)
int multiSlsDetector::setFileIndex(int i) int multiSlsDetector::setFileIndex(int i)
{ {
return parallelCallDetectorMember(&slsDetector::setFileIndex, i);
int ret = -100;
if (!threadpool) {
cout << "Error in creating threadpool. Exiting" << endl;
return -1;
} else {
//return storage values
int* iret[thisMultiDetector->numberOfDetectors];
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
iret[idet] = new int(-1);
Task* task = new Task(new func1_t<int, int>(&slsDetector::setFileIndex,
detectors[idet], i, iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
if (iret[idet] != NULL) {
if (ret == -100)
ret = *iret[idet];
else if (ret != *iret[idet])
ret = -1;
delete iret[idet];
} else
ret = -1;
if (detectors[idet]->getErrorMask())
setErrorMask(getErrorMask() | (1 << idet));
}
}
}
return ret;
} }
int multiSlsDetector::startReceiver() int multiSlsDetector::startReceiver()
@ -5556,41 +5521,7 @@ int multiSlsDetector::getReceiverCurrentFrameIndex()
int multiSlsDetector::resetFramesCaught() int multiSlsDetector::resetFramesCaught()
{ {
return parallelCallDetectorMember(&slsDetector::resetFramesCaught);
int ret = OK;
int posmax = thisMultiDetector->numberOfDetectors;
if (!threadpool) {
cout << "Error in creating threadpool. Exiting" << endl;
return FAIL;
} else {
int* iret[posmax];
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
iret[idet] = new int(OK);
Task* task = new Task(new func0_t<int>(&slsDetector::resetFramesCaught,
detectors[idet], iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for (int idet = 0; idet < posmax; ++idet) {
if (detectors[idet]) {
if (iret[idet] != NULL) {
if (*iret[idet] != OK)
ret = FAIL;
delete iret[idet];
} else
ret = FAIL;
if (detectors[idet]->getErrorMask())
setErrorMask(getErrorMask() | (1 << idet));
}
}
}
return ret;
} }
int multiSlsDetector::createReceivingDataSockets(const bool destroy) int multiSlsDetector::createReceivingDataSockets(const bool destroy)
@ -6113,41 +6044,8 @@ int multiSlsDetector::enableDataStreamingToClient(int enable)
int multiSlsDetector::enableDataStreamingFromReceiver(int enable) int multiSlsDetector::enableDataStreamingFromReceiver(int enable)
{ {
if (enable >= 0) { if (enable >= 0) {
int ret = -100; thisMultiDetector->receiver_upstream = parallelCallDetectorMember(&slsDetector::enableDataStreamingFromReceiver, enable);
if (!threadpool) {
cout << "Error in creating threadpool. Exiting" << endl;
return -1;
} else {
//return storage values
int* iret[thisMultiDetector->numberOfDetectors];
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
iret[idet] = new int(-1);
Task* task = new Task(new func1_t<int, int>(&slsDetector::enableDataStreamingFromReceiver,
detectors[idet], enable, iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
if (iret[idet] != NULL) {
if (ret == -100)
ret = *iret[idet];
else if (ret != *iret[idet])
ret = -1;
delete iret[idet];
} else
ret = -1;
if (detectors[idet]->getErrorMask())
setErrorMask(getErrorMask() | (1 << idet));
}
}
}
thisMultiDetector->receiver_upstream = ret;
} }
return thisMultiDetector->receiver_upstream; return thisMultiDetector->receiver_upstream;
} }
@ -6365,11 +6263,9 @@ int multiSlsDetector::pulsePixelNMove(int n, int x, int y)
return ret; return ret;
} }
int multiSlsDetector::pulseChip(int n) int multiSlsDetector::pulseChip(int n)
{ {
return parallelCallDetectorMember(&slsDetector::pulseChip, n); return parallelCallDetectorMember(&slsDetector::pulseChip, n);
} }
void multiSlsDetector::setAcquiringFlag(bool b) void multiSlsDetector::setAcquiringFlag(bool b)

View File

@ -1047,7 +1047,7 @@ class multiSlsDetector : public slsDetectorUtils {
std::string callDetectorMemeber(std::string(slsDetector::*somefunc)()); std::string callDetectorMemeber(std::string(slsDetector::*somefunc)());
int callDetectorMemeber(int (slsDetector::*somefunc)(int), int value); int callDetectorMemeber(int (slsDetector::*somefunc)(int), int value);
int parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value); //Should probably be templated int parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value); //Should probably be templated
int parallelCallDetectorMember(int (slsDetector::*somefunc)());
/** returns the detector trimbit/settings directory \sa sharedSlsDetector */ /** returns the detector trimbit/settings directory \sa sharedSlsDetector */
std::string getSettingsDir(); std::string getSettingsDir();