shmem: properly initialize received multipart messages

This commit is contained in:
Alexey Rybalchenko 2019-12-16 17:15:08 +01:00 committed by Dennis Klein
parent e6dede492e
commit b2e027478e
3 changed files with 34 additions and 13 deletions

View File

@ -60,6 +60,27 @@ FairMQMessageSHM::FairMQMessageSHM(Manager& manager, const size_t size, FairMQTr
InitializeChunk(size); InitializeChunk(size);
} }
FairMQMessageSHM::FairMQMessageSHM(Manager& manager, MetaHeader* hdr, FairMQTransportFactory* factory)
: FairMQMessage{factory}
, fManager(manager)
, fMessage()
, fQueued(false)
, fMetaCreated(false)
, fRegionId(hdr->fRegionId)
, fRegionPtr(nullptr)
, fHandle(hdr->fHandle)
, fSize(hdr->fSize)
, fHint(hdr->fHint)
, fLocalPtr(nullptr)
{
if (zmq_msg_init_size(&fMessage, sizeof(MetaHeader)) != 0) {
LOG(error) << "failed initializing message, reason: " << zmq_strerror(errno);
}
// fill the zmq buffer with the delivered meta data
memcpy(zmq_msg_data(&fMessage), hdr, sizeof(MetaHeader));
fMetaCreated = true;
}
FairMQMessageSHM::FairMQMessageSHM(Manager& manager, void* data, const size_t size, fairmq_free_fn* ffn, void* hint, FairMQTransportFactory* factory) FairMQMessageSHM::FairMQMessageSHM(Manager& manager, void* data, const size_t size, fairmq_free_fn* ffn, void* hint, FairMQTransportFactory* factory)
: FairMQMessage{factory} : FairMQMessage{factory}
, fManager(manager) , fManager(manager)

View File

@ -21,6 +21,16 @@
#include <atomic> #include <atomic>
class FairMQSocketSHM; class FairMQSocketSHM;
namespace fair
{
namespace mq
{
namespace shmem
{
class MetaHeader;
}
}
}
class FairMQMessageSHM final : public FairMQMessage class FairMQMessageSHM final : public FairMQMessage
{ {
@ -32,6 +42,8 @@ class FairMQMessageSHM final : public FairMQMessage
FairMQMessageSHM(fair::mq::shmem::Manager& manager, void* data, const size_t size, fairmq_free_fn* ffn, void* hint = nullptr, FairMQTransportFactory* factory = nullptr); FairMQMessageSHM(fair::mq::shmem::Manager& manager, void* data, const size_t size, fairmq_free_fn* ffn, void* hint = nullptr, FairMQTransportFactory* factory = nullptr);
FairMQMessageSHM(fair::mq::shmem::Manager& manager, FairMQUnmanagedRegionPtr& region, void* data, const size_t size, void* hint = 0, FairMQTransportFactory* factory = nullptr); FairMQMessageSHM(fair::mq::shmem::Manager& manager, FairMQUnmanagedRegionPtr& region, void* data, const size_t size, void* hint = 0, FairMQTransportFactory* factory = nullptr);
FairMQMessageSHM(fair::mq::shmem::Manager& manager, fair::mq::shmem::MetaHeader* hdr, FairMQTransportFactory* factory = nullptr);
FairMQMessageSHM(const FairMQMessageSHM&) = delete; FairMQMessageSHM(const FairMQMessageSHM&) = delete;
FairMQMessageSHM operator=(const FairMQMessageSHM&) = delete; FairMQMessageSHM operator=(const FairMQMessageSHM&) = delete;

View File

@ -213,10 +213,6 @@ int64_t FairMQSocketSHM::Send(vector<FairMQMessagePtr>& msgVec, const int timeou
const unsigned int vecSize = msgVec.size(); const unsigned int vecSize = msgVec.size();
int elapsed = 0; int elapsed = 0;
if (vecSize == 1) {
return Send(msgVec.back(), timeout);
}
// put it into zmq message // put it into zmq message
zmq_msg_t zmqMsg; zmq_msg_t zmqMsg;
zmq_msg_init_size(&zmqMsg, vecSize * sizeof(MetaHeader)); zmq_msg_init_size(&zmqMsg, vecSize * sizeof(MetaHeader));
@ -322,16 +318,8 @@ int64_t FairMQSocketSHM::Receive(vector<FairMQMessagePtr>& msgVec, const int tim
MetaHeader* hdr = &hdrVec[m]; MetaHeader* hdr = &hdrVec[m];
// create new message (part) // create new message (part)
msgVec.emplace_back(tools::make_unique<FairMQMessageSHM>(fManager, GetTransport())); msgVec.emplace_back(tools::make_unique<FairMQMessageSHM>(fManager, hdr, GetTransport()));
FairMQMessageSHM* shmMsg = static_cast<FairMQMessageSHM*>(msgVec.back().get()); FairMQMessageSHM* shmMsg = static_cast<FairMQMessageSHM*>(msgVec.back().get());
// fill the zmq buffer with the delivered meta data
memcpy(zmq_msg_data(shmMsg->GetMessage()), hdr, sizeof(MetaHeader));
// set the message members with the meta data
shmMsg->fHandle = hdr->fHandle;
shmMsg->fSize = hdr->fSize;
shmMsg->fRegionId = hdr->fRegionId;
shmMsg->fHint = hdr->fHint;
totalSize += shmMsg->GetSize(); totalSize += shmMsg->GetSize();
} }