]> git.meshlink.io Git - catta/blobdiff - avahi-core/browse.c
update diagram a bit
[catta] / avahi-core / browse.c
index 45e8bcef7fd6f7bad29a92aebd05e88a2daf4c8e..10d71cbc514f9a9ba66c825989ec1ebedeae5a5d 100644 (file)
@@ -40,6 +40,7 @@ struct AvahiRecordBrowser {
 
     AvahiRecordBrowserCallback callback;
     gpointer userdata;
+    guint scan_idle_source;
 
     AVAHI_LLIST_FIELDS(AvahiRecordBrowser, browser);
     AVAHI_LLIST_FIELDS(AvahiRecordBrowser, by_key);
@@ -57,7 +58,7 @@ static void elapse(AvahiTimeEvent *e, void *userdata) {
     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)); */
+/*     avahi_log_debug("%i. Continuous querying for %s", s->n_query, t = avahi_key_to_string(s->key)); */
 /*     g_free(t); */
     
     avahi_elapse_time(&tv, s->sec_delay*1000, 0);
@@ -102,6 +103,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;
@@ -135,9 +147,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 +162,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 +188,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);
 }