Put a ref on the resolver while calling the callback.
This makes sure that the object will still be around even if the resolver is
unreffed in the callback.
--- a/loudmouth/lm-asyncns-resolver.c Tue Aug 05 01:06:53 2008 +0200
+++ b/loudmouth/lm-asyncns-resolver.c Tue Aug 05 09:40:07 2008 +0200
@@ -109,18 +109,19 @@
priv->resolv_query = NULL;
}
-static gboolean
+static void
asyncns_resolver_done (LmResolver *resolver)
{
LmAsyncnsResolverPriv *priv = GET_PRIV (resolver);
struct addrinfo *ans;
int err;
- gboolean result = FALSE;
err = asyncns_getaddrinfo_done (priv->asyncns_ctx, priv->resolv_query, &ans);
priv->resolv_query = NULL;
/* Signal that we are done */
+ g_object_ref (resolver);
+
if (err) {
_lm_resolver_set_result (resolver,
LM_RESOLVER_RESULT_FAILED,
@@ -133,7 +134,7 @@
asyncns_resolver_cleanup (resolver);
- return result;
+ g_object_unref (resolver);
}
typedef gboolean (* LmAsyncnsResolverCallback) (LmResolver *resolver);
@@ -223,7 +224,7 @@
(gpointer) asyncns_resolver_done);
}
-static gboolean
+static void
asyncns_resolver_srv_done (LmResolver *resolver)
{
LmAsyncnsResolverPriv *priv = GET_PRIV (resolver);
@@ -269,8 +270,6 @@
if (result == TRUE) {
asyncns_resolver_lookup_host (resolver);
}
-
- return FALSE;
}
static void
--- a/loudmouth/lm-blocking-resolver.c Tue Aug 05 01:06:53 2008 +0200
+++ b/loudmouth/lm-blocking-resolver.c Tue Aug 05 09:40:07 2008 +0200
@@ -125,9 +125,13 @@
g_print ("Found result for %s\n", host);
+ g_object_ref (resolver);
+
_lm_resolver_set_result (LM_RESOLVER (resolver), LM_RESOLVER_RESULT_OK,
ans);
+ g_object_unref (resolver);
+
g_free (host);
}