]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common/async: Hold lock in constructor of blocked_result
authorAdam C. Emerson <aemerson@redhat.com>
Tue, 10 Nov 2020 01:59:13 +0000 (20:59 -0500)
committerAdam C. Emerson <aemerson@redhat.com>
Sun, 20 Dec 2020 21:20:28 +0000 (16:20 -0500)
More correct, though not the cause of error.

Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
src/common/async/blocked_completion.h

index 633e01ecf5eb9c3922eaf7fedfd364fa3f6a2406..23a1319bc0fa378fd680fdfc56f7f10e2f2078ff 100644 (file)
@@ -129,7 +129,6 @@ struct blocked_handler<void>
   bool* done = nullptr;
 };
 
-
 template<typename... Ts>
 class blocked_result
 {
@@ -138,6 +137,7 @@ public:
   using return_type = std::tuple<Ts...>;
 
   explicit blocked_result(completion_handler_type& h) noexcept {
+    std::scoped_lock l(m);
     out_ec = h.ec;
     if (!out_ec) h.ec = &ec;
     h.value = &value;
@@ -153,6 +153,11 @@ public:
     return std::move(*value);
   }
 
+  blocked_result(const blocked_result&) = delete;
+  blocked_result& operator =(const blocked_result&) = delete;
+  blocked_result(blocked_result&&) = delete;
+  blocked_result& operator =(blocked_result&&) = delete;
+
 private:
   bs::error_code* out_ec;
   bs::error_code ec;
@@ -170,6 +175,7 @@ public:
   using return_type = T;
 
   explicit blocked_result(completion_handler_type& h) noexcept {
+    std::scoped_lock l(m);
     out_ec = h.ec;
     if (!out_ec) h.ec = &ec;
     h.value = &value;
@@ -185,6 +191,11 @@ public:
     return std::move(*value);
   }
 
+  blocked_result(const blocked_result&) = delete;
+  blocked_result& operator =(const blocked_result&) = delete;
+  blocked_result(blocked_result&&) = delete;
+  blocked_result& operator =(blocked_result&&) = delete;
+
 private:
   bs::error_code* out_ec;
   bs::error_code ec;
@@ -202,6 +213,7 @@ public:
   using return_type = void;
 
   explicit blocked_result(completion_handler_type& h) noexcept {
+    std::scoped_lock l(m);
     out_ec = h.ec;
     if (!out_ec) h.ec = &ec;
     h.m = &m;
@@ -215,6 +227,11 @@ public:
     if (!out_ec && ec) throw bs::system_error(ec);
   }
 
+  blocked_result(const blocked_result&) = delete;
+  blocked_result& operator =(const blocked_result&) = delete;
+  blocked_result(blocked_result&&) = delete;
+  blocked_result& operator =(blocked_result&&) = delete;
+
 private:
   bs::error_code* out_ec;
   bs::error_code ec;