X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ceph%2Fsrc%2Fboost%2Flibs%2Ffiber%2Fsrc%2Fmutex.cpp;h=ad67cbd16206cfd780afbe2aea4f043663e409d7;hb=b32b81446b3b05102be0267e79203f59329c1d97;hp=1ec3c6367cb07fe4f3e52a7c062a870e5e1f28d6;hpb=215dd7151453fae88e6f968c975b6ce309d42dcf;p=ceph.git diff --git a/ceph/src/boost/libs/fiber/src/mutex.cpp b/ceph/src/boost/libs/fiber/src/mutex.cpp index 1ec3c6367..ad67cbd16 100644 --- a/ceph/src/boost/libs/fiber/src/mutex.cpp +++ b/ceph/src/boost/libs/fiber/src/mutex.cpp @@ -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); } }