Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:13:08

0001 #ifndef FWCore_SharedMemory_ReadBuffer_h
0002 #define FWCore_SharedMemory_ReadBuffer_h
0003 // -*- C++ -*-
0004 //
0005 // Package:     FWCore/SharedMemory
0006 // Class  :     ReadBuffer
0007 //
0008 /**\class ReadBuffer ReadBuffer.h " FWCore/SharedMemory/interface/ReadBuffer.h"
0009 
0010  Description: Manages a shared memory buffer used for reading
0011 
0012  Usage:
0013       Handles reading from a dynamically allocatable shared memory buffer.
0014 This works in conjunction with WriteBuffer.
0015 */
0016 //
0017 // Original Author:  Chris Jones
0018 //         Created:  21/01/2020
0019 //
0020 
0021 // system include files
0022 #include <array>
0023 #include <memory>
0024 #include <string>
0025 #include "boost/interprocess/managed_shared_memory.hpp"
0026 
0027 // user include files
0028 #include "FWCore/SharedMemory/interface/buffer_names.h"
0029 #include "FWCore/SharedMemory/interface/BufferInfo.h"
0030 
0031 // forward declarations
0032 
0033 namespace edm::shared_memory {
0034   class ReadBuffer {
0035   public:
0036     /** iUniqueName : must be unique for all processes running on a system.
0037         iBufferInfo : is a pointer to a shared_memory address where the same address needs to be shared by ReadBuffer and WriteBuffer.
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     // ---------- const member functions ---------------------
0051     int bufferIdentifier() const { return bufferInfo_->identifier_; }
0052 
0053     // ---------- member functions ---------------------------
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     // ---------- member data --------------------------------
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 }  // namespace edm::shared_memory
0074 
0075 #endif