CamelIMAPXJob: Reference the job when queueing.
authorMatthew Barnes <mbarnes@redhat.com>
Fri, 2 Dec 2011 02:50:59 +0000 (20:50 -0600)
committerMatthew Barnes <mbarnes@redhat.com>
Fri, 2 Dec 2011 03:06:07 +0000 (21:06 -0600)
Reference is dropped after dequeueing in imapx_job_done().

camel/providers/imapx/camel-imapx-server.c

index 454adcb..87aedc4 100644 (file)
@@ -2242,18 +2242,17 @@ static void
 imapx_job_done (CamelIMAPXServer *is,
                 CamelIMAPXJob *job)
 {
-       QUEUE_LOCK (is);
-       g_queue_remove (&is->jobs, job);
-       QUEUE_UNLOCK (is);
-
-       if (job->noreply)
-               imapx_job_unref (job);
-       else {
+       if (!job->noreply) {
                g_mutex_lock (job->done_mutex);
                job->done_flag = TRUE;
                g_cond_broadcast (job->done_cond);
                g_mutex_unlock (job->done_mutex);
        }
+
+       QUEUE_LOCK (is);
+       if (g_queue_remove (&is->jobs, job))
+               imapx_job_unref (job);
+       QUEUE_UNLOCK (is);
 }
 
 static gboolean
@@ -2263,7 +2262,7 @@ imapx_register_job (CamelIMAPXServer *is,
 {
        if (is->state >= IMAPX_INITIALISED) {
                QUEUE_LOCK (is);
-               g_queue_push_head (&is->jobs, job);
+               g_queue_push_head (&is->jobs, imapx_job_ref (job));
                QUEUE_UNLOCK (is);
 
        } else {