On 5/16/06, Thomas Rosenblatt <[EMAIL PROTECTED]> wrote:
I'have often problems with su_timer, (su_timer_destroy fails,
su_timer_set_for_ever etc...)
Or sometimes I have a su_port_own_thread assertion what is really weird
since su_root_t object is always used with the same thread...

Here is the patch for sres_resolver_update() and sres_resolver_destroy().

--
Pekka.Pessi mail at nokia.com
Tue May 16 15:56:32 EEST 2006  [EMAIL PROTECTED]
  * sres.c: sres_resolver_update() always creates missing res_servers.
  Bug reported and patch submitted by Thomas Rosenblatt.
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 15:57:48.000000000 +0300
+++ new-sofia-sip/libsofia-sip-ua/sresolv/sres.c	2006-05-16 15:57:49.000000000 +0300
@@ -1669,6 +1669,7 @@ sres_toplevel(char buf[], size_t blen, c
 
 /* ---------------------------------------------------------------------- */
 
+static int sres_update_config(sres_resolver_t *res, int always, time_t now);
 static int sres_parse_config(sres_config_t *, FILE *);
 static int sres_parse_options(sres_config_t *c, char const *value);
 static int sres_parse_nameserver(sres_config_t *c, char const *server);
@@ -1676,22 +1677,55 @@ static time_t sres_config_timestamp(sres
 
 /** Update configuration
  *
+ * @retval 0 when successful
+ * @retval -1 upon an error
  */
 int sres_resolver_update(sres_resolver_t *res, int always)
 {
+  sres_server_t **servers, **old_servers;
+  int updated;
+
+  updated = sres_update_config(res, always, time(&res->res_now));
+  if (updated < 0)
+    return -1;
+
+  if (!res->res_servers || always || updated) {
+    servers = sres_servers_new(res, res->res_config);
+    old_servers = res->res_servers;
+
+    res->res_i_server = 0;
+    res->res_n_servers = sres_servers_count(servers);
+    res->res_servers = servers;
+
+    sres_servers_close(res, old_servers);
+    su_free(res->res_home, old_servers);
+
+    if (!servers)
+      return -1;
+  }
+
+  return 0;
+}
+
+/** Update config file.
+ *
+ * @retval 1 if DNS server list is different from old one.
+ * @retval 0 when otherwise successful
+ * @retval -1 upon an error
+ */
+static 
+int sres_update_config(sres_resolver_t *res, int always, time_t now)
+{
   sres_config_t *c = NULL;
   sres_config_t const *previous;
-  sres_server_t **servers, **old_servers;
+  int retval;
 
   previous = res->res_config;
 
-  time(&res->res_now);
-
-  if (!always && previous && res->res_now < res->res_checked)
+  if (!always && previous && now < res->res_checked)
     return 0;
-
   /* Try avoid checking for changes too often. */
-  res->res_checked = res->res_now + SRES_UPDATE_INTERVAL_SECS; 
+  res->res_checked = now + SRES_UPDATE_INTERVAL_SECS; 
   
   if (!always && previous && 
       sres_config_timestamp(previous) == previous->c_modified)
@@ -1703,26 +1737,11 @@ int sres_resolver_update(sres_resolver_t
 
   res->res_config = c;
 
-  if (sres_config_changed_servers(c, previous)) {
-    servers = sres_servers_new(res, c);
-    if (!servers) {
-      su_home_unref((void *)c->c_home);
-      return -1;
-    }
-
-    old_servers = res->res_servers;
-
-    res->res_i_server = 0;
-    res->res_n_servers = sres_servers_count(servers);
-    res->res_servers = servers;
-
-    sres_servers_close(res, old_servers);
-    su_free(res->res_home, old_servers);
-  }
+  retval = sres_config_changed_servers(c, previous);
 
   su_home_unref((su_home_t *)previous->c_home);
 
-  return 0;
+  return retval;
 }
 
 #if _WIN32

Tue May 16 15:54:05 EEST 2006  [EMAIL PROTECTED]
  * sresolv/sresolv.c: fix trhead problems in sres_resolver_destroy().
  sres_resolver_destroy() now always zaps su_root_t-related resources.
diff -rN -udp old-sofia-sip/libsofia-sip-ua/sresolv/sresolv.c new-sofia-sip/libsofia-sip-ua/sresolv/sresolv.c
--- old-sofia-sip/libsofia-sip-ua/sresolv/sresolv.c	2006-05-16 15:58:10.000000000 +0300
+++ new-sofia-sip/libsofia-sip-ua/sresolv/sresolv.c	2006-05-16 15:58:10.000000000 +0300
@@ -155,6 +155,9 @@ sres_resolver_destroy(sres_resolver_t *r
   if (srs == NULL)
     return su_seterrno(EINVAL);
 
+  sres_sofia_update(srs, -1, -1); /* Remove sockets from too, zap timers. */
+  srs->srs_root = NULL;
+
   sres_resolver_unref(srs->srs_resolver); 
 
   return 0;
@@ -181,6 +184,9 @@ static int sres_sofia_update(sres_sofia_
   if (srs == NULL)
     return 0;
 
+  if (srs->srs_root == NULL)
+    return -1;
+
   if (old_socket == new_socket) {
     if (old_socket == -1) {
       sres_resolver_set_async(srs->srs_resolver, sres_sofia_update, NULL, 0);


Reply via email to