]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/libs/fiber/src/mutex.cpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / fiber / src / mutex.cpp
index 1ec3c6367cb07fe4f3e52a7c062a870e5e1f28d6..ad67cbd16206cfd780afbe2aea4f043663e409d7 100644 (file)
@@ -22,58 +22,57 @@ namespace fibers {
 
 void
 mutex::lock() {
-    context * ctx = context::active();
-    // store this fiber in order to be notified later
-    detail::spinlock_lock lk( wait_queue_splk_);
-    if ( ctx == owner_) {
-        throw lock_error(
-                std::make_error_code( std::errc::resource_deadlock_would_occur),
-                "boost fiber: a deadlock is detected");
-    } else if ( nullptr == owner_) {
-        owner_ = ctx;
-        return;
+    while ( true) {
+        context * active_ctx = context::active();
+        // store this fiber in order to be notified later
+        detail::spinlock_lock lk{ wait_queue_splk_ };
+        if ( BOOST_UNLIKELY( active_ctx == owner_) ) {
+            throw lock_error{
+                    std::make_error_code( std::errc::resource_deadlock_would_occur),
+                    "boost fiber: a deadlock is detected" };
+        } else if ( nullptr == owner_) {
+            owner_ = active_ctx;
+            return;
+        }
+        BOOST_ASSERT( ! active_ctx->wait_is_linked() );
+        active_ctx->wait_link( wait_queue_);
+        // suspend this fiber
+        active_ctx->suspend( lk);
+        BOOST_ASSERT( ! active_ctx->wait_is_linked() );
     }
-    BOOST_ASSERT( ! ctx->wait_is_linked() );
-    ctx->wait_link( wait_queue_);
-    // suspend this fiber
-    ctx->suspend( lk);
-    BOOST_ASSERT( ! ctx->wait_is_linked() );
 }
 
 bool
 mutex::try_lock() {
-    context * ctx = context::active();
-    detail::spinlock_lock lk( wait_queue_splk_);
-    if ( ctx == owner_) {
-        throw lock_error(
+    context * active_ctx = context::active();
+    detail::spinlock_lock lk{ wait_queue_splk_ };
+    if ( BOOST_UNLIKELY( active_ctx == owner_) ) {
+        throw lock_error{
                 std::make_error_code( std::errc::resource_deadlock_would_occur),
-                "boost fiber: a deadlock is detected");
+                "boost fiber: a deadlock is detected" };
     } else if ( nullptr == owner_) {
-        owner_ = ctx;
+        owner_ = active_ctx;
     }
     lk.unlock();
     // let other fiber release the lock
-    context::active()->yield();
-    return ctx == owner_;
+    active_ctx->yield();
+    return active_ctx == owner_;
 }
 
 void
 mutex::unlock() {
-    context * ctx = context::active();
-    detail::spinlock_lock lk( wait_queue_splk_);
-    if ( ctx != owner_) {
-        throw lock_error(
+    context * active_ctx = context::active();
+    detail::spinlock_lock lk{ wait_queue_splk_ };
+    if ( BOOST_UNLIKELY( active_ctx != owner_) ) {
+        throw lock_error{
                 std::make_error_code( std::errc::operation_not_permitted),
-                "boost fiber: no  privilege to perform the operation");
+                "boost fiber: no  privilege to perform the operation" };
     }
+    owner_ = nullptr;
     if ( ! wait_queue_.empty() ) {
         context * ctx = & wait_queue_.front();
         wait_queue_.pop_front();
-        owner_ = ctx;
-        context::active()->set_ready( ctx);
-    } else {
-        owner_ = nullptr;
-        return;
+        active_ctx->schedule( ctx);
     }
 }