summaryrefslogtreecommitdiffstats
path: root/hcid/dbus-service.c
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2006-10-26 16:36:15 +0000
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2006-10-26 16:36:15 +0000
commit2dfe049b931c4e61d5fe57b4d5ff24226aa317ee (patch)
treea6160c9bd61a8d51a1a3bbaeba4b0fe0d152f4cd /hcid/dbus-service.c
parent8aaddbadec2ce6680e258a7d674c6d16e9d95f13 (diff)
Free memory and unregister the path when the service agent exits.
Diffstat (limited to 'hcid/dbus-service.c')
-rw-r--r--hcid/dbus-service.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/hcid/dbus-service.c b/hcid/dbus-service.c
index fb574e67..20fe56f8 100644
--- a/hcid/dbus-service.c
+++ b/hcid/dbus-service.c
@@ -48,7 +48,7 @@ struct service_agent {
char *description;
};
-static struct slist *services;
+static struct slist *services = NULL;
static void service_call_free(void *data)
{
@@ -145,9 +145,25 @@ mem_fail:
static void service_agent_exit(const char *name, void *data)
{
-
+ DBusConnection *conn = data;
+ struct slist *l = services;
+ struct service_agent *agent;
+ const char *path;
+
debug("Service Agent exited:%s", name);
- /* FIXME: free the dbus path data and unregister the path */
+
+ while (l) {
+ path = l->data;
+ l = l->next;
+
+ if (dbus_connection_get_object_path_data(conn, path, (void *) &agent))
+ service_agent_free(agent);
+
+ dbus_connection_unregister_object_path (conn, path);
+ }
+
+ slist_foreach(services, (slist_func_t) free, NULL);
+ services = NULL;
}
static void forward_reply(DBusPendingCall *call, void *udata)
@@ -388,7 +404,7 @@ int register_service_agent(DBusConnection *conn, const char *sender,
services = slist_append(services, strdup(path));
/* FIXME: only one listener per sender */
- name_listener_add(conn, sender, (name_cb_t) service_agent_exit, NULL);
+ name_listener_add(conn, sender, (name_cb_t) service_agent_exit, conn);
return 0;
}
@@ -400,10 +416,8 @@ int unregister_service_agent(DBusConnection *conn, const char *sender, const cha
debug("Unregistering service object: %s", path);
- if (!dbus_connection_get_object_path_data(conn, path, (void *) &agent))
- return -1;
-
- service_agent_free(agent);
+ if (dbus_connection_get_object_path_data(conn, path, (void *) &agent))
+ service_agent_free(agent);
if (!dbus_connection_unregister_object_path (conn, path))
return -1;
@@ -447,6 +461,9 @@ void release_service_agents(DBusConnection *conn)
dbus_connection_unregister_object_path (conn, path);
}
+ slist_foreach(services, (slist_func_t) free, NULL);
+ slist_free(services);
+ services = NULL;
}
void append_available_services(DBusMessageIter *array_iter)