port-qmi: allow users to release clients when no longer needed
This commit is contained in:
@@ -41,24 +41,38 @@ 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,
|
||||
@@ -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;
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user