port-qmi: allow users to release clients when no longer needed

This commit is contained in:
Aleksander Morgado
2020-04-09 15:43:59 +02:00
parent 32e2623052
commit a60beedcc5
2 changed files with 49 additions and 7 deletions

View File

@@ -41,24 +41,38 @@ struct _MMPortQmiPrivate {
/*****************************************************************************/
QmiClient *
mm_port_qmi_peek_client (MMPortQmi *self,
static QmiClient *
lookup_client (MMPortQmi *self,
QmiService service,
MMPortQmiFlag flag)
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,
@@ -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;

View File

@@ -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);