summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2013-08-06 22:08:50 +0200
committerAleksander Morgado <aleksander@lanedo.com>2013-09-05 15:39:00 +0200
commitf2b6a4f606665133dd5d8d74c6cbb10f14a9b8c6 (patch)
tree2869ab7e1ebf5c1813913434ca4e663bbc7a5730
parent4878c5647b1608a08142a3b7fd0f7f70dea65ab8 (diff)
downloadlibqmi-f2b6a4f606665133dd5d8d74c6cbb10f14a9b8c6.tar.gz
libqmi-glib,proxy: cleanup 'QmiDevice' when no longer used
-rw-r--r--src/libqmi-glib/qmi-proxy.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/libqmi-glib/qmi-proxy.c b/src/libqmi-glib/qmi-proxy.c
index e511f2ce..02e37b16 100644
--- a/src/libqmi-glib/qmi-proxy.c
+++ b/src/libqmi-glib/qmi-proxy.c
@@ -98,6 +98,9 @@ client_free (Client *client)
g_source_destroy (client->connection_readable_source);
g_source_unref (client->connection_readable_source);
+ if (client->device)
+ g_object_unref (client->device);
+
g_output_stream_close (g_io_stream_get_output_stream (G_IO_STREAM (client->connection)), NULL, NULL);
if (client->buffer)
@@ -110,14 +113,57 @@ client_free (Client *client)
g_slice_free (Client, client);
}
+static guint
+get_n_clients_with_device (QmiProxy *self,
+ QmiDevice *device)
+{
+ GList *l;
+ guint n = 0;
+
+ for (l = self->priv->clients; l; l = g_list_next (l)) {
+ Client *client = l->data;
+
+ if (device == client->device ||
+ g_str_equal (qmi_device_get_path (device), qmi_device_get_path (client->device)))
+ n++;
+ }
+
+ return n;
+}
+
static void
connection_close (Client *client)
{
QmiProxy *self = client->proxy;
+ QmiDevice *device;
+ device = client->device ? g_object_ref (client->device) : NULL;
client_free (client);
self->priv->clients = g_list_remove (self->priv->clients, client);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_N_CLIENTS]);
+
+ if (!device)
+ return;
+
+ /* If no more clients using the device, close and cleanup */
+ if (get_n_clients_with_device (self, device) == 0) {
+ GList *l;
+
+ for (l = self->priv->devices; l; l = g_list_next (l)) {
+ QmiDevice *device_in_list = QMI_DEVICE (l->data);
+
+ if (device == device_in_list ||
+ g_str_equal (qmi_device_get_path (device), qmi_device_get_path (device_in_list))) {
+ g_debug ("closing device '%s': no longer used", qmi_device_get_path_display (device));
+ qmi_device_close (device_in_list, NULL);
+ g_object_unref (device_in_list);
+ self->priv->devices = g_list_remove (self->priv->devices, device_in_list);
+ break;
+ }
+ }
+ }
+
+ g_object_unref (device);
}
static QmiDevice *