From ab60ae44c6f7b6f56ccf2e41f07ac3ffb2143897 Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Sun, 29 Jul 2018 09:33:41 -0700 Subject: [PATCH] msg: use queue of messages for dispatch This avoids an allocation for each new message (amortized via deque). Additionally, use std::move to avoid atomic update to the Message ref. Signed-off-by: Patrick Donnelly --- src/msg/DispatchQueue.cc | 13 ++++--------- src/msg/DispatchQueue.h | 4 ++-- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/msg/DispatchQueue.cc b/src/msg/DispatchQueue.cc index 85616f68f9a56..53e112bed4bfc 100644 --- a/src/msg/DispatchQueue.cc +++ b/src/msg/DispatchQueue.cc @@ -99,7 +99,7 @@ void DispatchQueue::local_delivery(const Message::ref& m, int priority) Mutex::Locker l(local_delivery_lock); if (local_messages.empty()) local_delivery_cond.Signal(); - local_messages.push_back(make_pair(m, priority)); + local_messages.emplace(m, priority); return; } @@ -113,8 +113,8 @@ void DispatchQueue::run_local_delivery() local_delivery_cond.Wait(local_delivery_lock); continue; } - auto p = local_messages.front(); - local_messages.pop_front(); + auto p = std::move(local_messages.front()); + local_messages.pop(); local_delivery_lock.Unlock(); const Message::ref& m = p.first; int priority = p.second; @@ -239,12 +239,7 @@ void DispatchQueue::wait() void DispatchQueue::discard_local() { - for (list >::iterator p = local_messages.begin(); - p != local_messages.end(); - ++p) { - ldout(cct,20) << __func__ << " " << p->first << dendl; - } - local_messages.clear(); + decltype(local_messages)().swap(local_messages); } void DispatchQueue::shutdown() diff --git a/src/msg/DispatchQueue.h b/src/msg/DispatchQueue.h index a99dc48e869e8..2c16056c21651 100644 --- a/src/msg/DispatchQueue.h +++ b/src/msg/DispatchQueue.h @@ -17,9 +17,9 @@ #include #include +#include #include #include "include/assert.h" -#include "include/xlist.h" #include "common/Throttle.h" #include "common/Mutex.h" #include "common/Cond.h" @@ -107,7 +107,7 @@ class DispatchQueue { Mutex local_delivery_lock; Cond local_delivery_cond; bool stop_local_delivery; - list> local_messages; + std::queue> local_messages; class LocalDeliveryThread : public Thread { DispatchQueue *dq; public: -- 2.39.5