mirror of
https://github.com/FairRootGroup/FairMQ.git
synced 2025-10-16 18:11:49 +00:00
FairMQ: Add hint argument to the region callback, settable per message.
This commit is contained in:
committed by
Mohammad Al-Turany
parent
ba78964e29
commit
b59f1b950d
@@ -46,11 +46,12 @@ struct MonitorStatus
|
||||
bool fActive;
|
||||
};
|
||||
|
||||
struct alignas(32) MetaHeader
|
||||
struct MetaHeader
|
||||
{
|
||||
uint64_t fSize;
|
||||
uint64_t fRegionId;
|
||||
size_t fSize;
|
||||
size_t fRegionId;
|
||||
boost::interprocess::managed_shared_memory::handle_t fHandle;
|
||||
size_t fHint;
|
||||
};
|
||||
|
||||
struct RegionBlock
|
||||
@@ -58,15 +59,18 @@ struct RegionBlock
|
||||
RegionBlock()
|
||||
: fHandle()
|
||||
, fSize(0)
|
||||
, fHint(0)
|
||||
{}
|
||||
|
||||
RegionBlock(boost::interprocess::managed_shared_memory::handle_t handle, size_t size)
|
||||
RegionBlock(boost::interprocess::managed_shared_memory::handle_t handle, size_t size, size_t hint)
|
||||
: fHandle(handle)
|
||||
, fSize(size)
|
||||
, fHint(hint)
|
||||
{}
|
||||
|
||||
boost::interprocess::managed_shared_memory::handle_t fHandle;
|
||||
size_t fSize;
|
||||
size_t fHint;
|
||||
};
|
||||
|
||||
} // namespace shmem
|
||||
|
@@ -34,6 +34,7 @@ FairMQMessageSHM::FairMQMessageSHM(Manager& manager)
|
||||
, fRegionPtr(nullptr)
|
||||
, fHandle(-1)
|
||||
, fSize(0)
|
||||
, fHint(0)
|
||||
, fLocalPtr(nullptr)
|
||||
{
|
||||
if (zmq_msg_init(&fMessage) != 0)
|
||||
@@ -52,6 +53,7 @@ FairMQMessageSHM::FairMQMessageSHM(Manager& manager, const size_t size)
|
||||
, fRegionPtr(nullptr)
|
||||
, fHandle(-1)
|
||||
, fSize(0)
|
||||
, fHint(0)
|
||||
, fLocalPtr(nullptr)
|
||||
{
|
||||
InitializeChunk(size);
|
||||
@@ -66,6 +68,7 @@ FairMQMessageSHM::FairMQMessageSHM(Manager& manager, void* data, const size_t si
|
||||
, fRegionPtr(nullptr)
|
||||
, fHandle(-1)
|
||||
, fSize(0)
|
||||
, fHint(0)
|
||||
, fLocalPtr(nullptr)
|
||||
{
|
||||
if (InitializeChunk(size))
|
||||
@@ -82,7 +85,7 @@ FairMQMessageSHM::FairMQMessageSHM(Manager& manager, void* data, const size_t si
|
||||
}
|
||||
}
|
||||
|
||||
FairMQMessageSHM::FairMQMessageSHM(Manager& manager, FairMQUnmanagedRegionPtr& region, void* data, const size_t size)
|
||||
FairMQMessageSHM::FairMQMessageSHM(Manager& manager, FairMQUnmanagedRegionPtr& region, void* data, const size_t size, void* hint)
|
||||
: fManager(manager)
|
||||
, fMessage()
|
||||
, fQueued(false)
|
||||
@@ -91,23 +94,34 @@ FairMQMessageSHM::FairMQMessageSHM(Manager& manager, FairMQUnmanagedRegionPtr& r
|
||||
, fRegionPtr(nullptr)
|
||||
, fHandle(-1)
|
||||
, fSize(size)
|
||||
, fHint(reinterpret_cast<size_t>(hint))
|
||||
, fLocalPtr(static_cast<char*>(data))
|
||||
{
|
||||
fHandle = (bipc::managed_shared_memory::handle_t)(reinterpret_cast<const char*>(data) - reinterpret_cast<const char*>(region->GetData()));
|
||||
|
||||
if (zmq_msg_init_size(&fMessage, sizeof(MetaHeader)) != 0)
|
||||
if (reinterpret_cast<const char*>(data) >= reinterpret_cast<const char*>(region->GetData()) ||
|
||||
reinterpret_cast<const char*>(data) <= reinterpret_cast<const char*>(region->GetData()) + region->GetSize())
|
||||
{
|
||||
LOG(ERROR) << "failed initializing meta message, reason: " << zmq_strerror(errno);
|
||||
fHandle = (bipc::managed_shared_memory::handle_t)(reinterpret_cast<const char*>(data) - reinterpret_cast<const char*>(region->GetData()));
|
||||
|
||||
if (zmq_msg_init_size(&fMessage, sizeof(MetaHeader)) != 0)
|
||||
{
|
||||
LOG(ERROR) << "failed initializing meta message, reason: " << zmq_strerror(errno);
|
||||
}
|
||||
else
|
||||
{
|
||||
MetaHeader header;
|
||||
header.fSize = size;
|
||||
header.fHandle = fHandle;
|
||||
header.fRegionId = fRegionId;
|
||||
header.fHint = fHint;
|
||||
memcpy(zmq_msg_data(&fMessage), &header, sizeof(MetaHeader));
|
||||
|
||||
fMetaCreated = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MetaHeader header;
|
||||
header.fSize = size;
|
||||
header.fHandle = fHandle;
|
||||
header.fRegionId = fRegionId;
|
||||
memcpy(zmq_msg_data(&fMessage), &header, sizeof(MetaHeader));
|
||||
|
||||
fMetaCreated = true;
|
||||
LOG(ERROR) << "shmem: trying to create region message with data from outside the region";
|
||||
throw runtime_error("shmem: trying to create region message with data from outside the region");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,6 +162,7 @@ bool FairMQMessageSHM::InitializeChunk(const size_t size)
|
||||
header.fSize = size;
|
||||
header.fHandle = fHandle;
|
||||
header.fRegionId = fRegionId;
|
||||
header.fHint = fHint;
|
||||
memcpy(zmq_msg_data(&fMessage), &header, sizeof(MetaHeader));
|
||||
|
||||
fMetaCreated = true;
|
||||
@@ -343,7 +358,7 @@ void FairMQMessageSHM::CloseMessage()
|
||||
// // }
|
||||
|
||||
// timed version
|
||||
RegionBlock block(fHandle, fSize);
|
||||
RegionBlock block(fHandle, fSize, fHint);
|
||||
bool success = false;
|
||||
do
|
||||
{
|
||||
|
@@ -30,7 +30,7 @@ class FairMQMessageSHM : public FairMQMessage
|
||||
FairMQMessageSHM(fair::mq::shmem::Manager& manager);
|
||||
FairMQMessageSHM(fair::mq::shmem::Manager& manager, const size_t size);
|
||||
FairMQMessageSHM(fair::mq::shmem::Manager& manager, void* data, const size_t size, fairmq_free_fn* ffn, void* hint = nullptr);
|
||||
FairMQMessageSHM(fair::mq::shmem::Manager& manager, FairMQUnmanagedRegionPtr& region, void* data, const size_t size);
|
||||
FairMQMessageSHM(fair::mq::shmem::Manager& manager, FairMQUnmanagedRegionPtr& region, void* data, const size_t size, void* hint = 0);
|
||||
|
||||
FairMQMessageSHM(const FairMQMessageSHM&) = delete;
|
||||
FairMQMessageSHM operator=(const FairMQMessageSHM&) = delete;
|
||||
@@ -58,10 +58,11 @@ class FairMQMessageSHM : public FairMQMessage
|
||||
bool fMetaCreated;
|
||||
static std::atomic<bool> fInterrupted;
|
||||
static FairMQ::Transport fTransportType;
|
||||
uint64_t fRegionId;
|
||||
size_t fRegionId;
|
||||
mutable fair::mq::shmem::Region* fRegionPtr;
|
||||
boost::interprocess::managed_shared_memory::handle_t fHandle;
|
||||
size_t fSize;
|
||||
size_t fHint;
|
||||
mutable char* fLocalPtr;
|
||||
|
||||
bool InitializeChunk(const size_t size);
|
||||
|
@@ -175,6 +175,7 @@ int FairMQSocketSHM::Receive(FairMQMessagePtr& msg, const int flags)
|
||||
static_cast<FairMQMessageSHM*>(msg.get())->fHandle = hdr->fHandle;
|
||||
static_cast<FairMQMessageSHM*>(msg.get())->fSize = hdr->fSize;
|
||||
static_cast<FairMQMessageSHM*>(msg.get())->fRegionId = hdr->fRegionId;
|
||||
static_cast<FairMQMessageSHM*>(msg.get())->fHint = hdr->fHint;
|
||||
size = msg->GetSize();
|
||||
|
||||
fBytesRx += size;
|
||||
@@ -316,6 +317,7 @@ int64_t FairMQSocketSHM::Receive(vector<FairMQMessagePtr>& msgVec, const int fla
|
||||
static_cast<FairMQMessageSHM*>(part.get())->fHandle = hdr->fHandle;
|
||||
static_cast<FairMQMessageSHM*>(part.get())->fSize = hdr->fSize;
|
||||
static_cast<FairMQMessageSHM*>(part.get())->fRegionId = hdr->fRegionId;
|
||||
static_cast<FairMQMessageSHM*>(part.get())->fHint = hdr->fHint;
|
||||
size = part->GetSize();
|
||||
|
||||
msgVec.push_back(move(part));
|
||||
|
@@ -214,9 +214,9 @@ FairMQMessagePtr FairMQTransportFactorySHM::CreateMessage(void* data, const size
|
||||
return unique_ptr<FairMQMessage>(new FairMQMessageSHM(*fManager, data, size, ffn, hint));
|
||||
}
|
||||
|
||||
FairMQMessagePtr FairMQTransportFactorySHM::CreateMessage(FairMQUnmanagedRegionPtr& region, void* data, const size_t size) const
|
||||
FairMQMessagePtr FairMQTransportFactorySHM::CreateMessage(FairMQUnmanagedRegionPtr& region, void* data, const size_t size, void* hint) const
|
||||
{
|
||||
return unique_ptr<FairMQMessage>(new FairMQMessageSHM(*fManager, region, data, size));
|
||||
return unique_ptr<FairMQMessage>(new FairMQMessageSHM(*fManager, region, data, size, hint));
|
||||
}
|
||||
|
||||
FairMQSocketPtr FairMQTransportFactorySHM::CreateSocket(const string& type, const string& name) const
|
||||
|
@@ -36,7 +36,7 @@ class FairMQTransportFactorySHM : public FairMQTransportFactory
|
||||
FairMQMessagePtr CreateMessage() const override;
|
||||
FairMQMessagePtr CreateMessage(const size_t size) const override;
|
||||
FairMQMessagePtr CreateMessage(void* data, const size_t size, fairmq_free_fn* ffn, void* hint = nullptr) const override;
|
||||
FairMQMessagePtr CreateMessage(FairMQUnmanagedRegionPtr& region, void* data, const size_t size) const override;
|
||||
FairMQMessagePtr CreateMessage(FairMQUnmanagedRegionPtr& region, void* data, const size_t size, void* hint = 0) const override;
|
||||
|
||||
FairMQSocketPtr CreateSocket(const std::string& type, const std::string& name) const override;
|
||||
|
||||
|
@@ -75,7 +75,7 @@ void Region::ReceiveAcks()
|
||||
// LOG(DEBUG) << "received: " << block.fHandle << " " << block.fSize << " " << block.fMessageId;
|
||||
if (fCallback)
|
||||
{
|
||||
fCallback(reinterpret_cast<char*>(fRegion.get_address()) + block.fHandle, block.fSize);
|
||||
fCallback(reinterpret_cast<char*>(fRegion.get_address()) + block.fHandle, block.fSize, reinterpret_cast<void*>(block.fHint));
|
||||
}
|
||||
}
|
||||
else
|
||||
|
Reference in New Issue
Block a user