diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2013-08-06 22:08:50 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2013-09-05 15:39:00 +0200 |
commit | f2b6a4f606665133dd5d8d74c6cbb10f14a9b8c6 (patch) | |
tree | 2869ab7e1ebf5c1813913434ca4e663bbc7a5730 | |
parent | 4878c5647b1608a08142a3b7fd0f7f70dea65ab8 (diff) | |
download | libqmi-f2b6a4f606665133dd5d8d74c6cbb10f14a9b8c6.tar.gz |
libqmi-glib,proxy: cleanup 'QmiDevice' when no longer used
-rw-r--r-- | src/libqmi-glib/qmi-proxy.c | 46 |
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 * |