Source · fairmq/shmem/
Segment.hpublic header
Defines struct fair::mq::shmem::RBTreeBestFit, struct fair::mq::shmem::Segment, struct fair::mq::shmem::SimpleSeqFit.
Described in Sessions and segments.
1/********************************************************************************2 * Copyright (C) 2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *3 * *4 * This software is distributed under the terms of the *5 * GNU Lesser General Public Licence (LGPL) version 3, *6 * copied verbatim in the file "LICENSE" *7 ********************************************************************************/8#ifndef FAIR_MQ_SHMEM_SEGMENT_H_9#define FAIR_MQ_SHMEM_SEGMENT_H_10 11#include <fairmq/shmem/Common.h>12#include <fairmq/shmem/Monitor.h>13#include <fairmq/Transports.h>14 15#include <cstdint>16#include <string>17#include <variant>18 19namespace fair::mq::shmem20{21 22struct SimpleSeqFit {};23struct RBTreeBestFit {};24static const SimpleSeqFit simpleSeqFit = SimpleSeqFit();25static const RBTreeBestFit rbTreeBestFit = RBTreeBestFit();26 27struct Segment28{29 friend class Monitor;30 31 Segment(const std::string& shmId, uint16_t id, size_t size, SimpleSeqFit)32 : fSegment(SimpleSeqFitSegment(boost::interprocess::open_or_create, MakeShmName(shmId, "m", id).c_str(), size))33 {34 Register(shmId, id, AllocationAlgorithm::simple_seq_fit);35 }36 37 Segment(const std::string& shmId, uint16_t id, size_t size, RBTreeBestFit)38 : fSegment(RBTreeBestFitSegment(boost::interprocess::open_or_create, MakeShmName(shmId, "m", id).c_str(), size))39 {40 Register(shmId, id, AllocationAlgorithm::rbtree_best_fit);41 }42 43 size_t GetSize() const { return std::visit([](auto& s){ return s.get_size(); }, fSegment); }44 void* GetData() { return std::visit([](auto& s){ return s.get_address(); }, fSegment); }45 46 size_t GetFreeMemory() const { return std::visit([](auto& s){ return s.get_free_memory(); }, fSegment); }47 48 void Zero() { std::visit([](auto& s){ return s.zero_free_memory(); }, fSegment); }49 void Lock()50 {51 if (mlock(GetData(), GetSize()) == -1) {52 throw TransportError(tools::ToString("Could not lock the managed segment memory: ", strerror(errno)));53 }54 }55 56 static void Remove(const std::string& shmId, uint16_t id)57 {58 Monitor::RemoveObject(MakeShmName(shmId, "m", id));59 }60 61 private:62 std::variant<RBTreeBestFitSegment, SimpleSeqFitSegment> fSegment;63 64 static void Register(const std::string& shmId, uint16_t id, AllocationAlgorithm allocAlgo)65 {66 using namespace boost::interprocess;67 managed_shared_memory mngSegment(open_or_create, MakeShmName(shmId, "mng").c_str(), kManagementSegmentSize);68 VoidAlloc alloc(mngSegment.get_segment_manager());69 70 Uint16SegmentInfoHashMap* shmSegments = mngSegment.find_or_construct<Uint16SegmentInfoHashMap>(unique_instance)(alloc);71 72 EventCounter* eventCounter = mngSegment.find_or_construct<EventCounter>(unique_instance)(0);73 74 bool newSegmentRegistered = shmSegments->emplace(id, allocAlgo).second;75 if (newSegmentRegistered) {76 (eventCounter->fCount)++;77 }78 }79};80 81} // namespace fair::mq::shmem82 83#endif /* FAIR_MQ_SHMEM_SEGMENT_H_ */