mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-22 03:40:04 +02:00
det id const and ini shm in constructor
This commit is contained in:
parent
7522a655df
commit
4943983d10
@ -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 +=
|
||||
|
@ -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};
|
||||
|
@ -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;
|
||||
|
@ -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};
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user