boostorg / boostorg/fiber

Assert on: ctx->remote_ready_is_linked() on cond_var.wait_for(..)

Open
#259 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
510
Forks
123
PR merge metrics
No merged PRs in 30d

Description

Situation:
0. I use boost 1.69
1. Have one thread pool (TP) with shared_work algo started on it.
2. fibers running in TP is waiting on cond_var:
```cpp
boost::fibers::mutex _mtx;
boost::fibers::condition_variable _condition;
...

std::unique_lock lock{ _mtx };
if (!_condition.wait_for(lock, WaitTimeout(), GetWaitPredicate()))
throw std::runtime_error{ __FUNCTION__": pontentially lost" };

```
2. I Have other threads (not in thread pool, round_robin default scheduler). Where I notify cv:
```cpp
std::unique_lock lock{ _mtx };
// fullfill predicate somehow:
_condition.notify_all();
```

If I build the program with assertions I got very fast the assert:
```cpp
void
scheduler::sleep2ready_() noexcept {
// move context which the deadline has reached
// to ready-queue
// sleep-queue is sorted (ascending)
std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
sleep_queue_type::iterator e = sleep_queue_.end();
for ( sleep_queue_type::iterator i = sleep_queue_.begin(); i != e;) {
context * ctx = & ( * i);
// dipatcher context must never be pushed to sleep-queue
BOOST_ASSERT( ! ctx->is_context( type::dispatcher_context) );
BOOST_ASSERT( main_ctx_ == ctx || ctx->worker_is_linked() );
BOOST_ASSERT( ! ctx->ready_is_linked() );
#if ! defined(BOOST_FIBERS_NO_ATOMICS)
BOOST_ASSERT( ! ctx->remote_ready_is_linked() ); <---- THIS ASSERT
#endif
...
```

As far As I understand the fiber can be waked up by timer or by notification from another thread and this is not allowed by this assert. How can I fix the issue?

**P.S. When I changed wait_for() -> wait() the assert is gone!**

Thanks!

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.