diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2020-04-09 15:43:59 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2020-04-09 15:48:23 +0200 |
commit | a60beedcc590c9dc590e616676652eec2a3bc51b (patch) | |
tree | 3d304554014626ad92e039e65735e89c6e6abf96 | |
parent | 32e26230526dda8298b38db2b65e57dc635fbf9d (diff) |
port-qmi: allow users to release clients when no longer needed
-rw-r--r-- | src/mm-port-qmi.c | 52 | ||||
-rw-r--r-- | src/mm-port-qmi.h | 4 |
2 files changed, 49 insertions, 7 deletions
diff --git a/src/mm-port-qmi.c b/src/mm-port-qmi.c index 98dd8c44..3f39bfc0 100644 --- a/src/mm-port-qmi.c +++ b/src/mm-port-qmi.c @@ -41,25 +41,39 @@ struct _MMPortQmiPrivate { /*****************************************************************************/ -QmiClient * -mm_port_qmi_peek_client (MMPortQmi *self, - QmiService service, - MMPortQmiFlag flag) +static QmiClient * +lookup_client (MMPortQmi *self, + QmiService service, + MMPortQmiFlag flag, + gboolean steal) { GList *l; for (l = self->priv->services; l; l = g_list_next (l)) { ServiceInfo *info = l->data; - if (info->service == service && - info->flag == flag) - return info->client; + if (info->service == service && info->flag == flag) { + QmiClient *found; + + found = info->client; + if (steal) + self->priv->services = g_list_delete_link (self->priv->services, l); + return found; + } } return NULL; } QmiClient * +mm_port_qmi_peek_client (MMPortQmi *self, + QmiService service, + MMPortQmiFlag flag) +{ + return lookup_client (self, service, flag, FALSE); +} + +QmiClient * mm_port_qmi_get_client (MMPortQmi *self, QmiService service, MMPortQmiFlag flag) @@ -82,6 +96,30 @@ mm_port_qmi_peek_device (MMPortQmi *self) /*****************************************************************************/ +void +mm_port_qmi_release_client (MMPortQmi *self, + QmiService service, + MMPortQmiFlag flag) +{ + QmiClient *client; + + if (!self->priv->qmi_device) + return; + + client = lookup_client (self, service, flag, TRUE); + if (!client) + return; + + mm_obj_dbg (self, "explicitly releasing client for service '%s'...", qmi_service_get_string (service)); + qmi_device_release_client (self->priv->qmi_device, + client, + QMI_DEVICE_RELEASE_CLIENT_FLAGS_RELEASE_CID, + 3, NULL, NULL, NULL); + g_object_unref (client); +} + +/*****************************************************************************/ + typedef struct { ServiceInfo *info; } AllocateClientContext; diff --git a/src/mm-port-qmi.h b/src/mm-port-qmi.h index f8ea9eec..b4e8460c 100644 --- a/src/mm-port-qmi.h +++ b/src/mm-port-qmi.h @@ -80,6 +80,10 @@ gboolean mm_port_qmi_allocate_client_finish (MMPortQmi *self, GAsyncResult *res, GError **error); +void mm_port_qmi_release_client (MMPortQmi *self, + QmiService service, + MMPortQmiFlag flag); + QmiClient *mm_port_qmi_peek_client (MMPortQmi *self, QmiService service, MMPortQmiFlag flag); |