det id const and ini shm in constructor

This commit is contained in:
Erik Frojdh 2019-03-15 10:15:42 +01:00
parent 7522a655df
commit 4943983d10
5 changed files with 70 additions and 70 deletions

View File

@ -29,8 +29,9 @@
using sls::SharedMemory;
using sls::SharedMemoryError;
multiSlsDetector::multiSlsDetector(int id, bool verify, bool update)
: detId(id) {
multiSlsDetector::multiSlsDetector(int multi_id, bool verify, bool update)
: multiId(multi_id),
multi_shm(multi_id, -1) {
setupMultiDetector(verify, update);
}
@ -302,20 +303,15 @@ std::string multiSlsDetector::getUserDetails() {
return sstream.str();
}
/*
* pre: multi_shm=0, multi_shm() = 0, detectors.size() = 0
*/
void multiSlsDetector::initSharedMemory(bool verify) {
multi_shm = SharedMemory<sharedMultiSlsDetector>(detId, -1);
if (!multi_shm.IsExisting()) {
multi_shm.CreateSharedMemory();
initializeDetectorStructure();
}
else {
} else {
multi_shm.OpenSharedMemory();
if (verify && multi_shm()->shmversion != MULTI_SHMVERSION) {
FILE_LOG(logERROR) << "Multi shared memory (" << detId << ") version mismatch "
"(expected 0x"
FILE_LOG(logERROR) << "Multi shared memory (" << multiId << ") version mismatch "
"(expected 0x"
<< std::hex << MULTI_SHMVERSION << " but got 0x" << multi_shm()->shmversion << std::dec;
throw SharedMemoryError("Shared memory version mismatch!");
}
@ -355,7 +351,7 @@ void multiSlsDetector::initializeMembers(bool verify) {
for (int i = 0; i < multi_shm()->numberOfDetectors; i++) {
try {
detectors.push_back(
sls::make_unique<slsDetector>(detId, i, verify));
sls::make_unique<slsDetector>(multiId, i, verify));
} catch (...) {
detectors.clear();
throw;
@ -463,7 +459,7 @@ void multiSlsDetector::addSlsDetector(const std::string &hostname) {
}
int pos = (int)detectors.size();
detectors.push_back(sls::make_unique<slsDetector>(type, detId, pos, false));
detectors.push_back(sls::make_unique<slsDetector>(type, multiId, pos, false));
multi_shm()->numberOfDetectors = detectors.size();
multi_shm()->dataBytes += detectors[pos]->getDataBytes();
multi_shm()->dataBytesInclGapPixels +=

View File

@ -120,7 +120,7 @@ class multiSlsDetector : public virtual slsDetectorDefs,
* one
* @param update true to update last user pid, date etc
*/
explicit multiSlsDetector(int id = 0, bool verify = true, bool update = true);
explicit multiSlsDetector(int multi_id = 0, bool verify = true, bool update = true);
/**
* Destructor
@ -1956,7 +1956,7 @@ class multiSlsDetector : public virtual slsDetectorDefs,
int kbhit();
/** Multi detector Id */
int detId;
const int multiId;
/** Shared Memory object */
sls::SharedMemory<sharedMultiSlsDetector> multi_shm{0, -1};

View File

@ -15,6 +15,7 @@
#include <arpa/inet.h>
#include <array>
#include <bitset>
#include <cassert>
#include <cmath>
#include <cstdlib>
#include <iomanip>
@ -22,39 +23,39 @@
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <cassert>
using sls::RuntimeError;
using sls::SharedMemory;
using sls::SharedMemoryError;
using sls::RuntimeError;
#define DEFAULT_HOSTNAME "localhost"
slsDetector::slsDetector(detectorType type, int multiId, int id, bool verify)
: detId(id) {
slsDetector::slsDetector(detectorType type, int multi_id, int det_id, bool verify)
: detId(det_id),
detector_shm(multi_id, det_id) {
/* called from put hostname command,
* so sls shared memory will be created */
// ensure shared memory was not created before
SharedMemory<sharedSlsDetector> shm(multiId, id);
if (shm.IsExisting()) {
if (detector_shm.IsExisting()) {
FILE_LOG(logWARNING) << "This shared memory should have been "
"deleted before! "
<< shm.GetName() << ". Freeing it again";
freeSharedMemory(multiId, id);
<< detector_shm.GetName() << ". Freeing it again";
freeSharedMemory(multi_id, det_id);
}
initSharedMemory(type, multiId, verify);
initSharedMemory(type, multi_id, verify);
}
slsDetector::slsDetector(int multiId, int id, bool verify)
: detId(id) {
slsDetector::slsDetector(int multi_id, int det_id, bool verify)
: detId(det_id),
detector_shm(multi_id, det_id) {
/* called from multi constructor to populate structure,
* so sls shared memory will be opened, not created */
// getDetectorType From shm will check if it was already existing
detectorType type = getDetectorTypeFromShm(multiId, verify);
initSharedMemory(type, multiId, verify);
detectorType type = getDetectorTypeFromShm(multi_id, verify);
initSharedMemory(type, multi_id, verify);
}
slsDetector::~slsDetector() = default;
@ -196,8 +197,8 @@ int64_t slsDetector::getId(idMode mode) {
}
}
void slsDetector::freeSharedMemory(int multiId, int slsId) {
SharedMemory<sharedSlsDetector> shm(multiId, slsId);
void slsDetector::freeSharedMemory(int multi_id, int slsId) {
SharedMemory<sharedSlsDetector> shm(multi_id, slsId);
if (shm.IsExisting()) {
shm.RemoveSharedMemory();
}
@ -219,10 +220,10 @@ std::string slsDetector::getHostname() {
}
void slsDetector::initSharedMemory(detectorType type,
int multiId,
int multi_id,
bool verify) {
detector_shm = SharedMemory<sharedSlsDetector>(multiId, detId);
detector_shm = SharedMemory<sharedSlsDetector>(multi_id, detId);
if (!detector_shm.IsExisting()) {
detector_shm.CreateSharedMemory();
initializeDetectorStructure(type);
@ -231,9 +232,9 @@ void slsDetector::initSharedMemory(detectorType type,
if (verify && detector_shm()->shmversion != SLS_SHMVERSION) {
FILE_LOG(logERROR) << "Single shared memory "
"("
<< multiId << "-" << detId << ":) "
"version mismatch "
"(expected 0x"
<< multi_id << "-" << detId << ":) "
"version mismatch "
"(expected 0x"
<< std::hex << SLS_SHMVERSION << " but got 0x" << detector_shm()->shmversion << ")" << std::dec;
throw SharedMemoryError("Shared memory version mismatch (det)");
}
@ -423,7 +424,6 @@ void slsDetector::initializeDetectorStructure(detectorType type) {
if (detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH) {
updateTotalNumberOfChannels();
}
}
slsDetectorDefs::sls_detector_module *slsDetector::createModule() {
@ -465,7 +465,7 @@ void slsDetector::connectDataError() {
setErrorMask((getErrorMask()) | (CANNOT_CONNECT_TO_RECEIVER));
}
int slsDetector::sendModule(sls_detector_module *myMod, sls::ClientSocket& client) {
int slsDetector::sendModule(sls_detector_module *myMod, sls::ClientSocket &client) {
TLogLevel level = logDEBUG1;
FILE_LOG(level) << "Sending Module";
int ts = 0;
@ -514,7 +514,7 @@ int slsDetector::sendModule(sls_detector_module *myMod, sls::ClientSocket& clien
return ts;
}
int slsDetector::receiveModule(sls_detector_module *myMod, sls::ClientSocket& client) {
int slsDetector::receiveModule(sls_detector_module *myMod, sls::ClientSocket &client) {
int ts = 0;
ts += client.receiveData(&(myMod->serialnumber), sizeof(myMod->serialnumber));
ts += client.receiveData(&(myMod->nchan), sizeof(myMod->nchan));
@ -537,28 +537,27 @@ int slsDetector::receiveModule(sls_detector_module *myMod, sls::ClientSocket& cl
return ts;
}
slsDetectorDefs::detectorType slsDetector::getDetectorTypeFromShm(int multiId, bool verify) {
SharedMemory<sharedSlsDetector> shm(multiId, detId);
if (!shm.IsExisting()) {
FILE_LOG(logERROR) << "Shared memory " << shm.GetName() << " does not exist.\n"
slsDetectorDefs::detectorType slsDetector::getDetectorTypeFromShm(int multi_id, bool verify) {
if (!detector_shm.IsExisting()) {
FILE_LOG(logERROR) << "Shared memory " << detector_shm.GetName() << " does not exist.\n"
"Corrupted Multi Shared memory. Please free shared memory.";
throw SharedMemoryError("Could not read detector type from shared memory");
}
// open, map, verify version
shm.OpenSharedMemory();
detector_shm.OpenSharedMemory();
if (verify && shm()->shmversion != SLS_SHMVERSION) {
if (verify && detector_shm()->shmversion != SLS_SHMVERSION) {
FILE_LOG(logERROR) << "Single shared memory "
"("
<< multiId << "-" << detId << ":)version mismatch "
"(expected 0x"
<< std::hex << SLS_SHMVERSION << " but got 0x" << shm()->shmversion << ")" << std::dec;
<< multi_id << "-" << detId << ":)version mismatch "
"(expected 0x"
<< std::hex << SLS_SHMVERSION << " but got 0x" << detector_shm()->shmversion << ")" << std::dec;
// unmap and throw
detector_shm.UnmapSharedMemory();
throw SharedMemoryError("Shared memory version mismatch");
}
auto type = shm()->myDetectorType;
auto type = detector_shm()->myDetectorType;
return type;
}
@ -3877,13 +3876,13 @@ int slsDetector::getChanRegs(double *retval) {
sls_detector_module *myMod = getModule();
if (myMod != nullptr) {
//the original array has 0 initialized
if (myMod->chanregs) {
for (int i = 0; i < n; ++i) {
retval[i] = (double)(myMod->chanregs[i] & TRIMBITMASK);
}
}
deleteModule(myMod);
//the original array has 0 initialized
if (myMod->chanregs) {
for (int i = 0; i < n; ++i) {
retval[i] = (double)(myMod->chanregs[i] & TRIMBITMASK);
}
}
deleteModule(myMod);
}
return n;
}
@ -4058,7 +4057,7 @@ std::string slsDetector::checkReceiverOnline() {
auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort);
detector_shm()->receiverOnlineFlag = ONLINE_FLAG;
} catch (...) {
detector_shm()->receiverOnlineFlag = OFFLINE_FLAG;
detector_shm()->receiverOnlineFlag = OFFLINE_FLAG;
retval = detector_shm()->receiver_hostname;
}
return retval;

View File

@ -250,23 +250,23 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs {
/**
* Constructor called when creating new shared memory
* @param type detector type
* @param multiId multi detector shared memory id
* @param multi_id multi detector shared memory id
* @param id sls detector id (position in detectors list)
* @param verify true to verify if shared memory version matches existing one
*/
explicit slsDetector(detectorType type,
int multiId = 0,
int id = 0,
int multi_id = 0,
int det_id = 0,
bool verify = true);
/**
* Constructor called when opening existing shared memory
* @param multiId multi detector shared memory id
* @param multi_id multi detector shared memory id
* @param id sls detector id (position in detectors list)
* @param verify true to verify if shared memory version matches existing one
*/
explicit slsDetector(int multiId = 0,
int id = 0,
explicit slsDetector(int multi_id = 0,
int det_id = 0,
bool verify = true);
/**
@ -300,10 +300,10 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs {
* If this is called, must take care to update
* multiSlsDetectors thisMultiDetector->numberofDetectors
* avoiding creating the constructor classes and mapping
* @param multiId multi detector Id
* @param multi_id multi detector Id
* @param slsId slsDetectorId or position of slsDetector in detectors list
*/
static void freeSharedMemory(int multiId, int slsId);
static void freeSharedMemory(int multi_id, int slsId);
/**
* Free shared memory and delete shared memory structure
@ -1616,21 +1616,21 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs {
private:
/**
* Get Detector Type from Shared Memory (opening shm without verifying size)
* @param multiId multi detector Id
* @param multi_id multi detector Id
* @param verify true to verify if shm size matches existing one
* @returns detector type
*/
detectorType getDetectorTypeFromShm(int multiId, bool verify = true);
detectorType getDetectorTypeFromShm(int multi_id, bool verify = true);
/**
* Initialize shared memory
* @param created true if shared memory must be created, else false to open
* @param type type of detector
* @param multiId multi detector Id
* @param multi_id multi detector Id
* @param verify true to verify if shm size matches existing one
* @returns true if the shared memory was created now
*/
void initSharedMemory(detectorType type, int multiId, bool verify = true);
void initSharedMemory(detectorType type, int multi_id, bool verify = true);
/**
* Sets detector parameters depending detector type
@ -1733,7 +1733,7 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs {
int writeSettingsFile(const std::string &fname, sls_detector_module& mod);
/** slsDetector Id or position in the detectors list */
int detId;
const int detId;
/** Shared Memory object */
sls::SharedMemory<sharedSlsDetector> detector_shm{0,0};

View File

@ -6,6 +6,8 @@
#include <unistd.h>
#include <stdexcept>
#include "sls_detector_defs.h"
#include "sls_detector_exceptions.h"
#include "logger.h"
namespace sls {
ClientSocket::ClientSocket(const bool isRx, const std::string &host, uint16_t port) : DataSocket(socket(AF_INET, SOCK_STREAM, 0)), isReceiver(isRx) {
@ -17,7 +19,8 @@ ClientSocket::ClientSocket(const bool isRx, const std::string &host, uint16_t po
hints.ai_flags |= AI_CANONNAME;
if (getaddrinfo(host.c_str(), NULL, &hints, &result) != 0) {
throw std::runtime_error("ClientSocket ERROR: cannot decode host\n");
std::string msg = "ClientSocket ERROR: decode host:" + host + " on port " + std::to_string(port)+ "\n";
throw std::runtime_error(msg);
}
//TODO! Erik, results could have multiple entries do we need to loop through them?
@ -29,7 +32,9 @@ ClientSocket::ClientSocket(const bool isRx, const std::string &host, uint16_t po
if (::connect(getSocketId(), (struct sockaddr *)&serverAddr, sizeof(serverAddr)) != 0) {
freeaddrinfo(result);
throw std::runtime_error("ClientSocket ERROR: cannot connect to host\n");
std::string msg = "ClientSocket ERROR: cannot connect to host:" + host + " on port " + std::to_string(port)+ "\n";
FILE_LOG(logERROR) << msg;
throw SocketError(msg);
}
freeaddrinfo(result);
}