From 28d407fb0ec8aabe29b060a67049064d7e554327 Mon Sep 17 00:00:00 2001 From: Andrej Babic Date: Wed, 2 Sep 2020 15:16:02 +0200 Subject: [PATCH] Implement common class for RamBuffer --- core-buffer/include/RamBuffer.hpp | 32 ++++++++++++ core-buffer/include/RamBufferWriter.hpp | 24 --------- core-buffer/src/RamBuffer.cpp | 66 +++++++++++++++++++++++++ core-buffer/src/RamBufferWriter.cpp | 48 ------------------ 4 files changed, 98 insertions(+), 72 deletions(-) create mode 100644 core-buffer/include/RamBuffer.hpp delete mode 100644 core-buffer/include/RamBufferWriter.hpp create mode 100644 core-buffer/src/RamBuffer.cpp delete mode 100644 core-buffer/src/RamBufferWriter.cpp diff --git a/core-buffer/include/RamBuffer.hpp b/core-buffer/include/RamBuffer.hpp new file mode 100644 index 0000000..486268f --- /dev/null +++ b/core-buffer/include/RamBuffer.hpp @@ -0,0 +1,32 @@ +#ifndef SF_DAQ_BUFFER_RAMBUFFER_HPP +#define SF_DAQ_BUFFER_RAMBUFFER_HPP + +#include +#include "formats.hpp" + +class RamBuffer { + const std::string detector_name_; + const int module_n_; + const size_t n_slots_; + const size_t image_size_; + const size_t buffer_size_; + + int shm_fd_; + void* buffer_; + + ModuleFrame* meta_buffer_; + char* image_buffer_; + + +public: + RamBuffer(const std::string& detector_name, + const size_t n_modules, + const int module_n, + const size_t n_slots); + ~RamBuffer(); + + void write_frame(const ModuleFrame& metadata, const char* data); +}; + + +#endif //SF_DAQ_BUFFER_RAMBUFFER_HPP diff --git a/core-buffer/include/RamBufferWriter.hpp b/core-buffer/include/RamBufferWriter.hpp deleted file mode 100644 index 64b6df9..0000000 --- a/core-buffer/include/RamBufferWriter.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef SF_DAQ_BUFFER_RAMBUFFERWRITER_HPP -#define SF_DAQ_BUFFER_RAMBUFFERWRITER_HPP - -#include - -class RamBufferWriter { - const int module_n_; - const std::string detector_name_; - - int shm_fd_; - size_t buffer_size_; - void* buffer_; - -public: - RamBufferWriter(const std::string& detector_name, - const int module_n, - const size_t n_modules, - const size_t n_slots); - ~RamBufferWriter(); - -}; - - -#endif //SF_DAQ_BUFFER_RAMBUFFERWRITER_HPP diff --git a/core-buffer/src/RamBuffer.cpp b/core-buffer/src/RamBuffer.cpp new file mode 100644 index 0000000..1268eba --- /dev/null +++ b/core-buffer/src/RamBuffer.cpp @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include +#include "RamBuffer.hpp" +#include "buffer_config.hpp" + +using namespace std; +using namespace buffer_config; + +RamBuffer::RamBuffer( + const string &detector_name, + const size_t n_modules, + const int module_n, + const size_t n_slots) : + detector_name_(detector_name), + module_n_(module_n), + n_slots_(n_slots), + image_size_(MODULE_N_BYTES * n_modules), + buffer_size_((sizeof(ModuleFrame) + image_size_) * n_slots) +{ + shm_fd_ = shm_open(detector_name_.c_str(), O_RDWR | O_CREAT, 0777); + if (shm_fd_ < 0) { + throw runtime_error(strerror(errno)); + } + + if ((ftruncate(shm_fd_, buffer_size_)) == -1) { + throw runtime_error(strerror(errno)); + } + + // TODO: Test with MAP_HUGETLB + buffer_ = mmap(NULL, buffer_size_, PROT_WRITE, MAP_SHARED, shm_fd_, 0); + if (buffer_ == MAP_FAILED) { + throw runtime_error(strerror(errno)); + } + + meta_buffer_ = (ModuleFrame *) buffer_; + // Image buffer start right after metadata buffer. + image_buffer_ = (char *) (meta_buffer_ + n_slots); +} + +RamBuffer::~RamBuffer() +{ + munmap(buffer_, buffer_size_); + close(shm_fd_); + shm_unlink(detector_name_.c_str()); + +} + +void RamBuffer::write_frame( + const ModuleFrame &metadata, + const char *data) +{ + size_t slot_n = metadata.pulse_id % n_slots_; + + ModuleFrame *meta = meta_buffer_ + slot_n; + *meta = metadata; + + char *frame = image_buffer_ + + (image_size_ * slot_n) + + (MODULE_N_BYTES * module_n_); + + memcpy(frame, data, MODULE_N_BYTES); +} + diff --git a/core-buffer/src/RamBufferWriter.cpp b/core-buffer/src/RamBufferWriter.cpp deleted file mode 100644 index 0aaa818..0000000 --- a/core-buffer/src/RamBufferWriter.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "RamBufferWriter.hpp" -#include "buffer_config.hpp" - -using namespace std; -using namespace buffer_config; - -RamBufferWriter::RamBufferWriter( - const string &detector_name, - const int module_n, - const size_t n_modules, - const size_t n_slots) : - detector_name_(detector_name), - module_n_(module_n) - -{ - shm_fd_ = shm_open(detector_name_.c_str(), O_RDWR | O_CREAT, 0777); - if (shm_fd_ < 0) { - throw runtime_error(strerror(errno)); - } - - size_t slot_size = MODULE_N_BYTES + sizeof(ModuleFrame); - buffer_size_ = slot_size * n_modules * n_slots; - - if ((ftruncate(shm_fd_, buffer_size_)) == -1) { - throw runtime_error(strerror(errno)); - } - - // TODO: Test with MAP_HUGETLB - void* ptr = mmap(NULL, buffer_size_, PROT_WRITE, MAP_SHARED, shm_fd_, 0); - if (ptr == MAP_FAILED) { - throw runtime_error(strerror(errno)); - } - - buffer_ = ptr; -} - -RamBufferWriter::~RamBufferWriter() -{ - munmap(buffer_, buffer_size_); - shm_unlink(detector_name_.c_str()); - close(shm_fd_); -}