|
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 |
|