private:
typedef context::wait_queue_t wait_queue_t;
- wait_queue_t wait_queue_{};
detail::spinlock wait_queue_splk_{};
+ wait_queue_t wait_queue_{};
public:
condition_variable_any() = default;
template< typename LockType >
void wait( LockType & lt) {
- context * ctx = context::active();
+ context * active_ctx = context::active();
// atomically call lt.unlock() and block on *this
// store this fiber in waiting-queue
- detail::spinlock_lock lk( wait_queue_splk_);
- BOOST_ASSERT( ! ctx->wait_is_linked() );
- ctx->wait_link( wait_queue_);
+ detail::spinlock_lock lk{ wait_queue_splk_ };
+ BOOST_ASSERT( ! active_ctx->wait_is_linked() );
+ active_ctx->wait_link( wait_queue_);
// unlock external lt
lt.unlock();
// suspend this fiber
- ctx->suspend( lk);
- // relock local lk
- lk.lock();
- // remove from waiting-queue
- ctx->wait_unlink();
- // unlock local lk
- lk.unlock();
+ active_ctx->suspend( lk);
// relock external again before returning
try {
lt.lock();
std::terminate();
}
// post-conditions
- BOOST_ASSERT( ! ctx->wait_is_linked() );
+ BOOST_ASSERT( ! active_ctx->wait_is_linked() );
}
template< typename LockType, typename Pred >
template< typename LockType, typename Clock, typename Duration >
cv_status wait_until( LockType & lt, std::chrono::time_point< Clock, Duration > const& timeout_time_) {
+ context * active_ctx = context::active();
cv_status status = cv_status::no_timeout;
- std::chrono::steady_clock::time_point timeout_time(
- detail::convert( timeout_time_) );
- context * ctx = context::active();
+ std::chrono::steady_clock::time_point timeout_time = detail::convert( timeout_time_);
// atomically call lt.unlock() and block on *this
// store this fiber in waiting-queue
- detail::spinlock_lock lk( wait_queue_splk_);
- BOOST_ASSERT( ! ctx->wait_is_linked() );
- ctx->wait_link( wait_queue_);
+ detail::spinlock_lock lk{ wait_queue_splk_ };
+ BOOST_ASSERT( ! active_ctx->wait_is_linked() );
+ active_ctx->wait_link( wait_queue_);
// unlock external lt
lt.unlock();
// suspend this fiber
- if ( ! ctx->wait_until( timeout_time, lk) ) {
+ if ( ! active_ctx->wait_until( timeout_time, lk) ) {
status = cv_status::timeout;
+ // relock local lk
+ lk.lock();
+ // remove from waiting-queue
+ wait_queue_.remove( * active_ctx);
+ // unlock local lk
+ lk.unlock();
}
- // relock local lk
- lk.lock();
- // remove from waiting-queue
- ctx->wait_unlink();
- // unlock local lk
- lk.unlock();
// relock external again before returning
try {
lt.lock();
std::terminate();
}
// post-conditions
- BOOST_ASSERT( ! ctx->wait_is_linked() );
+ BOOST_ASSERT( ! active_ctx->wait_is_linked() );
return status;
}