diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 925d78ae6..9ee47eca2 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -33,7 +33,7 @@ multiSlsDetector::multiSlsDetector(int id, bool verify, bool update) multiSlsDetector::~multiSlsDetector() { if (sharedMemory) { - sharedMemory->UnmapSharedMemory(thisMultiDetector); + sharedMemory->UnmapSharedMemory(); delete sharedMemory; } } @@ -252,20 +252,21 @@ void multiSlsDetector::freeSharedMemory(int multiId, int detPos) { // multi // get number of detectors int numDetectors = 0; - auto shm = SharedMemory(multiId, -1); + auto shm = SharedMemory(multiId, -1); // get number of detectors from multi shm if (shm.IsExisting()) { - sharedMultiSlsDetector *mdet = - (sharedMultiSlsDetector *)shm.OpenSharedMemory( - sizeof(sharedMultiSlsDetector)); - numDetectors = mdet->numberOfDetectors; - shm.UnmapSharedMemory(mdet); + // sharedMultiSlsDetector *mdet = + // (sharedMultiSlsDetector *)shm.OpenSharedMemory( + // sizeof(sharedMultiSlsDetector)); + shm.OpenSharedMemory(sizeof(sharedMultiSlsDetector)); + numDetectors = shm()->numberOfDetectors; + shm.UnmapSharedMemory(); shm.RemoveSharedMemory(); } for (int i = 0; i < numDetectors; ++i) { - auto shm = SharedMemory(multiId, i); + auto shm = SharedMemory(multiId, i); shm.RemoveSharedMemory(); } } @@ -288,7 +289,7 @@ void multiSlsDetector::freeSharedMemory(int detPos) { // clear multi detector shm if (sharedMemory) { if (thisMultiDetector) { - sharedMemory->UnmapSharedMemory(thisMultiDetector); + sharedMemory->UnmapSharedMemory(); thisMultiDetector = nullptr; } sharedMemory->RemoveSharedMemory(); @@ -326,19 +327,23 @@ std::string multiSlsDetector::getUserDetails() { void multiSlsDetector::initSharedMemory(bool verify) { try { // shared memory object with name - sharedMemory = new SharedMemory(detId, -1); + sharedMemory = new SharedMemory(detId, -1); size_t sz = sizeof(sharedMultiSlsDetector); // create if (!sharedMemory->IsExisting()) { - thisMultiDetector = - (sharedMultiSlsDetector *)sharedMemory->CreateSharedMemory(sz); + // thisMultiDetector = + // (sharedMultiSlsDetector *)sharedMemory->CreateSharedMemory(sz); + sharedMemory->CreateSharedMemory(sz); + thisMultiDetector= (*sharedMemory)(); //TODO remove line initializeDetectorStructure(); } // open and verify version else { - thisMultiDetector = - (sharedMultiSlsDetector *)sharedMemory->OpenSharedMemory(sz); + // thisMultiDetector = + // (sharedMultiSlsDetector *)sharedMemory->OpenSharedMemory(sz); + sharedMemory->OpenSharedMemory(sz); + thisMultiDetector = (*sharedMemory)(); if (verify && thisMultiDetector->shmversion != MULTI_SHMVERSION) { FILE_LOG(logERROR) << "Multi shared memory (" << detId << ") version mismatch " "(expected 0x" @@ -350,7 +355,7 @@ void multiSlsDetector::initSharedMemory(bool verify) { if (sharedMemory) { // unmap if (thisMultiDetector) { - sharedMemory->UnmapSharedMemory(thisMultiDetector); + sharedMemory->UnmapSharedMemory(); thisMultiDetector = nullptr; } // delete diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 6b52bddab..3a80bc2f2 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -10,9 +10,9 @@ #include "error_defs.h" #include "logger.h" #include "sls_detector_defs.h" - +#include "SharedMemory.h" class slsDetector; -class SharedMemory; +// class SharedMemory; class ZmqSocket; class detectorData; @@ -27,10 +27,7 @@ class detectorData; #define SHORT_STRING_LENGTH 50 #define DATE_LENGTH 30 -class multiSlsDetector : public virtual slsDetectorDefs, - public virtual errorDefs { - private: /** * @short structure allocated in shared memory to store detector settings * for IPC and cache @@ -99,7 +96,7 @@ class multiSlsDetector : public virtual slsDetectorDefs, int maxNumberOfChannelsPerDetector[2]; /** timer values */ - int64_t timerValue[MAX_TIMERS]; + int64_t timerValue[slsDetectorDefs::timerIndex::MAX_TIMERS]; /** flag for acquiring */ bool acquiringFlag; @@ -113,6 +110,12 @@ class multiSlsDetector : public virtual slsDetectorDefs, } sharedMultiSlsDetector; +class multiSlsDetector : public virtual slsDetectorDefs, + public virtual errorDefs { + + // private: + + public: /** * Constructor @@ -1963,7 +1966,7 @@ class multiSlsDetector : public virtual slsDetectorDefs, int detId; /** Shared Memory object */ - SharedMemory *sharedMemory {nullptr}; + SharedMemory *sharedMemory {nullptr}; /** Shared memory structure */ sharedMultiSlsDetector *thisMultiDetector {nullptr}; diff --git a/slsDetectorSoftware/sharedMemory/SharedMemory.cpp b/slsDetectorSoftware/sharedMemory/SharedMemory.cpp index 10a47d37c..97b76f903 100644 --- a/slsDetectorSoftware/sharedMemory/SharedMemory.cpp +++ b/slsDetectorSoftware/sharedMemory/SharedMemory.cpp @@ -3,6 +3,9 @@ #include "ansi.h" #include "logger.h" +#include "slsDetector.h" +#include "multiSlsDetector.h" + #include #include // printf #include // errno @@ -18,7 +21,8 @@ #define SHM_SLS_PREFIX "_sls_" #define SHM_ENV_NAME "SLSDETNAME" -SharedMemory::SharedMemory(int multiId, int slsId): +template +SharedMemory::SharedMemory(int multiId, int slsId): fd(-1), shmSize(0) { @@ -26,14 +30,14 @@ SharedMemory::SharedMemory(int multiId, int slsId): } - -SharedMemory::~SharedMemory(){ +template +SharedMemory::~SharedMemory(){ if (fd >= 0) close(fd); } - -bool SharedMemory::IsExisting() { +template +bool SharedMemory::IsExisting() { bool ret = true; int tempfd = shm_open(name.c_str(), O_RDWR, 0); if ((tempfd < 0) && (errno == ENOENT)) { @@ -43,12 +47,13 @@ bool SharedMemory::IsExisting() { return ret; } -std::string SharedMemory::GetName() { +template +std::string SharedMemory::GetName() { return name; } - -void* SharedMemory::CreateSharedMemory(size_t sz){ +template +void SharedMemory::CreateSharedMemory(size_t sz){ // create fd = shm_open(name.c_str(), O_CREAT | O_TRUNC | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR); if (fd < 0) { @@ -65,12 +70,15 @@ void* SharedMemory::CreateSharedMemory(size_t sz){ } // map - void* addr = MapSharedMemory(sz); + // void* addr = MapSharedMemory(sz); + shared_struct = MapSharedMemory(sz); FILE_LOG(logINFO) << "Shared memory created " << name; - return addr; + + // return addr; } -void* SharedMemory::OpenSharedMemory(size_t sz){ +template +void SharedMemory::OpenSharedMemory(size_t sz){ // open fd = shm_open(name.c_str(), O_RDWR, 0); if (fd < 0) { @@ -78,19 +86,21 @@ void* SharedMemory::OpenSharedMemory(size_t sz){ throw SharedMemoryException(); } - return MapSharedMemory(sz); + shared_struct = MapSharedMemory(sz); + // return MapSharedMemory(sz); } - -void SharedMemory::UnmapSharedMemory(void* addr) { - if (munmap(addr, shmSize) < 0) { +template +void SharedMemory::UnmapSharedMemory() { + if (munmap(shared_struct, shmSize) < 0) { FILE_LOG(logERROR) << "Unmapping shared memory " << name << " failed: " << strerror(errno); close(fd); throw SharedMemoryException(); } } -void SharedMemory::RemoveSharedMemory() { +template +void SharedMemory::RemoveSharedMemory() { if (shm_unlink(name.c_str()) < 0) { // silent exit if shm did not exist anyway if (errno == ENOENT) @@ -102,7 +112,8 @@ void SharedMemory::RemoveSharedMemory() { } -void* SharedMemory::MapSharedMemory(size_t sz) { +template +T* SharedMemory::MapSharedMemory(size_t sz) { void* addr = mmap(nullptr, sz, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (addr == MAP_FAILED) { FILE_LOG(logERROR) << "Mapping shared memory " << name << " failed: " << strerror(errno); @@ -111,11 +122,11 @@ void* SharedMemory::MapSharedMemory(size_t sz) { } shmSize = sz; close(fd); - return addr; + return (T*)addr; } - -std::string SharedMemory::ConstructSharedMemoryName(int multiId, int slsId) { +template +std::string SharedMemory::ConstructSharedMemoryName(int multiId, int slsId) { // using environment path std::string sEnvPath = ""; @@ -141,8 +152,8 @@ std::string SharedMemory::ConstructSharedMemoryName(int multiId, int slsId) { return temp; } - -int SharedMemory::VerifySizeMatch(size_t expectedSize) { +template +int SharedMemory::VerifySizeMatch(size_t expectedSize) { struct stat sb; // could not fstat if (fstat(fd, &sb) < 0) { @@ -163,3 +174,5 @@ int SharedMemory::VerifySizeMatch(size_t expectedSize) { return 0; } +template class SharedMemory; +template class SharedMemory; \ No newline at end of file diff --git a/slsDetectorSoftware/sharedMemory/SharedMemory.h b/slsDetectorSoftware/sharedMemory/SharedMemory.h index ebec18606..6b15e61d4 100644 --- a/slsDetectorSoftware/sharedMemory/SharedMemory.h +++ b/slsDetectorSoftware/sharedMemory/SharedMemory.h @@ -11,6 +11,7 @@ #include #include +template class SharedMemory{ public: /** @@ -43,21 +44,20 @@ public: * throws a SharedMemoryException exception on failure to create, ftruncate or map * @param sz of shared memory */ - void* CreateSharedMemory(size_t sz); + void CreateSharedMemory(size_t sz); /** * Open existing Shared memory and call MapSharedMemory to map it to an address * throws a SharedMemoryException exception on failure to open or map * @param sz of shared memory */ - void* OpenSharedMemory(size_t sz); + void OpenSharedMemory(size_t sz); /** * Unmap shared memory from an address * throws a SharedMemoryException exception on failure - * @param addr double pointer to address to be mapped */ - void UnmapSharedMemory(void* addr); + void UnmapSharedMemory(); /** * Remove existing Shared memory @@ -69,6 +69,19 @@ public: */ static const int NAME_MAX = 255; + + /* + Using the call operator to access the pointer + + */ + T* operator()(){ + return shared_struct; + } + + const T* operator()() const{ + return shared_struct; + } + private: /** * Create Shared memory name @@ -84,7 +97,7 @@ private: * throws a SharedMemoryException exception on failure * @param sz of shared memory */ - void* MapSharedMemory(size_t sz); + T* MapSharedMemory(size_t sz); /** * Verify if existing shared memory size matches expected size @@ -102,4 +115,6 @@ private: /** shm size */ size_t shmSize; + T* shared_struct; + }; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index cfbef4cdd..502c391e2 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -31,7 +31,7 @@ slsDetector::slsDetector(detectorType type, int multiId, int id, bool verify) * so sls shared memory will be created */ // ensure shared memory was not created before - auto shm = SharedMemory(multiId, id); + auto shm = SharedMemory(multiId, id); if (shm.IsExisting()) { FILE_LOG(logWARNING) << "This shared memory should have been " "deleted before! " @@ -202,7 +202,7 @@ int64_t slsDetector::getId(idMode mode) { } void slsDetector::freeSharedMemory(int multiId, int slsId) { - auto shm = SharedMemory(multiId, slsId); + auto shm = SharedMemory(multiId, slsId); shm.RemoveSharedMemory(); } @@ -236,7 +236,7 @@ void slsDetector::initSharedMemory(bool created, detectorType type, int multiId, int sz = calculateSharedMemorySize(type); // shared memory object with name - sharedMemory = new SharedMemory(multiId, detId); + sharedMemory = new SharedMemory(multiId, detId); // create if (created) { @@ -636,7 +636,7 @@ int slsDetector::receiveModule(sls_detector_module *myMod) { } slsDetectorDefs::detectorType slsDetector::getDetectorTypeFromShm(int multiId, bool verify) { - auto shm = SharedMemory(multiId, detId); + auto shm = SharedMemory(multiId, detId); if (!shm.IsExisting()) { FILE_LOG(logERROR) << "Shared memory " << shm.GetName() << " does not exist.\n" "Corrupted Multi Shared memory. Please free shared memory."; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 74239311e..dabc95bd7 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -13,13 +13,13 @@ #include "error_defs.h" #include "logger.h" #include "ClientSocket.h" - +#include "SharedMemory.h" class ClientInterface; #include class multiSlsDetector; -class SharedMemory; +// class SharedMemory; class ServerInterface; class MySocketTCP; @@ -42,9 +42,6 @@ typedef struct detParameterList { } detParameterList; -class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { - -private: /** * @short structure allocated in shared memory to store detector settings for IPC and cache */ @@ -68,7 +65,7 @@ private: char hostname[MAX_STR_LENGTH]; /** detector type \ see :: detectorType*/ - detectorType myDetectorType; + slsDetectorDefs::detectorType myDetectorType; /** END OF FIXED PATTERN -----------------------------------------------*/ @@ -125,22 +122,22 @@ private: int nROI; /** list of rois */ - ROI roiLimits[MAX_ROIS]; + slsDetectorDefs::ROI roiLimits[MAX_ROIS]; /** readout flags */ - readOutFlags roFlags; + slsDetectorDefs::readOutFlags roFlags; /** name root of the output files */ char settingsFile[MAX_STR_LENGTH]; /** detector settings (standard, fast, etc.) */ - detectorSettings currentSettings; + slsDetectorDefs::detectorSettings currentSettings; /** detector threshold (eV) */ int currentThresholdEV; /** timer values */ - int64_t timerValue[MAX_TIMERS]; + int64_t timerValue[slsDetectorDefs::timerIndex::MAX_TIMERS]; /** memory offsets for the module structures */ int modoff; @@ -226,7 +223,7 @@ private: int64_t receiverAPIVersion; /** receiver frames discard policy */ - frameDiscardPolicy receiver_frameDiscardMode; + slsDetectorDefs::frameDiscardPolicy receiver_frameDiscardMode; /** receiver partial frames padding enable */ bool receiver_framePadding; @@ -250,7 +247,7 @@ private: int receiver_fileIndex; /** file format */ - fileFormat receiver_fileFormatType; + slsDetectorDefs::fileFormat receiver_fileFormatType; /** frames per file */ int receiver_framesPerFile; @@ -263,10 +260,7 @@ private: } sharedSlsDetector; - - - - +class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { public: /** @@ -1794,7 +1788,7 @@ private: int detId; /** Shared Memory object */ - SharedMemory* sharedMemory {nullptr}; + SharedMemory* sharedMemory {nullptr}; /** Shared memory structure */ sharedSlsDetector *thisDetector {nullptr};