Source · fairmq/zeromq/
UnmanagedRegion.hheader
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 */