Skip to content

Source · fairmq/zeromq/

UnmanagedRegion.hheader

fairmq/zeromq/UnmanagedRegion.h95 lines · C++GitHub ↗
1/********************************************************************************2 *    Copyright (C) 2014 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 9#ifndef FAIR_MQ_ZMQ_UNMANAGEDREGION_H10#define FAIR_MQ_ZMQ_UNMANAGEDREGION_H11 12#include <fairmq/zeromq/Context.h>13#include <fairmq/UnmanagedRegion.h>14 15#include <fairlogger/Logger.h>16 17#include <cstddef> // size_t18#include <string>19#include <utility> // move20 21#include <sys/mman.h> // mlock22 23namespace fair::mq::zmq24{25 26class UnmanagedRegion final : public fair::mq::UnmanagedRegion27{28    friend class Socket;29    friend class Message;30 31  public:32    UnmanagedRegion(Context& ctx,33                    size_t size,34                    int64_t userFlags,35                    RegionCallback callback,36                    RegionBulkCallback bulkCallback,37                    fair::mq::TransportFactory* factory,38                    fair::mq::RegionConfig cfg)39        : fair::mq::UnmanagedRegion(factory)40        , fCtx(ctx)41        , fId(fCtx.RegionCount())42        , fBuffer(malloc(size))43        , fSize(size)44        , fUserFlags(userFlags)45        , fCallback(std::move(callback))46        , fBulkCallback(std::move(bulkCallback))47    {48        if (cfg.lock) {49            LOG(debug) << "Locking region " << fId << "...";50            if (mlock(fBuffer, fSize) == -1) {51                LOG(error) << "Could not lock region " << fId << ". Code: " << errno << ", reason: " << strerror(errno);52            }53            LOG(debug) << "Successfully locked region " << fId << ".";54        }55        if (cfg.zero) {56            LOG(debug) << "Zeroing free memory of region " << fId << "...";57            memset(fBuffer, 0x00, fSize);58            LOG(debug) << "Successfully zeroed free memory of region " << fId << ".";59        }60    }61 62    UnmanagedRegion(const UnmanagedRegion&) = delete;63    UnmanagedRegion(UnmanagedRegion&&) = delete;64    UnmanagedRegion& operator=(const UnmanagedRegion&) = delete;65    UnmanagedRegion& operator=(UnmanagedRegion&&) = delete;66 67    void* GetData() const override { return fBuffer; }68    size_t GetSize() const override { return fSize; }69    uint16_t GetId() const override { return fId; }70    int64_t GetUserFlags() const { return fUserFlags; }71    void SetLinger(uint32_t /* linger */) override { LOG(debug) << "ZeroMQ UnmanagedRegion linger option not implemented. Acknowledgements are local."; }72    uint32_t GetLinger() const override { LOG(debug) << "ZeroMQ UnmanagedRegion linger option not implemented. Acknowledgements are local."; return 0; }73 74    Transport GetType() const override { return Transport::ZMQ; }75 76    ~UnmanagedRegion() override77    {78        LOG(debug) << "destroying region " << fId;79        fCtx.RemoveRegion(fId);80        free(fBuffer);81    }82 83  private:84    Context& fCtx;85    uint16_t fId;86    void* fBuffer;87    size_t fSize;88    int64_t fUserFlags;89    RegionCallback fCallback;90    RegionBulkCallback fBulkCallback;91};92 93} // namespace fair::mq::zmq94 95#endif /* FAIR_MQ_ZMQ_UNMANAGEDREGION_H */