X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-core%2Fbrowse.c;h=2d14c90477899fc899be37c2fc5604b2b415932d;hb=38b45921cd1d33119f1c06979a57bcfe982e22da;hp=45e8bcef7fd6f7bad29a92aebd05e88a2daf4c8e;hpb=259ef1fd00e7e415dfb11bf26747355e5cd851f7;p=catta diff --git a/avahi-core/browse.c b/avahi-core/browse.c index 45e8bce..2d14c90 100644 --- a/avahi-core/browse.c +++ b/avahi-core/browse.c @@ -25,6 +25,7 @@ #include "browse.h" #include "util.h" +#include "log.h" struct AvahiRecordBrowser { gboolean dead; @@ -33,13 +34,13 @@ struct AvahiRecordBrowser { AvahiKey *key; gint interface; guchar protocol; - gint n_query; guint sec_delay; AvahiTimeEvent *time_event; AvahiRecordBrowserCallback callback; gpointer userdata; + guint scan_idle_source; AVAHI_LLIST_FIELDS(AvahiRecordBrowser, browser); AVAHI_LLIST_FIELDS(AvahiRecordBrowser, by_key); @@ -48,17 +49,19 @@ struct AvahiRecordBrowser { static void elapse(AvahiTimeEvent *e, void *userdata) { AvahiRecordBrowser *s = userdata; GTimeVal tv; -/* gchar *t; */ +/* gchar *t; */ g_assert(s); avahi_server_post_query(s->server, s->interface, s->protocol, s->key); - if (s->n_query++ <= 8) - s->sec_delay *= 2; - -/* g_message("%i. Continuous querying for %s", s->n_query, t = avahi_key_to_string(s->key)); */ -/* g_free(t); */ + s->sec_delay *= 2; + + if (s->sec_delay >= 60*60) /* 1h */ + s->sec_delay = 60*60; + +/* avahi_log_debug("Continuous querying for %s (%i)", t = avahi_key_to_string(s->key), s->sec_delay); */ +/* g_free(t); */ avahi_elapse_time(&tv, s->sec_delay*1000, 0); avahi_time_event_queue_update(s->server->time_event_queue, s->time_event, &tv); @@ -102,6 +105,17 @@ static void scan_interface_callback(AvahiInterfaceMonitor *m, AvahiInterface *i, avahi_cache_walk(i->cache, s->key, scan_cache_callback, &cbdata); } +gboolean scan_idle_callback(gpointer data) { + AvahiRecordBrowser *b = data; + g_assert(b); + + /* Scan the caches */ + avahi_interface_monitor_walk(b->server->monitor, b->interface, b->protocol, scan_interface_callback, b); + b->scan_idle_source = (guint) -1; + + return FALSE; +} + AvahiRecordBrowser *avahi_record_browser_new(AvahiServer *server, gint interface, guchar protocol, AvahiKey *key, AvahiRecordBrowserCallback callback, gpointer userdata) { AvahiRecordBrowser *b, *t; GTimeVal tv; @@ -120,7 +134,6 @@ AvahiRecordBrowser *avahi_record_browser_new(AvahiServer *server, gint interface b->protocol = protocol; b->callback = callback; b->userdata = userdata; - b->n_query = 1; b->sec_delay = 1; avahi_server_post_query(b->server, b->interface, b->protocol, b->key); @@ -135,9 +148,8 @@ AvahiRecordBrowser *avahi_record_browser_new(AvahiServer *server, gint interface AVAHI_LLIST_PREPEND(AvahiRecordBrowser, by_key, t, b); g_hash_table_replace(server->record_browser_hashtable, key, t); - /* Scan the caches */ - avahi_interface_monitor_walk(b->server->monitor, b->interface, b->protocol, scan_interface_callback, b); - + /* The currenlty cached entries are scanned a bit later */ + b->scan_idle_source = g_idle_add_full(G_PRIORITY_HIGH, scan_idle_callback, b, NULL); return b; } @@ -151,6 +163,12 @@ void avahi_record_browser_free(AvahiRecordBrowser *b) { if (b->time_event) { avahi_time_event_queue_remove(b->server->time_event_queue, b->time_event); b->time_event = NULL; + + if (b->scan_idle_source != (guint) -1) { + g_source_remove(b->scan_idle_source); + b->scan_idle_source = (guint) -1; + } + } } @@ -171,6 +189,9 @@ void avahi_record_browser_destroy(AvahiRecordBrowser *b) { if (b->time_event) avahi_time_event_queue_remove(b->server->time_event_queue, b->time_event); avahi_key_unref(b->key); + + if (b->scan_idle_source != (guint) -1) + g_source_remove(b->scan_idle_source); g_free(b); }