void
mutex::lock() {
- context * ctx = context::active();
+ context * active_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(
+ detail::spinlock_lock lk{ wait_queue_splk_ };
+ if ( 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;
return;
}
- BOOST_ASSERT( ! ctx->wait_is_linked() );
- ctx->wait_link( wait_queue_);
+ BOOST_ASSERT( ! active_ctx->wait_is_linked() );
+ active_ctx->wait_link( wait_queue_);
// suspend this fiber
- ctx->suspend( lk);
- BOOST_ASSERT( ! ctx->wait_is_linked() );
+ active_ctx->suspend( lk);
+ BOOST_ASSERT( ! active_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 ( 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 ( 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" };
}
if ( ! wait_queue_.empty() ) {
context * ctx = & wait_queue_.front();
wait_queue_.pop_front();
owner_ = ctx;
- context::active()->set_ready( ctx);
+ active_ctx->schedule( ctx);
} else {
owner_ = nullptr;
return;