]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg: use queue of messages for dispatch
authorPatrick Donnelly <pdonnell@redhat.com>
Sun, 29 Jul 2018 16:33:41 +0000 (09:33 -0700)
committerPatrick Donnelly <pdonnell@redhat.com>
Wed, 15 Aug 2018 04:20:56 +0000 (21:20 -0700)
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 <pdonnell@redhat.com>
src/msg/DispatchQueue.cc
src/msg/DispatchQueue.h

index 85616f68f9a56a8554e5df259f78509c8c653bd6..53e112bed4bfc052d8fbc17438417cf831fb4e1e 100644 (file)
@@ -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<pair<Message::ref, int> >::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()
index a99dc48e869e8b709b7063fa5ea538f74cfdde77..2c16056c21651ab6b014d9418b0eb2441f5e0274 100644 (file)
@@ -17,9 +17,9 @@
 
 #include <atomic>
 #include <map>
+#include <queue>
 #include <boost/intrusive_ptr.hpp>
 #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<pair<Message::ref, int>> local_messages;
+  std::queue<pair<Message::ref, int>> local_messages;
   class LocalDeliveryThread : public Thread {
     DispatchQueue *dq;
   public: