diff --git a/subscriptionstore.cpp b/subscriptionstore.cpp index e9f4a40..a0101a0 100644 --- a/subscriptionstore.cpp +++ b/subscriptionstore.cpp @@ -63,7 +63,7 @@ void SubscriptionNode::removeSubscriber(const std::shared_ptr &subscrib SubscriptionStore::SubscriptionStore() : - root(new SubscriptionNode("root")), + root("root"), sessionsByIdConst(sessionsById) { @@ -76,7 +76,7 @@ void SubscriptionStore::addSubscription(std::shared_ptr &client, const s RWLockGuard lock_guard(&subscriptionsRwlock); lock_guard.wrlock(); - SubscriptionNode *deepestNode = root.get(); + SubscriptionNode *deepestNode = &root; for(const std::string &subtopic : subtopics) { std::unique_ptr *selectedChildren = nullptr; @@ -123,7 +123,7 @@ void SubscriptionStore::removeSubscription(std::shared_ptr &client, cons lock_guard.wrlock(); // TODO: because it's so similar to adding a subscription, make a function to retrieve the deepest node? - SubscriptionNode *deepestNode = root.get(); + SubscriptionNode *deepestNode = &root; for(const std::string &subtopic : subtopics) { std::unique_ptr *selectedChildren = nullptr; @@ -228,7 +228,7 @@ void SubscriptionStore::publishNonRecursively(const MqttPacket &packet, const st } void SubscriptionStore::publishRecursively(std::vector::const_iterator cur_subtopic_it, std::vector::const_iterator end, - std::unique_ptr &this_node, const MqttPacket &packet) const + SubscriptionNode *this_node, const MqttPacket &packet) const { if (cur_subtopic_it == end) // This is the end of the topic path, so look for subscribers here. { @@ -252,12 +252,12 @@ void SubscriptionStore::publishRecursively(std::vector::const_itera const auto &sub_node = this_node->children.find(cur_subtop); if (sub_node != this_node->children.end()) { - publishRecursively(next_subtopic, end, sub_node->second, packet); + publishRecursively(next_subtopic, end, sub_node->second.get(), packet); } if (this_node->childrenPlus) { - publishRecursively(next_subtopic, end, this_node->childrenPlus, packet); + publishRecursively(next_subtopic, end, this_node->childrenPlus.get(), packet); } } @@ -268,7 +268,7 @@ void SubscriptionStore::queuePacketAtSubscribers(const std::vector RWLockGuard lock_guard(&subscriptionsRwlock); lock_guard.rdlock(); - publishRecursively(subtopics.begin(), subtopics.end(), root, packet); + publishRecursively(subtopics.begin(), subtopics.end(), &root, packet); } void SubscriptionStore::giveClientRetainedMessages(const std::shared_ptr &ses, const std::string &subscribe_topic, char max_qos) @@ -392,7 +392,7 @@ void SubscriptionStore::removeExpiredSessionsClients() logger->logf(LOG_NOTICE, "Rebuilding subscription tree"); - root->cleanSubscriptions(); + root.cleanSubscriptions(); } // QoS is not used in the comparision. This means you upgrade your QoS by subscribing again. The diff --git a/subscriptionstore.h b/subscriptionstore.h index ecf4f85..b94d009 100644 --- a/subscriptionstore.h +++ b/subscriptionstore.h @@ -69,7 +69,7 @@ public: class SubscriptionStore { - std::unique_ptr root; + SubscriptionNode root; pthread_rwlock_t subscriptionsRwlock = PTHREAD_RWLOCK_INITIALIZER; std::unordered_map> sessionsById; const std::unordered_map> &sessionsByIdConst; @@ -81,7 +81,7 @@ class SubscriptionStore void publishNonRecursively(const MqttPacket &packet, const std::vector &subscribers) const; void publishRecursively(std::vector::const_iterator cur_subtopic_it, std::vector::const_iterator end, - std::unique_ptr &next, const MqttPacket &packet) const; + SubscriptionNode *this_node, const MqttPacket &packet) const; public: SubscriptionStore();