Merge branch 'refactor' of github.com:slsdetectorgroup/slsDetectorPackage into refactor

This commit is contained in:
2018-10-10 18:11:23 +02:00
2 changed files with 35 additions and 60 deletions

View File

@ -65,9 +65,7 @@ multiSlsDetector::~multiSlsDetector() {
void multiSlsDetector::setupMultiDetector(bool verify, bool update) { void multiSlsDetector::setupMultiDetector(bool verify, bool update) {
if (initSharedMemory(verify)) initSharedMemory(verify);
// shared memory just created, so initialize the structure
initializeDetectorStructure();
initializeMembers(verify); initializeMembers(verify);
if (update) if (update)
updateUserdetails(); updateUserdetails();
@ -78,13 +76,8 @@ template <typename RT, typename... CT>
std::vector<RT> multiSlsDetector::serialCall(RT (slsDetector::*somefunc)(CT...), CT... Args) std::vector<RT> multiSlsDetector::serialCall(RT (slsDetector::*somefunc)(CT...), CT... Args)
{ {
std::vector<RT> result; std::vector<RT> result;
for (auto& d: detectors) { for (auto& d: detectors)
result.push_back((d.get()->*somefunc)(Args...)); result.push_back((d.get()->*somefunc)(Args...));
/*
if ((*this)[idet]->getErrorMask())
setErrorMask(getErrorMask() | (1 << idet));
*/
}
return result; return result;
} }
@ -92,17 +85,11 @@ template <typename RT, typename... CT>
std::vector<RT> multiSlsDetector::parallelCall(RT (slsDetector::*somefunc)(CT...), CT... Args) std::vector<RT> multiSlsDetector::parallelCall(RT (slsDetector::*somefunc)(CT...), CT... Args)
{ {
std::vector<std::future<RT>> futures; std::vector<std::future<RT>> futures;
for (auto &d : detectors) { for (auto &d : detectors)
futures.push_back(std::async(std::launch::async, somefunc, d.get(), Args...)); futures.push_back(std::async(std::launch::async, somefunc, d.get(), Args...));
/*
if ((*this)[idet]->getErrorMask())
setErrorMask(getErrorMask() | (1 << idet));
*/
}
std::vector<RT> result; std::vector<RT> result;
for (auto& i : futures) for (auto& i : futures)
result.push_back(i.get()); result.push_back(i.get());
return result; return result;
} }
@ -290,23 +277,22 @@ int64_t multiSlsDetector::getId(idMode mode, int detPos) {
} }
slsDetector* multiSlsDetector::getSlsDetector(int detPos) { // slsDetector* multiSlsDetector::getSlsDetector(int detPos) {
return detectors[detPos].get(); // return detectors[detPos].get();
} // }
// slsDetector *multiSlsDetector::operator()(int detPos) const {
// return detectors[detPos].get();
// }
slsDetector *multiSlsDetector::operator()(int detPos) const { // slsDetector* multiSlsDetector::operator[](int detPos) const {
return detectors[detPos].get(); // //Providing access to detectors with range checking
} // //throw exception if out of range
// if (detPos >= 0 && detPos < (int)detectors.size())
slsDetector* multiSlsDetector::operator[](int detPos) const { // return detectors[detPos].get();
//Providing access to detectors with range checking // else
//throw exception if out of range // throw(std::range_error("Detector does not exist"));
if (detPos >= 0 && detPos < (int)detectors.size()) // }
return detectors[detPos].get();
else
throw(std::range_error("Detector does not exist"));
}
void multiSlsDetector::freeSharedMemory(int multiId, int detPos) { void multiSlsDetector::freeSharedMemory(int multiId, int detPos) {
// single // single
@ -318,22 +304,20 @@ void multiSlsDetector::freeSharedMemory(int multiId, int detPos) {
// multi // multi
// get number of detectors // get number of detectors
int numDetectors = 0; int numDetectors = 0;
SharedMemory* shm = new SharedMemory(multiId, -1); auto shm = SharedMemory(multiId, -1);
// get number of detectors from multi shm // get number of detectors from multi shm
if (shm->IsExisting()) { if (shm.IsExisting()) {
sharedMultiSlsDetector* mdet = (sharedMultiSlsDetector*)shm->OpenSharedMemory( sharedMultiSlsDetector* mdet = (sharedMultiSlsDetector*)shm.OpenSharedMemory(
sizeof(sharedMultiSlsDetector)); sizeof(sharedMultiSlsDetector));
numDetectors = mdet->numberOfDetectors; numDetectors = mdet->numberOfDetectors;
shm->UnmapSharedMemory(mdet); shm.UnmapSharedMemory(mdet);
shm->RemoveSharedMemory(); shm.RemoveSharedMemory();
} }
delete shm;
for (int i = 0; i < numDetectors; ++i) { for (int i = 0; i < numDetectors; ++i) {
SharedMemory* shm = new SharedMemory(multiId, i); auto shm = SharedMemory(multiId, i);
shm->RemoveSharedMemory(); shm.RemoveSharedMemory();
delete shm;
} }
} }
@ -405,18 +389,16 @@ std::string multiSlsDetector::getUserDetails() {
* pre: sharedMemory=0, thisMultiDetector = 0, detectors.size() = 0 * pre: sharedMemory=0, thisMultiDetector = 0, detectors.size() = 0
* exceptions are caught in calling function, shm unmapped and deleted * exceptions are caught in calling function, shm unmapped and deleted
*/ */
bool multiSlsDetector::initSharedMemory(bool verify) { void multiSlsDetector::initSharedMemory(bool verify) {
size_t sz = sizeof(sharedMultiSlsDetector);
bool created = false;
try { try {
// shared memory object with name // shared memory object with name
sharedMemory = new SharedMemory(detId, -1); sharedMemory = new SharedMemory(detId, -1);
size_t sz = sizeof(sharedMultiSlsDetector);
//create //create
if (!sharedMemory->IsExisting()) { if (!sharedMemory->IsExisting()) {
thisMultiDetector = (sharedMultiSlsDetector*)sharedMemory->CreateSharedMemory(sz); thisMultiDetector = (sharedMultiSlsDetector*)sharedMemory->CreateSharedMemory(sz);
created = true; initializeDetectorStructure();
} }
// open and verify version // open and verify version
else { else {
@ -441,8 +423,6 @@ bool multiSlsDetector::initSharedMemory(bool verify) {
} }
throw; throw;
} }
return created;
} }
@ -607,8 +587,6 @@ void multiSlsDetector::addSlsDetector (std::string s) {
int pos = (int)detectors.size(); int pos = (int)detectors.size();
// slsDetector* sdet = new slsDetector(type, detId, pos, false);
// detectors.push_back(sdet);
detectors.push_back(sls::make_unique<slsDetector>(type, detId, pos, false)); detectors.push_back(sls::make_unique<slsDetector>(type, detId, pos, false));
@ -654,7 +632,7 @@ std::string multiSlsDetector::getDetectorType(int detPos) {
int multiSlsDetector::getNumberOfDetectors() { int multiSlsDetector::getNumberOfDetectors() {
return (int)detectors.size(); return detectors.size();
} }
@ -664,7 +642,8 @@ int multiSlsDetector::getNumberOfDetectors(dimension d) {
void multiSlsDetector::getNumberOfDetectors(int& nx, int& ny) { void multiSlsDetector::getNumberOfDetectors(int& nx, int& ny) {
nx=thisMultiDetector->numberOfDetector[X];ny=thisMultiDetector->numberOfDetector[Y]; nx=thisMultiDetector->numberOfDetector[X];
ny=thisMultiDetector->numberOfDetector[Y];
} }
@ -2987,10 +2966,6 @@ int multiSlsDetector::createReceivingDataSockets(const bool destroy) {
uint32_t portnum = stoi(detectors[iSocket / numSocketsPerDetector]->getClientStreamingPort()); uint32_t portnum = stoi(detectors[iSocket / numSocketsPerDetector]->getClientStreamingPort());
portnum += (iSocket % numSocketsPerDetector); portnum += (iSocket % numSocketsPerDetector);
try { try {
// ZmqSocket* z = new ZmqSocket(
// detectors[iSocket / numSocketsPerDetector]->getClientStreamingIP().c_str(),
// portnum);
// zmqSocket.push_back(z);
zmqSocket.push_back(sls::make_unique<ZmqSocket>(detectors[iSocket / numSocketsPerDetector]->getClientStreamingIP().c_str(), zmqSocket.push_back(sls::make_unique<ZmqSocket>(detectors[iSocket / numSocketsPerDetector]->getClientStreamingIP().c_str(),
portnum)); portnum));
printf("Zmq Client[%lu] at %s\n", iSocket, zmqSocket.back()->GetZmqServerAddress()); printf("Zmq Client[%lu] at %s\n", iSocket, zmqSocket.back()->GetZmqServerAddress());

View File

@ -237,16 +237,16 @@ public:
* @param detPos -1 for all detectors in list or specific detector position * @param detPos -1 for all detectors in list or specific detector position
* @returns pointer to sls detector object * @returns pointer to sls detector object
*/ */
slsDetector* getSlsDetector(int detPos = -1); // slsDetector* getSlsDetector(int detPos = -1);
/** /**
* Accessing the sls detector from the multi list using position * Accessing the sls detector from the multi list using position
* @param detPos -1 for all detectors in list or specific detector position * @param detPos -1 for all detectors in list or specific detector position
* @returns slsDetector object * @returns slsDetector object
*/ */
slsDetector *operator()(int detPos = -1) const; // slsDetector *operator()(int detPos = -1) const;
slsDetector* operator[](int detPos) const; // slsDetector* operator[](int detPos) const;
/** /**
* Free shared memory from the command line * Free shared memory from the command line
* avoiding creating the constructor classes and mapping * avoiding creating the constructor classes and mapping
@ -1594,7 +1594,7 @@ private:
* @param update true to update last user pid, date etc * @param update true to update last user pid, date etc
* @returns true if shared memory was created in this call, else false * @returns true if shared memory was created in this call, else false
*/ */
bool initSharedMemory(bool verify = true); void initSharedMemory(bool verify = true);
/** /**
* Initialize detector structure for the shared memory just created * Initialize detector structure for the shared memory just created