From db8ade44f7d57cda7ce53960bc9567548a17290c Mon Sep 17 00:00:00 2001 From: Robert Nishihara Date: Tue, 12 Jul 2016 12:55:12 -0700 Subject: [PATCH] only let creator of message queue deallocate message queue --- src/ipc.cc | 9 ++++++--- src/ipc.h | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/ipc.cc b/src/ipc.cc index 34a859c54..7b5651a55 100644 --- a/src/ipc.cc +++ b/src/ipc.cc @@ -30,10 +30,12 @@ int64_t BufferMemorySource::Size() const { return size_; } -MessageQueue<>::MessageQueue() { } +MessageQueue<>::MessageQueue() : create_(false) { } MessageQueue<>::~MessageQueue() { - if (!name_.empty()) { + if (!name_.empty() && create_) { + // Only remove the message queue if we created it. + RAY_LOG(RAY_DEBUG, "Removing message queue " << name_.c_str() << ", create = " << create_); bip::message_queue::remove(name_.c_str()); } } @@ -44,8 +46,8 @@ MessageQueue<>::MessageQueue(MessageQueue&& other) { MessageQueue<>& MessageQueue<>::operator=(MessageQueue&& other) { name_ = std::move(other.name_); + create_ = other.create_; queue_ = std::move(other.queue_); - other.name_.clear(); // It is unclear if this is guaranteed, but we need it to hold for the destructor. See: https://stackoverflow.com/a/17735913 return *this; @@ -62,6 +64,7 @@ bool MessageQueue<>::connect(const std::string& name, bool create, size_t messag if (create) { bip::message_queue::remove(name_.c_str()); // remove queue if it has not been properly removed from last run queue_ = std::unique_ptr(new bip::message_queue(bip::create_only, name_.c_str(), message_capacity, message_size)); + create_ = true; // Only set create_ = true on success. } else { queue_ = std::unique_ptr(new bip::message_queue(bip::open_only, name_.c_str())); diff --git a/src/ipc.h b/src/ipc.h index 3928d3a22..793727bbc 100644 --- a/src/ipc.h +++ b/src/ipc.h @@ -52,6 +52,7 @@ protected: bool receive(void* object, size_t size); private: std::string name_; + bool create_; std::unique_ptr queue_; };