fpi-device: Do not leak suspend/resume tasks

We kept suspend/resume GTask's around but at the moment of completing
them we didn't unref them, leading to leaks.
This commit is contained in:
Marco Trevisan (Treviño)
2022-09-27 20:30:31 +02:00
parent 0592c0e5ad
commit fd7d93e619

View File

@@ -1610,11 +1610,13 @@ update_attr (const char *attr, const char *value)
static void static void
complete_suspend_resume_task (FpDevice *device) complete_suspend_resume_task (FpDevice *device)
{ {
g_autoptr(GTask) task = NULL;
FpDevicePrivate *priv = fp_device_get_instance_private (device); FpDevicePrivate *priv = fp_device_get_instance_private (device);
g_assert (priv->suspend_resume_task); g_assert (priv->suspend_resume_task);
task = g_steal_pointer (&priv->suspend_resume_task);
g_task_return_boolean (g_steal_pointer (&priv->suspend_resume_task), TRUE); g_task_return_boolean (task, TRUE);
} }
void void
@@ -1779,6 +1781,7 @@ fpi_device_configure_wakeup (FpDevice *device, gboolean enabled)
static void static void
fpi_device_suspend_completed (FpDevice *device) fpi_device_suspend_completed (FpDevice *device)
{ {
g_autoptr(GTask) task = NULL;
FpDevicePrivate *priv = fp_device_get_instance_private (device); FpDevicePrivate *priv = fp_device_get_instance_private (device);
/* We have an ongoing operation, allow the device to wake up the machine. */ /* We have an ongoing operation, allow the device to wake up the machine. */
@@ -1788,11 +1791,12 @@ fpi_device_suspend_completed (FpDevice *device)
if (priv->critical_section) if (priv->critical_section)
g_warning ("Driver was in a critical section at suspend time. It likely deadlocked!"); g_warning ("Driver was in a critical section at suspend time. It likely deadlocked!");
task = g_steal_pointer (&priv->suspend_resume_task);
if (priv->suspend_error) if (priv->suspend_error)
g_task_return_error (g_steal_pointer (&priv->suspend_resume_task), g_task_return_error (task, g_steal_pointer (&priv->suspend_error));
g_steal_pointer (&priv->suspend_error));
else else
g_task_return_boolean (g_steal_pointer (&priv->suspend_resume_task), TRUE); g_task_return_boolean (task, TRUE);
} }
/** /**
@@ -1820,11 +1824,12 @@ fpi_device_suspend_complete (FpDevice *device,
g_return_if_fail (priv->suspend_resume_task); g_return_if_fail (priv->suspend_resume_task);
g_return_if_fail (priv->suspend_error == NULL); g_return_if_fail (priv->suspend_error == NULL);
priv->suspend_error = error; priv->suspend_error = g_steal_pointer (&error);
priv->is_suspended = TRUE; priv->is_suspended = TRUE;
/* If there is no error, we have no running task, return immediately. */ /* If there is no error, we have no running task, return immediately. */
if (error == NULL || !priv->current_task || g_task_get_completed (priv->current_task)) if (!priv->suspend_error || !priv->current_task ||
g_task_get_completed (priv->current_task))
{ {
fpi_device_suspend_completed (device); fpi_device_suspend_completed (device);
return; return;
@@ -1856,6 +1861,7 @@ void
fpi_device_resume_complete (FpDevice *device, fpi_device_resume_complete (FpDevice *device,
GError *error) GError *error)
{ {
g_autoptr(GTask) task = NULL;
FpDevicePrivate *priv = fp_device_get_instance_private (device); FpDevicePrivate *priv = fp_device_get_instance_private (device);
g_return_if_fail (FP_IS_DEVICE (device)); g_return_if_fail (FP_IS_DEVICE (device));
@@ -1864,10 +1870,12 @@ fpi_device_resume_complete (FpDevice *device,
priv->is_suspended = FALSE; priv->is_suspended = FALSE;
fpi_device_configure_wakeup (device, FALSE); fpi_device_configure_wakeup (device, FALSE);
task = g_steal_pointer (&priv->suspend_resume_task);
if (error) if (error)
g_task_return_error (g_steal_pointer (&priv->suspend_resume_task), error); g_task_return_error (task, error);
else else
g_task_return_boolean (g_steal_pointer (&priv->suspend_resume_task), TRUE); g_task_return_boolean (task, TRUE);
} }
/** /**