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