Skip to content

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_ */