finisher_thread.join();
}
+void Finisher::wait_for_empty()
+{
+ finisher_lock.Lock();
+ while (!finisher_queue.empty())
+ finisher_cond.Wait(finisher_lock);
+ finisher_lock.Unlock();
+}
+
void *Finisher::finisher_thread_entry()
{
finisher_lock.Lock();
ls.clear();
finisher_lock.Lock();
+ finisher_empty_cond.Signal();
}
if (finisher_stop) break;
class Finisher {
Mutex finisher_lock;
- Cond finisher_cond;
+ Cond finisher_cond, finisher_empty_cond;
bool finisher_stop;
vector<Context*> finisher_queue;
list<pair<Context*,int> > finisher_queue_rval;
void start();
void stop();
+ void wait_for_empty();
+
Finisher() : finisher_lock("Finisher::finisher_lock"), finisher_stop(false), finisher_thread(this) {}
};