]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/beast/core/detail/stream_base.hpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / boost / beast / core / detail / stream_base.hpp
index 3f675d47f954db02571281951dc34a7f2e8d0e40..e6e806202b96c5b09855351aab263e0f314850a3 100644 (file)
@@ -56,19 +56,25 @@ struct stream_base
 
     class pending_guard
     {
-        bool& b_;
+        bool* b_ = nullptr;
         bool clear_ = true;
 
     public:
         ~pending_guard()
         {
-            if(clear_)
-                b_ = false;
+            if(clear_ && b_)
+                *b_ = false;
+        }
+
+        pending_guard()
+        : b_(nullptr)
+        , clear_(true)
+        {
         }
 
         explicit
         pending_guard(bool& b)
-            : b_(b)
+        : b_(&b)
         {
             // If this assert goes off, it means you are attempting
             // to issue two of the same asynchronous I/O operation
@@ -77,8 +83,8 @@ struct stream_base
             // calls to async_read_some. Only one pending call of
             // each I/O type (read and write) is permitted.
             //
-            BOOST_ASSERT(! b_);
-            b_ = true;
+            BOOST_ASSERT(! *b_);
+            *b_ = true;
         }
 
         pending_guard(
@@ -89,11 +95,29 @@ struct stream_base
         {
         }
 
+        void assign(bool& b)
+        {
+            BOOST_ASSERT(!b_);
+            BOOST_ASSERT(clear_);
+            b_ = &b;
+
+            // If this assert goes off, it means you are attempting
+            // to issue two of the same asynchronous I/O operation
+            // at the same time, without waiting for the first one
+            // to complete. For example, attempting two simultaneous
+            // calls to async_read_some. Only one pending call of
+            // each I/O type (read and write) is permitted.
+            //
+            BOOST_ASSERT(! *b_);
+            *b_ = true;
+        }
+
         void
         reset()
         {
             BOOST_ASSERT(clear_);
-            b_ = false;
+            if (b_)
+                *b_ = false;
             clear_ = false;
         }
     };