From 622e9e9c09ac131cf1899d9e439db5412a205287 Mon Sep 17 00:00:00 2001 From: Alexey Rybalchenko Date: Sat, 26 Apr 2014 23:33:57 +0200 Subject: [PATCH] start experimenting with root transport mechanism. enable efficient message copying for zeromq (currently used only in benchmarkSampler). cleanup some code. --- fairmq/zeromq/FairMQMessageZMQ.cxx | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/fairmq/zeromq/FairMQMessageZMQ.cxx b/fairmq/zeromq/FairMQMessageZMQ.cxx index e17a055d..4b68d10b 100644 --- a/fairmq/zeromq/FairMQMessageZMQ.cxx +++ b/fairmq/zeromq/FairMQMessageZMQ.cxx @@ -31,7 +31,7 @@ FairMQMessageZMQ::FairMQMessageZMQ(size_t size) FairMQMessageZMQ::FairMQMessageZMQ(void* data, size_t size) { - int rc = zmq_msg_init_data(&fMessage, data, size, &CleanUp, NULL); + int rc = zmq_msg_init_data(&fMessage, data, size, &CleanUp, NULL); // TODO: expose the cleanup function part in the interface? if (rc != 0) { LOG(ERROR) << "failed initializing message with data, reason: " << zmq_strerror(errno); @@ -61,7 +61,7 @@ void FairMQMessageZMQ::Rebuild(size_t size) void FairMQMessageZMQ::Rebuild(void* data, size_t size) { CloseMessage(); - int rc = zmq_msg_init_data(&fMessage, data, size, &CleanUp, NULL); + int rc = zmq_msg_init_data(&fMessage, data, size, &CleanUp, NULL); // TODO: expose the cleanup function part in the interface? if (rc != 0) { LOG(ERROR) << "failed initializing message with data, reason: " << zmq_strerror(errno); @@ -90,10 +90,19 @@ void FairMQMessageZMQ::SetMessage(void* data, size_t size) void FairMQMessageZMQ::Copy(FairMQMessage* msg) { - CloseMessage(); - size_t size = msg->GetSize(); - zmq_msg_init_size(&fMessage, size); - std::memcpy(zmq_msg_data(&fMessage), msg->GetData(), size); + // Shares the message buffer between msg and this fMessage. + int rc = zmq_msg_copy(&fMessage, (zmq_msg_t*)msg->GetMessage()); + if (rc != 0) + { + LOG(ERROR) << "failed copying message, reason: " << zmq_strerror(errno); + } + + // Alternatively, following code does a hard copy of the message, which allows to modify the original after making a copy, without affecting the new msg. + + // CloseMessage(); + // size_t size = msg->GetSize(); + // zmq_msg_init_size(&fMessage, size); + // std::memcpy(zmq_msg_data(&fMessage), msg->GetData(), size); } inline void FairMQMessageZMQ::CloseMessage()