File indexing completed on 2024-04-06 12:13:08
0001 #ifndef FWCore_SharedMemory_ReadBuffer_h
0002 #define FWCore_SharedMemory_ReadBuffer_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #include <array>
0023 #include <memory>
0024 #include <string>
0025 #include "boost/interprocess/managed_shared_memory.hpp"
0026
0027
0028 #include "FWCore/SharedMemory/interface/buffer_names.h"
0029 #include "FWCore/SharedMemory/interface/BufferInfo.h"
0030
0031
0032
0033 namespace edm::shared_memory {
0034 class ReadBuffer {
0035 public:
0036
0037
0038
0039 ReadBuffer(std::string const& iUniqueName, BufferInfo* iBufferInfo)
0040 : buffer_{nullptr, 0}, bufferInfo_{iBufferInfo}, bufferOldIndex_{3} {
0041 *bufferInfo_ = {0, 0};
0042 bufferNames_[0] = iUniqueName + buffer_names::kBuffer0;
0043 bufferNames_[1] = iUniqueName + buffer_names::kBuffer1;
0044 }
0045 ReadBuffer(const ReadBuffer&) = delete;
0046 const ReadBuffer& operator=(const ReadBuffer&) = delete;
0047 ReadBuffer(ReadBuffer&&) = delete;
0048 const ReadBuffer& operator=(ReadBuffer&&) = delete;
0049
0050
0051 int bufferIdentifier() const { return bufferInfo_->identifier_; }
0052
0053
0054 std::pair<char*, std::size_t> buffer() {
0055 if (mustGetBufferAgain()) {
0056 using namespace boost::interprocess;
0057 sm_ = std::make_unique<managed_shared_memory>(open_only, bufferNames_[bufferInfo_->index_].c_str());
0058 buffer_ = sm_->find<char>(buffer_names::kBuffer);
0059 bufferOldIndex_ = bufferInfo_->index_;
0060 }
0061 return buffer_;
0062 }
0063
0064 private:
0065 bool mustGetBufferAgain() const { return bufferInfo_->index_ != bufferOldIndex_; }
0066
0067 std::pair<char*, std::size_t> buffer_;
0068 BufferInfo* bufferInfo_;
0069 char bufferOldIndex_;
0070 std::array<std::string, 2> bufferNames_;
0071 std::unique_ptr<boost::interprocess::managed_shared_memory> sm_;
0072 };
0073 }
0074
0075 #endif