summaryrefslogtreecommitdiffstats
path: root/avahi-core/browse.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-06-16 16:32:27 +0000
committerLennart Poettering <lennart@poettering.net>2005-06-16 16:32:27 +0000
commitf334deaf9d630782be3f7f535265ff7488162f85 (patch)
treeab26174979fd549479b58013e73aec8fe9efdade /avahi-core/browse.c
parent969d343114a3ad07e9f1617ec1df465ca501d222 (diff)
* update avahi_address_parse() to work with AF_UNSPEC address family
* complete simple protocol * defer scanning already cached RRs when browsing into its own main loop job git-svn-id: file:///home/lennart/svn/public/avahi/trunk@114 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'avahi-core/browse.c')
-rw-r--r--avahi-core/browse.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/avahi-core/browse.c b/avahi-core/browse.c
index deeb465..10d71cb 100644
--- a/avahi-core/browse.c
+++ b/avahi-core/browse.c
@@ -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);
@@ -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);
}