*/
int WorkQueue::run_tasks(void)
{
- pthread_mutex_lock(&lock);
+ os::unique_lock<os::mutex> lock(mutex);
- while (work_queue.empty() && !exit_workqueue)
- pthread_cond_wait(&wake_cond, &lock);
+ while (work_queue.empty() && !exit_workqueue) {
+ wake_cond.wait(lock);
+ }
if (exit_workqueue) {
- pthread_mutex_unlock(&lock);
return -1;
}
std::swap(work_queue, batch);
busy = true;
- pthread_mutex_unlock(&lock);
+ lock.unlock();
assert(!batch.empty());
while (!batch.empty()) {
delete task;
}
- pthread_mutex_lock(&lock);
+ lock.lock();
busy = false;
- pthread_cond_signal(&complete_cond);
-
- pthread_mutex_unlock(&lock);
+ complete_cond.signal();
return 0;
}
/* Must be called with WorkQueue::lock held */
void WorkQueue::wake_up_thread(void)
{
- pthread_cond_signal(&wake_cond);
+ wake_cond.signal();
}
void WorkQueue::queue_work(WorkQueueWork *task)
{
- pthread_mutex_lock(&lock);
+ mutex.lock();
work_queue.push(task);
wake_up_thread();
- pthread_mutex_unlock(&lock);
+ mutex.unlock();
}
void WorkQueue::flush(void)
{
- pthread_mutex_lock(&lock);
- while (!work_queue.empty() || busy)
- pthread_cond_wait(&complete_cond, &lock);
- pthread_mutex_unlock(&lock);
+ os::unique_lock<os::mutex> lock(mutex);
+ while (!work_queue.empty() || busy) {
+ complete_cond.wait(lock);
+ }
}
void WorkQueue::thread_entry(void)
void WorkQueue::destroy(void)
{
- pthread_mutex_lock(&lock);
+ mutex.lock();
exit_workqueue = true;
wake_up_thread();
- pthread_mutex_unlock(&lock);
+ mutex.unlock();
}
extern "C"
{
int err;
- pthread_cond_init(&wake_cond, NULL);
- pthread_cond_init(&complete_cond, NULL);
- pthread_mutex_init(&lock, NULL);
err = pthread_create(&handle, NULL, WorkQueue__entry_thunk, this);
assert(!err);
}