Merge branch 'developer' into dev/fix_tests

This commit is contained in:
2025-08-05 11:30:09 +02:00
29 changed files with 594 additions and 41 deletions

View File

@@ -56,6 +56,7 @@ class CtbConfig {
std::string getSlowADCName(size_t index) const;
std::vector<std::string> getSlowADCNames() const;
static const char *shm_tag();
bool isValid{true}; // false if freed to block access from python or c++ api
};
} // namespace sls

View File

@@ -29,6 +29,8 @@ void freeSharedMemory(const int detectorIndex, const int moduleIndex) {
if (moduleIndex >= 0) {
SharedMemory<sharedModule> moduleShm(detectorIndex, moduleIndex);
if (moduleShm.exists()) {
moduleShm.openSharedMemory(false);
moduleShm()->isValid = false;
moduleShm.removeSharedMemory();
}
return;
@@ -41,18 +43,26 @@ void freeSharedMemory(const int detectorIndex, const int moduleIndex) {
if (detectorShm.exists()) {
detectorShm.openSharedMemory(false);
numDetectors = detectorShm()->totalNumberOfModules;
detectorShm()->isValid = false;
detectorShm.removeSharedMemory();
}
for (int i = 0; i < numDetectors; ++i) {
SharedMemory<sharedModule> moduleShm(detectorIndex, i);
if (moduleShm.exists()) {
moduleShm.openSharedMemory(false);
moduleShm()->isValid = false;
}
moduleShm.removeSharedMemory();
}
// Ctb configuration
SharedMemory<CtbConfig> ctbShm(detectorIndex, -1, CtbConfig::shm_tag());
if (ctbShm.exists())
if (ctbShm.exists()) {
ctbShm.openSharedMemory(false);
ctbShm()->isValid = false;
ctbShm.removeSharedMemory();
}
}
using defs = slsDetectorDefs;

View File

@@ -24,7 +24,7 @@ class detectorData;
class Module;
#define DETECTOR_SHMAPIVERSION 0x190809
#define DETECTOR_SHMVERSION 0x250616
#define DETECTOR_SHMVERSION 0x250729
#define SHORT_STRING_LENGTH 50
/**
@@ -51,6 +51,8 @@ struct sharedDetector {
int totalNumberOfModules;
slsDetectorDefs::detectorType detType;
bool isValid{true}; // false if freed to block access from python or c++ api
/** END OF FIXED PATTERN
* -----------------------------------------------*/

View File

@@ -19,7 +19,7 @@ namespace sls {
class ServerInterface;
#define MODULE_SHMAPIVERSION 0x190726
#define MODULE_SHMVERSION 0x230913
#define MODULE_SHMVERSION 0x250729
/**
* @short structure allocated in shared memory to store Module settings for
@@ -32,6 +32,7 @@ struct sharedModule {
int shmversion;
char hostname[MAX_STR_LENGTH];
slsDetectorDefs::detectorType detType;
bool isValid{true}; // false if freed to block access from python or c++ api
/** END OF FIXED PATTERN -----------------------------------------------*/

View File

@@ -10,6 +10,7 @@
*@short functions basic implemenation of shared memory
*/
#include "sls/TypeTraits.h"
#include "sls/logger.h"
#include "sls/sls_detector_exceptions.h"
@@ -26,11 +27,18 @@
namespace sls {
struct sharedDetector;
#define SHM_DETECTOR_PREFIX "/slsDetectorPackage_detector_"
#define SHM_MODULE_PREFIX "_module_"
#define SHM_ENV_NAME "SLSDETNAME"
template <typename T> class SharedMemory {
static_assert(has_bool_isValid<T>::value,
"SharedMemory requires the struct to have a bool member "
"named 'isValid'");
static constexpr int NAME_MAX_LENGTH = 255;
std::string name;
T *shared_struct{nullptr};
@@ -65,15 +73,21 @@ template <typename T> class SharedMemory {
}
T *operator()() {
if (shared_struct)
return shared_struct;
throw SharedMemoryError(getNoShmAccessMessage());
if (!shared_struct)
throw SharedMemoryError(getNoShmAccessMessage());
if (!shared_struct->isValid) {
throw SharedMemoryError(getInvalidShmMessage());
}
return shared_struct;
}
const T *operator()() const {
if (shared_struct)
return shared_struct;
throw SharedMemoryError(getNoShmAccessMessage());
if (!shared_struct)
throw SharedMemoryError(getNoShmAccessMessage());
if (!shared_struct->isValid) {
throw SharedMemoryError(getInvalidShmMessage());
}
return shared_struct;
}
std::string getName() const { return name; }
@@ -215,10 +229,15 @@ template <typename T> class SharedMemory {
}
}
const char *getNoShmAccessMessage() const {
inline const char *getNoShmAccessMessage() const {
return ("No shared memory to access. Create it first with "
"hostname or config command.");
};
inline const char *getInvalidShmMessage() const {
return ("Shared memory is invalid or freed. Close resources before "
"access.");
};
};
} // namespace sls