Tomas Bzatek 367151c
From c89b238b4a03e08ca8c793c5689948b1fa9c2722 Mon Sep 17 00:00:00 2001
Tomas Bzatek 367151c
From: Tomas Bzatek <tbzatek@redhat.com>
Tomas Bzatek 367151c
Date: Fri, 15 May 2009 14:29:28 +0200
Tomas Bzatek 367151c
Subject: [PATCH] Avoid deadlock when pulling resolved record from cache
Tomas Bzatek 367151c
Tomas Bzatek 367151c
When the host has already been resolved and is present in the cache,
Tomas Bzatek 367151c
it's returned immediately. But we always started the mainloop even
Tomas Bzatek 367151c
if it was quit before, resulting in endless waiting for an event
Tomas Bzatek 367151c
which had been received before that.
Tomas Bzatek 367151c
---
Tomas Bzatek 367151c
 common/gvfsdnssdresolver.c |   11 +++++++++--
Tomas Bzatek 367151c
 1 files changed, 9 insertions(+), 2 deletions(-)
Tomas Bzatek 367151c
Tomas Bzatek 367151c
diff --git a/common/gvfsdnssdresolver.c b/common/gvfsdnssdresolver.c
Tomas Bzatek 367151c
index 7794042..957d2cb 100644
Tomas Bzatek 367151c
--- a/common/gvfsdnssdresolver.c
Tomas Bzatek 367151c
+++ b/common/gvfsdnssdresolver.c
Tomas Bzatek 367151c
@@ -1249,14 +1249,21 @@ g_vfs_dns_sd_resolver_resolve_sync (GVfsDnsSdResolver  *resolver,
Tomas Bzatek 367151c
   g_return_val_if_fail (G_VFS_IS_DNS_SD_RESOLVER (resolver), FALSE);
Tomas Bzatek 367151c
 
Tomas Bzatek 367151c
   data = g_new0 (ResolveDataSync, 1);
Tomas Bzatek 367151c
-  data->loop = g_main_loop_new (NULL, FALSE);
Tomas Bzatek 367151c
+  /*  mark the main loop as running to have an indication whether
Tomas Bzatek 367151c
+   *  g_main_loop_quit() was called before g_main_loop_run()
Tomas Bzatek 367151c
+   */
Tomas Bzatek 367151c
+  data->loop = g_main_loop_new (NULL, TRUE);
Tomas Bzatek 367151c
 
Tomas Bzatek 367151c
   g_vfs_dns_sd_resolver_resolve (resolver,
Tomas Bzatek 367151c
                                  cancellable,
Tomas Bzatek 367151c
                                  (GAsyncReadyCallback) resolve_sync_cb,
Tomas Bzatek 367151c
                                  data);
Tomas Bzatek 367151c
 
Tomas Bzatek 367151c
-  g_main_loop_run (data->loop);
Tomas Bzatek 367151c
+  /*  start the loop only if it wasn't quit before
Tomas Bzatek 367151c
+   *  (i.e. in case when pulling the record from cache)
Tomas Bzatek 367151c
+   */
Tomas Bzatek 367151c
+  if (g_main_loop_is_running (data->loop))
Tomas Bzatek 367151c
+    g_main_loop_run (data->loop);
Tomas Bzatek 367151c
 
Tomas Bzatek 367151c
   ret = data->ret;
Tomas Bzatek 367151c
   if (data->error != NULL)
Tomas Bzatek 367151c
-- 
Tomas Bzatek 367151c
1.6.2.2
Tomas Bzatek 367151c