#include <assert.h>
#include <stdio.h>
-#include <avahi-common/malloc.h>
-
+#include "malloc.h"
+#include "timeval.h"
#include "dbus-watch-glue.h"
static AvahiWatchEvent translate_dbus_to_avahi(unsigned int f) {
assert(t);
assert(d);
+ connection_data_ref(d);
+ dbus_connection_ref(d->connection);
+
if (dbus_connection_dispatch(d->connection) == DBUS_DISPATCH_DATA_REMAINS)
/* If there's still data, request that this handler is called again */
request_dispatch(d);
+
+ dbus_connection_unref(d->connection);
+ connection_data_unref(d);
}
-static void watch_callback(AvahiWatch *avahi_watch, int fd, AvahiWatchEvent events, void *userdata) {
+static void watch_callback(AvahiWatch *avahi_watch, AVAHI_GCC_UNUSED int fd, AvahiWatchEvent events, void *userdata) {
DBusWatch *dbus_watch = userdata;
+
assert(avahi_watch);
assert(dbus_watch);
const AvahiPoll *poll_api;
AvahiTimeout *avahi_timeout;
DBusTimeout *dbus_timeout;
+ int ref;
} TimeoutData;
+static TimeoutData* timeout_data_ref(TimeoutData *t) {
+ assert(t);
+ assert(t->ref >= 1);
+
+ t->ref++;
+ return t;
+}
+
+static void timeout_data_unref(TimeoutData *t) {
+ assert(t);
+ assert(t->ref >= 1);
+
+ if (--t->ref <= 0) {
+ if (t->avahi_timeout)
+ t->poll_api->timeout_free(t->avahi_timeout);
+
+ avahi_free(t);
+ }
+}
+
static void update_timeout(TimeoutData *timeout) {
assert(timeout);
+ assert(timeout->ref >= 1);
if (dbus_timeout_get_enabled(timeout->dbus_timeout)) {
struct timeval tv;
assert(avahi_timeout);
assert(timeout);
+ timeout_data_ref(timeout);
+
dbus_timeout_handle(timeout->dbus_timeout);
/* Ignore the return value */
+
+ if (timeout->avahi_timeout)
+ update_timeout(timeout);
- update_timeout(timeout);
+ timeout_data_unref(timeout);
}
static dbus_bool_t add_timeout(DBusTimeout *dbus_timeout, void *userdata) {
timeout->dbus_timeout = dbus_timeout;
timeout->poll_api = d->poll_api;
+ timeout->ref = 1;
if ((b = dbus_timeout_get_enabled(dbus_timeout)))
avahi_elapse_time(&tv, dbus_timeout_get_interval(dbus_timeout), 0);
d->poll_api,
b ? &tv : NULL,
timeout_callback,
- dbus_timeout))) {
+ timeout))) {
avahi_free(timeout);
return FALSE;
}
- dbus_timeout_set_data(dbus_timeout, timeout, NULL);
+ dbus_timeout_set_data(dbus_timeout, timeout, (DBusFreeFunction) timeout_data_unref);
return TRUE;
}
assert(timeout);
d->poll_api->timeout_free(timeout->avahi_timeout);
- avahi_free(timeout);
- dbus_timeout_set_data(dbus_timeout, NULL, NULL);
+ timeout->avahi_timeout = NULL;
}
-static void timeout_toggled(DBusTimeout *dbus_timeout, void *userdata) {
+static void timeout_toggled(DBusTimeout *dbus_timeout, AVAHI_GCC_UNUSED void *userdata) {
TimeoutData *timeout;
assert(dbus_timeout);
update_timeout(timeout);
}
-static void dispatch_status(DBusConnection *connection, DBusDispatchStatus new_status, void *userdata) {
+static void dispatch_status(AVAHI_GCC_UNUSED DBusConnection *connection, DBusDispatchStatus new_status, void *userdata) {
ConnectionData *d = userdata;
if (new_status == DBUS_DISPATCH_DATA_REMAINS)
if (!(d->dispatch_timeout = poll_api->timeout_new(poll_api, NULL, dispatch_timeout_callback, d)))
goto fail;
- if (!(dbus_connection_set_watch_functions(c, add_watch, remove_watch, watch_toggled, connection_data_ref(d), connection_data_unref)))
+ if (!(dbus_connection_set_watch_functions(c, add_watch, remove_watch, watch_toggled, connection_data_ref(d), (DBusFreeFunction)connection_data_unref)))
goto fail;
- if (!(dbus_connection_set_timeout_functions(c, add_timeout, remove_timeout, timeout_toggled, connection_data_ref(d), connection_data_unref)))
+ if (!(dbus_connection_set_timeout_functions(c, add_timeout, remove_timeout, timeout_toggled, connection_data_ref(d), (DBusFreeFunction)connection_data_unref)))
goto fail;
- dbus_connection_set_dispatch_status_function(c, dispatch_status, connection_data_ref(d), connection_data_unref);
+ dbus_connection_set_dispatch_status_function(c, dispatch_status, connection_data_ref(d), (DBusFreeFunction)connection_data_unref);
if (dbus_connection_get_dispatch_status(c) == DBUS_DISPATCH_DATA_REMAINS)
request_dispatch(d);