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