]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
common/Finisher: merge all queue() container methods into one template
authorMax Kellermann <max.kellermann@ionos.com>
Wed, 9 Oct 2024 11:30:47 +0000 (13:30 +0200)
committerMax Kellermann <max.kellermann@ionos.com>
Thu, 10 Oct 2024 05:31:52 +0000 (07:31 +0200)
This merges some duplicate code.

Only two overloads remain: one for single `Context` pointers and one
for all containers.  I tried to merge the former into the same
template but that led to a larger binary (+7kB) because many pointer
overloads were instantiated.  This patch (with two overloads) only
increases the binary by 8 bytes which is acceptable.

Signed-off-by: Max Kellermann <max.kellermann@ionos.com>
src/common/Finisher.h

index 9091d0b892a6b714f5d814002c4fda53fbda86fd..baf02bd26a44720c12b54ae1efd47cdedfa68180 100644 (file)
@@ -22,7 +22,6 @@
 #include "common/perf_counters.h"
 #include "common/Cond.h"
 
-
 /// Finisher queue length performance counter ID.
 enum {
   l_finisher_first = 997082,
@@ -76,41 +75,15 @@ class Finisher {
       logger->inc(l_finisher_queue_len);
   }
 
-  void queue(std::list<Context*>& ls) {
-    {
-      std::unique_lock ul(finisher_lock);
-      if (finisher_queue.empty()) {
-       finisher_cond.notify_all();
-      }
-      for (auto i : ls) {
-       finisher_queue.push_back(std::make_pair(i, 0));
-      }
-      if (logger)
-       logger->inc(l_finisher_queue_len, ls.size());
-    }
-    ls.clear();
-  }
-  void queue(std::deque<Context*>& ls) {
-    {
-      std::unique_lock ul(finisher_lock);
-      if (finisher_queue.empty()) {
-       finisher_cond.notify_all();
-      }
-      for (auto i : ls) {
-       finisher_queue.push_back(std::make_pair(i, 0));
-      }
-      if (logger)
-       logger->inc(l_finisher_queue_len, ls.size());
-    }
-    ls.clear();
-  }
-  void queue(std::vector<Context*>& ls) {
+  // TODO use C++20 concept checks instead of SFINAE
+  template<typename T>
+  auto queue(T &ls) -> decltype(std::distance(ls.begin(), ls.end()), void()) {
     {
       std::unique_lock ul(finisher_lock);
       if (finisher_queue.empty()) {
        finisher_cond.notify_all();
       }
-      for (auto i : ls) {
+      for (Context *i : ls) {
        finisher_queue.push_back(std::make_pair(i, 0));
       }
       if (logger)