diff --git a/src/threading/Manager.cc b/src/threading/Manager.cc index 1b6cb551e2..9e0616f0d2 100644 --- a/src/threading/Manager.cc +++ b/src/threading/Manager.cc @@ -82,7 +82,17 @@ double Manager::NextTimestamp(double* network_time) { MsgThread* t = *i; - if ( (*i)->MightHaveOut() && ! t->Killed() ) + // We check here if there's something ready to read from the + // queue. Normally the queue will tell us that reliably via + // MightHaveOut() because we keep sending heartbeats that + // will ensure that the method will eventually return true. + // However, when running without network source and without + // any communication, the timer_manager's time will always + // remain at 1.0, which means that heartbeats will never be + // triggered. In that case, we make sure to still process our + // threads from time to time. + if ( ((*i)->MightHaveOut() && ! t->Killed()) + || (timer_mgr->Time() == 1.0 && random() % 10000 == 0) ) return timer_mgr->Time(); } diff --git a/src/threading/Queue.h b/src/threading/Queue.h index c4f2bfab00..b2b3fdaa03 100644 --- a/src/threading/Queue.h +++ b/src/threading/Queue.h @@ -63,11 +63,13 @@ public: /** * Returns true if the next Get() operation might succeed. This * function may occasionally return a value not indicating the actual - * state, but won't do so very often. Occasionally we also return a - * true unconditionally to avoid a deadlock when both pointers happen - * to be equal even though there's stuff queued. + * state, but won't do so very often. Note that this means that it can + * consistently return false even if there is something in the Queue. + * You have to check real queue status from time to time to be sure that + * it is empty. In other words, this method helps to avoid locking the queue + * frequently, but doesn't allow you to forgo it completely. */ - bool MaybeReady() { return (read_ptr != write_ptr) || (random() % 10000 == 0); } + bool MaybeReady() { return (read_ptr != write_ptr); } /** Wake up the reader if it's currently blocked for input. This is primarily to give it a chance to check termination quickly.