From cfe9a431f976dd45a394159042dd31230daab5a0 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 26 Jun 2020 11:50:40 +0200 Subject: [PATCH] WIP, moving virtual status stop to shm from files --- .../slsDetectorServer/include/sharedMemory.h | 23 ++++ .../slsDetectorServer/src/sharedMemory.c | 129 ++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 slsDetectorServers/slsDetectorServer/include/sharedMemory.h create mode 100644 slsDetectorServers/slsDetectorServer/src/sharedMemory.c diff --git a/slsDetectorServers/slsDetectorServer/include/sharedMemory.h b/slsDetectorServers/slsDetectorServer/include/sharedMemory.h new file mode 100644 index 000000000..c74819070 --- /dev/null +++ b/slsDetectorServers/slsDetectorServer/include/sharedMemory.h @@ -0,0 +1,23 @@ +#pragma once + +#include + +typedef struct Memory { + int version; + sem_t sem; +#ifdef VIRTUAL + int status; + int stop; +#endif +} sharedMem; + +char *getSharedMemoryError(); +void printSharedMemory(sharedMem *shm); +int createSharedMemory(sharedMem **shm, int port); +void initializeSharedMemory(sharedMem *shm); +int openSharedMemory(sharedMem **shm, int port); +int attachSharedMemory(sharedMem **shm); +int detachSharedMemory(sharedMem **shm); +int removeSharedMemory(); +void lockSharedMemory(); +void unlockSharedMemory(); diff --git a/slsDetectorServers/slsDetectorServer/src/sharedMemory.c b/slsDetectorServers/slsDetectorServer/src/sharedMemory.c new file mode 100644 index 000000000..49ce6422c --- /dev/null +++ b/slsDetectorServers/slsDetectorServer/src/sharedMemory.c @@ -0,0 +1,129 @@ +#include "sharedMemory.h" +#include "clogger.h" +#include "sls_detector_defs.h" + +#include // errno +#include // O_CREAT, O_TRUNC.. +#include +#include // shared memory +#include // fstat +#include + +#include +#include +#include + +#define SHM_NAME "sls_server_shared_memory" +#define SHM_VERSION 0x200625 +#define SHM_KEY 5678 +char shmMess[MAX_STR_LENGTH]; +int shmFd = -1; + +extern int isControlServer; + +char *getSharedMemoryError() { return shmMess; } + +void printSharedMemory(sharedMem *shm) { + LOG(logINFO, ("%s Shared Memory:\n", isControlServer ? "c" : "s")); + LOG(logINFO, + ("%s version:0x%x\n", isControlServer ? "c" : "s", shm->version)); +#ifdef VIRTUAL + LOG(logINFO, ("%s status: %d\n", isControlServer ? "c" : "s", shm->status)); + LOG(logINFO, ("%s stop: %d\n", isControlServer ? "c" : "s", shm->stop)); +#endif +} + +int createSharedMemory(sharedMem **shm, int port) { + memset(shmMess, 0, MAX_STR_LENGTH); + + // if sham existed, delete old shm and create again + shmFd = + shmget(SHM_KEY + port, sizeof(sharedMem), IPC_CREAT | IPC_EXCL | 0666); + if (shmFd == -1 && errno == EEXIST) { + LOG(logWARNING, ("Removing old shared memory\n")); + // cuz of unknown previous shm size, it has to be deleted like this + system( + "for i in seq `ipcs -m | cut -d ' ' -f1`; do ipcrm -M $i; done;"); + shmFd = shmget(SHM_KEY + port, sizeof(sharedMem), + IPC_CREAT | IPC_EXCL | 0666); + } + if (shmFd == -1) { + sprintf(shmMess, "Create shared memory failed: %s\n", strerror(errno)); + LOG(logERROR, (shmMess)); + return 0; + } + LOG(logINFO, ("Shared memory created\n")); + if (!attachSharedMemory(shm)) { + return 0; + } + initializeSharedMemory(*shm); + return 1; +} + +void initializeSharedMemory(sharedMem *shm) { + shm->version = SHM_VERSION; + sem_init(&(shm->sem), 1, 1); +#ifdef VIRTUAL + shm->status = 0; + shm->stop = 0; +#endif + LOG(logINFO, ("Shared memory initialized\n")) +} + +int openSharedMemory(sharedMem **shm, int port) { + memset(shmMess, 0, MAX_STR_LENGTH); + shmFd = shmget(SHM_KEY + port, sizeof(sharedMem), 0666); + if (shmFd == -1) { + sprintf(shmMess, "Open shared memory failed: %s\n", strerror(errno)); + LOG(logERROR, (shmMess)); + return 0; + } + if (!attachSharedMemory(shm)) { + return 0; + } + if ((*shm)->version != SHM_VERSION) { + sprintf(shmMess, + "Shared memory version 0x%x does not match! (expected: 0x%x)\n", + (*shm)->version, SHM_VERSION); + LOG(logERROR, (shmMess)); + } + LOG(logINFO, ("Shared memory opened\n")); + return 1; +} + +int attachSharedMemory(sharedMem **shm) { + *shm = (sharedMem *)shmat(shmFd, NULL, 0); + if (*shm == (void *)-1) { + sprintf(shmMess, "could not attach: %s\n", strerror(errno)); + LOG(logERROR, (shmMess)); + return 0; + } + LOG(logINFO, ("Shared memory attached\n")); + return 1; +} + +int detachSharedMemory(sharedMem **shm) { + memset(shmMess, 0, MAX_STR_LENGTH); + if (shmdt(*shm) == -1) { + sprintf(shmMess, "could not detach: %s\n", strerror(errno)); + LOG(logERROR, (shmMess)); + return 0; + } + LOG(logINFO, ("Shared memory detached\n")); + return 1; +} + +int removeSharedMemory() { + memset(shmMess, 0, MAX_STR_LENGTH); + if (shmctl(shmFd, IPC_RMID, NULL) == -1) { + sprintf(shmMess, "could not remove: %s\n", strerror(errno)); + LOG(logERROR, (shmMess)); + return 0; + } + LOG(logINFO, ("Shared memory removed\n")); + return 1; +} + +void lockSharedMemory(sharedMem *shm) { sem_wait(&(shm->sem)); } + +void unlockSharedMemory(sharedMem *shm) { sem_post(&(shm->sem)); } \ No newline at end of file