pull: Ensure worker queue finishes if we unhold an empty queue too
This commit is contained in:
parent
9618232f4d
commit
efe27f1b05
|
|
@ -79,10 +79,31 @@ ot_worker_queue_hold (OtWorkerQueue *queue)
|
||||||
g_atomic_int_inc (&queue->holds);
|
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
|
void
|
||||||
ot_worker_queue_release (OtWorkerQueue *queue)
|
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
|
void
|
||||||
|
|
@ -95,14 +116,6 @@ ot_worker_queue_push (OtWorkerQueue *queue,
|
||||||
g_mutex_unlock (&queue->mutex);
|
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
|
static gpointer
|
||||||
ot_worker_queue_thread_main (gpointer user_data)
|
ot_worker_queue_thread_main (gpointer user_data)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue