]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
common: bind_like
authorAdam C. Emerson <aemerson@redhat.com>
Fri, 21 Feb 2020 17:46:47 +0000 (12:46 -0500)
committerAdam C. Emerson <aemerson@redhat.com>
Wed, 9 Sep 2020 02:09:40 +0000 (22:09 -0400)
A template to ensure that one completion has the same executor and
allocator as another.

Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
src/common/async/bind_like.h [new file with mode: 0644]

diff --git a/src/common/async/bind_like.h b/src/common/async/bind_like.h
new file mode 100644 (file)
index 0000000..a7fdbb8
--- /dev/null
@@ -0,0 +1,40 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2020 Red Hat <contact@redhat.com>
+ * Author: Adam C. Emerson
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation.  See file COPYING.
+ *
+ */
+
+#include <boost/asio/associated_allocator.hpp>
+#include <boost/asio/associated_executor.hpp>
+#include <boost/asio/bind_executor.hpp>
+
+#include "common/async/bind_allocator.h"
+
+namespace ceph::async {
+template<typename Executor, typename Allocator, typename Completion>
+auto bind_ea(const Executor& executor, const Allocator& allocator,
+            Completion&& completion) {
+  return bind_allocator(allocator,
+                       boost::asio::bind_executor(
+                         executor,
+                         std::forward<Completion>(completion)));
+}
+
+
+// Bind `Completion` to the executor and allocator of `Proto`
+template<typename Proto, typename Completion>
+auto bind_like(const Proto& proto, Completion&& completion) {
+  return bind_ea(boost::asio::get_associated_executor(proto),
+                boost::asio::get_associated_allocator(proto),
+                std::forward<Completion>(completion));
+}
+}