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