On 5/15/06, Thomas Rosenblatt <[EMAIL PROTECTED]> wrote:
I think an UNLOCK(home) is missing in su_alloc.c -> _su_home_deinit ->
before destructor(home) .
That is why I was not able to su_home_threading(resolver)...

It looks like the destructor tried to free a memory area describing the servers.

I have bad feeling about giving up lock before calling destructor. Of
course, the object should not be used after unref has been called, but
on the other hand...

I removed the free operation from sres destructor, please see the
patch attached (or get it from darcs).

--
Pekka.Pessi mail at nokia.com
Tue May 16 13:24:26 EEST 2006  [EMAIL PROTECTED]
  * sresolv/sres.c: sres_resolver_t object can be threadsafe.
  Removed memory free operation from destructor.
diff -rN -udp old-sofia-sip/libsofia-sip-ua/sresolv/sres.c new-sofia-sip/libsofia-sip-ua/sresolv/sres.c
--- old-sofia-sip/libsofia-sip-ua/sresolv/sres.c	2006-05-16 13:27:37.000000000 +0300
+++ new-sofia-sip/libsofia-sip-ua/sresolv/sres.c	2006-05-16 13:27:38.000000000 +0300
@@ -344,7 +344,7 @@ sres_resolver_new_internal(sres_cache_t 
 			   char const *conf_file_path,
 			   char const **options);
 
-static void sres_servers_unref(sres_resolver_t *res,
+static void sres_servers_close(sres_resolver_t *res,
 			       sres_server_t **servers);
 
 static int sres_servers_count(sres_server_t * const *servers);
@@ -1430,6 +1430,7 @@ sres_record_compare(sres_record_t const 
 /* ---------------------------------------------------------------------- */
 /* Private functions */
 
+/** Destruct */
 static 
 void 
 sres_resolver_destructor(void *arg)
@@ -1440,7 +1441,7 @@ sres_resolver_destructor(void *arg)
   sres_cache_unref(res->res_cache); 
   res->res_cache = NULL;
 
-  sres_servers_unref(res, res->res_servers);
+  sres_servers_close(res, res->res_servers);
 
   if (res->res_updcb)
     res->res_updcb(res->res_async, -1, -1);
@@ -1715,7 +1716,8 @@ int sres_resolver_update(sres_resolver_t
     res->res_n_servers = sres_servers_count(servers);
     res->res_servers = servers;
 
-    sres_servers_unref(res, old_servers);
+    sres_servers_close(res, old_servers);
+    su_free(res->res_home, old_servers);
   }
 
   su_home_unref((su_home_t *)previous->c_home);
@@ -2208,7 +2210,7 @@ sres_server_t **sres_servers_new(sres_re
 }
 
 static
-void sres_servers_unref(sres_resolver_t *res,
+void sres_servers_close(sres_resolver_t *res,
 			sres_server_t **servers)
 {
   int i;
@@ -2226,8 +2228,6 @@ void sres_servers_unref(sres_resolver_t 
       closesocket(servers[i]->dns_socket);
     }
   }
-
-  su_free(res->res_home, servers);
 }
 
 static
diff -rN -udp old-sofia-sip/libsofia-sip-ua/sresolv/test_sresolv.c new-sofia-sip/libsofia-sip-ua/sresolv/test_sresolv.c
--- old-sofia-sip/libsofia-sip-ua/sresolv/test_sresolv.c	2006-05-16 13:27:37.000000000 +0300
+++ new-sofia-sip/libsofia-sip-ua/sresolv/test_sresolv.c	2006-05-16 13:27:38.000000000 +0300
@@ -1709,6 +1709,7 @@ int test_api_errors(sres_context_t *noct
   TEST_1(template);
   
   TEST_1(res = sres_resolver_new(NULL));
+  TEST(su_home_threadsafe((su_home_t *)res), 0);
   TEST_VOID(sres_resolver_unref(res));
 
 #ifndef _WIN32
@@ -1725,6 +1726,7 @@ int test_api_errors(sres_context_t *noct
   putenv("LOCALDOMAIN=localdomain");
 
   TEST_1(res = sres_resolver_new(template));
+  TEST(su_home_threadsafe((su_home_t *)res), 0);
 
   unlink(template);
   
@@ -1788,6 +1790,7 @@ int test_init(sres_context_t *ctx, char 
   ctx->query = NULL, ctx->result = NULL;
 
   TEST_1(ctx->resolver = res = sres_resolver_new(conf_file));
+  TEST(su_home_threadsafe((su_home_t *)ctx->resolver), 0);
   n = sres_resolver_sockets(res, NULL, 0);
   ctx->n_sockets = n;
   TEST_1(n < SRES_MAX_NAMESERVERS);



Reply via email to