pull: Ensure worker queue finishes if we unhold an empty queue too

This commit is contained in:
Colin Walters 2012-10-04 20:32:14 -04:00
parent 9618232f4d
commit efe27f1b05
1 changed files with 22 additions and 9 deletions

View File

@ -79,10 +79,31 @@ ot_worker_queue_hold (OtWorkerQueue *queue)
g_atomic_int_inc (&queue->holds);
}
static gboolean
invoke_idle_callback (gpointer user_data)
{
OtWorkerQueue *queue = user_data;
queue->idle_callback (queue->idle_data);
return FALSE;
}
void
ot_worker_queue_release (OtWorkerQueue *queue)
{
g_atomic_int_add (&queue->holds, -1);
if (!g_atomic_int_dec_and_test (&queue->holds))
return;
g_mutex_lock (&queue->mutex);
if (!g_queue_peek_tail_link (&queue->queue))
{
if (queue->idle_callback)
g_main_context_invoke (queue->idle_context,
invoke_idle_callback,
queue);
}
g_mutex_unlock (&queue->mutex);
}
void
@ -95,14 +116,6 @@ ot_worker_queue_push (OtWorkerQueue *queue,
g_mutex_unlock (&queue->mutex);
}
static gboolean
invoke_idle_callback (gpointer user_data)
{
OtWorkerQueue *queue = user_data;
queue->idle_callback (queue->idle_data);
return FALSE;
}
static gpointer
ot_worker_queue_thread_main (gpointer user_data)
{