From 8cf1cbb9309f9baaefe48dac5af4da8ac59a3a27 Mon Sep 17 00:00:00 2001 From: Alexey Rybalchenko Date: Mon, 9 Jan 2017 13:37:39 +0100 Subject: [PATCH] Initialize shared memory only if it is used. --- fairmq/shmem/FairMQMessageSHM.cxx | 58 ++++++++++++++++++------------- fairmq/shmem/FairMQMessageSHM.h | 2 +- fairmq/shmem/FairMQSocketSHM.cxx | 14 ++++---- fairmq/shmem/FairMQSocketSHM.h | 2 +- fairmq/zeromq/FairMQPollerZMQ.cxx | 2 +- 5 files changed, 43 insertions(+), 35 deletions(-) diff --git a/fairmq/shmem/FairMQMessageSHM.cxx b/fairmq/shmem/FairMQMessageSHM.cxx index b92f14de..33cb5b54 100644 --- a/fairmq/shmem/FairMQMessageSHM.cxx +++ b/fairmq/shmem/FairMQMessageSHM.cxx @@ -50,20 +50,21 @@ FairMQMessageSHM::FairMQMessageSHM(void* data, const size_t size, fairmq_free_fn , fReceiving(false) , fQueued(false) { - InitializeChunk(size); - - memcpy(fOwner->fPtr->GetData(), data, size); - if (ffn) + if (InitializeChunk(size)) { - ffn(data, hint); - } - else - { - free(data); + memcpy(fOwner->fPtr->GetData(), data, size); + if (ffn) + { + ffn(data, hint); + } + else + { + free(data); + } } } -void FairMQMessageSHM::InitializeChunk(const size_t size) +bool FairMQMessageSHM::InitializeChunk(const size_t size) { string chunkID = fDeviceID + "c" + to_string(fMessageID); string* ownerID = new string(fDeviceID + "o" + to_string(fMessageID)); @@ -94,12 +95,17 @@ void FairMQMessageSHM::InitializeChunk(const size_t size) } } - if (zmq_msg_init_data(&fMessage, const_cast(ownerID->c_str()), ownerID->length(), StringDeleter, ownerID) != 0) + if (success) { - LOG(ERROR) << "failed initializing meta message, reason: " << zmq_strerror(errno); + if (zmq_msg_init_data(&fMessage, const_cast(ownerID->c_str()), ownerID->length(), StringDeleter, ownerID) != 0) + { + LOG(ERROR) << "failed initializing meta message, reason: " << zmq_strerror(errno); + } + + ++fMessageID; } - ++fMessageID; + return success; } void FairMQMessageSHM::Rebuild() @@ -132,16 +138,17 @@ void FairMQMessageSHM::Rebuild(void* data, const size_t size, fairmq_free_fn* ff fReceiving = false; fQueued = false; - InitializeChunk(size); - - memcpy(fOwner->fPtr->GetData(), data, size); - if (ffn) + if (InitializeChunk(size)) { - ffn(data, hint); - } - else - { - free(data); + memcpy(fOwner->fPtr->GetData(), data, size); + if (ffn) + { + ffn(data, hint); + } + else + { + free(data); + } } } @@ -192,9 +199,10 @@ void FairMQMessageSHM::Copy(const unique_ptr& msg) FairMQ::shmem::ShPtrOwner* otherOwner = static_cast(msg.get())->fOwner; if (otherOwner) { - InitializeChunk(otherOwner->fPtr->GetSize()); - - memcpy(fOwner->fPtr->GetData(), otherOwner->fPtr->GetData(), otherOwner->fPtr->GetSize()); + if (InitializeChunk(otherOwner->fPtr->GetSize())) + { + memcpy(fOwner->fPtr->GetData(), otherOwner->fPtr->GetData(), otherOwner->fPtr->GetSize()); + } } else { diff --git a/fairmq/shmem/FairMQMessageSHM.h b/fairmq/shmem/FairMQMessageSHM.h index b0c88248..fb6a0ffa 100644 --- a/fairmq/shmem/FairMQMessageSHM.h +++ b/fairmq/shmem/FairMQMessageSHM.h @@ -28,7 +28,7 @@ class FairMQMessageSHM : public FairMQMessage FairMQMessageSHM(const FairMQMessageSHM&) = delete; FairMQMessageSHM operator=(const FairMQMessageSHM&) = delete; - void InitializeChunk(const size_t size); + bool InitializeChunk(const size_t size); virtual void Rebuild(); virtual void Rebuild(const size_t size); diff --git a/fairmq/shmem/FairMQSocketSHM.cxx b/fairmq/shmem/FairMQSocketSHM.cxx index e55fc684..639c62c9 100644 --- a/fairmq/shmem/FairMQSocketSHM.cxx +++ b/fairmq/shmem/FairMQSocketSHM.cxx @@ -17,8 +17,8 @@ using namespace std; using namespace FairMQ::shmem; // Context to hold the ZeroMQ sockets -unique_ptr FairMQSocketSHM::fContext = unique_ptr(new FairMQContextSHM(1)); -// bool FairMQSocketSHM::fContextInitialized = false; +unique_ptr FairMQSocketSHM::fContext; // = unique_ptr(new FairMQContextSHM(1)); +bool FairMQSocketSHM::fContextInitialized = false; FairMQSocketSHM::FairMQSocketSHM(const string& type, const string& name, const int numIoThreads, const string& id /*= ""*/) : FairMQSocket(ZMQ_SNDMORE, ZMQ_RCVMORE, ZMQ_DONTWAIT) @@ -31,11 +31,11 @@ FairMQSocketSHM::FairMQSocketSHM(const string& type, const string& name, const i { fId = id + "." + name + "." + type; - // if (!fContextInitialized) - // { - // fContext = unique_ptr(new FairMQContextSHM(1)); - // fContextInitialized = true; - // } + if (!fContextInitialized) + { + fContext = unique_ptr(new FairMQContextSHM(1)); + fContextInitialized = true; + } if (zmq_ctx_set(fContext->GetContext(), ZMQ_IO_THREADS, numIoThreads) != 0) { diff --git a/fairmq/shmem/FairMQSocketSHM.h b/fairmq/shmem/FairMQSocketSHM.h index 59e4fc60..4be7aeb8 100644 --- a/fairmq/shmem/FairMQSocketSHM.h +++ b/fairmq/shmem/FairMQSocketSHM.h @@ -70,7 +70,7 @@ class FairMQSocketSHM : public FairMQSocket std::atomic fMessagesRx; static std::unique_ptr fContext; - // static bool fContextInitialized; + static bool fContextInitialized; }; #endif /* FAIRMQSOCKETSHM_H_ */ diff --git a/fairmq/zeromq/FairMQPollerZMQ.cxx b/fairmq/zeromq/FairMQPollerZMQ.cxx index 76833e3e..de50dcbf 100644 --- a/fairmq/zeromq/FairMQPollerZMQ.cxx +++ b/fairmq/zeromq/FairMQPollerZMQ.cxx @@ -115,7 +115,7 @@ FairMQPollerZMQ::FairMQPollerZMQ(const unordered_map