libfprint/SOURCES/0028-fpi-ssm-Take-ownership-of-the-SSM-when-completing-it.patch
2021-09-09 20:12:48 +00:00

510 lines
16 KiB
Diff

From 70d7ad5047544c5b66a280c1e6a2da1dcc3eb5f8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net>
Date: Tue, 26 Nov 2019 16:18:14 +0100
Subject: [PATCH 028/181] fpi-ssm: Take ownership of the SSM when completing it
When a machine is completed, we automatically free it since we can't
consider it valid anymore since this point.
Update the drivers not to free the SSM on completion callback anymore.
---
libfprint/drivers/aes1610.c | 2 --
libfprint/drivers/aes2501.c | 2 --
libfprint/drivers/aes2550.c | 2 --
libfprint/drivers/aesx660.c | 3 ---
libfprint/drivers/elan.c | 4 ----
libfprint/drivers/etes603.c | 6 ------
libfprint/drivers/synaptics/synaptics.c | 1 -
libfprint/drivers/upeksonly.c | 2 --
libfprint/drivers/upektc.c | 2 --
libfprint/drivers/upektc_img.c | 3 ---
libfprint/drivers/upekts.c | 4 ----
libfprint/drivers/uru4000.c | 1 -
libfprint/drivers/vcom5s.c | 1 -
libfprint/drivers/vfs0050.c | 2 --
libfprint/drivers/vfs101.c | 2 --
libfprint/drivers/vfs301.c | 2 --
libfprint/drivers/vfs5011.c | 2 --
libfprint/fpi-ssm.c | 15 +++++++++++----
18 files changed, 11 insertions(+), 45 deletions(-)
diff --git a/libfprint/drivers/aes1610.c b/libfprint/drivers/aes1610.c
index c9742e9..0326565 100644
--- a/libfprint/drivers/aes1610.c
+++ b/libfprint/drivers/aes1610.c
@@ -710,7 +710,6 @@ capture_sm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
{
start_finger_detection (dev);
}
- fpi_ssm_free (ssm);
}
static void
@@ -774,7 +773,6 @@ activate_sm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
if (!error)
start_finger_detection (dev);
- fpi_ssm_free (ssm);
}
static void
diff --git a/libfprint/drivers/aes2501.c b/libfprint/drivers/aes2501.c
index fad0218..1b59c56 100644
--- a/libfprint/drivers/aes2501.c
+++ b/libfprint/drivers/aes2501.c
@@ -575,7 +575,6 @@ capture_sm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
{
start_finger_detection (dev);
}
- fpi_ssm_free (ssm);
}
static void
@@ -806,7 +805,6 @@ activate_sm_complete (FpiSsm *ssm, FpDevice *dev, GError *error)
if (!error)
start_finger_detection (FP_IMAGE_DEVICE (dev));
- fpi_ssm_free (ssm);
}
static void
diff --git a/libfprint/drivers/aes2550.c b/libfprint/drivers/aes2550.c
index 2abcf76..b95b053 100644
--- a/libfprint/drivers/aes2550.c
+++ b/libfprint/drivers/aes2550.c
@@ -391,7 +391,6 @@ capture_sm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
{
start_finger_detection (dev);
}
- fpi_ssm_free (ssm);
}
static void
@@ -537,7 +536,6 @@ activate_sm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
if (!error)
start_finger_detection (dev);
- fpi_ssm_free (ssm);
}
static void
diff --git a/libfprint/drivers/aesx660.c b/libfprint/drivers/aesx660.c
index 8ad4c63..3f13252 100644
--- a/libfprint/drivers/aesx660.c
+++ b/libfprint/drivers/aesx660.c
@@ -215,7 +215,6 @@ finger_det_sm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
fp_dbg ("Finger detection completed");
fpi_image_device_report_finger_status (dev, TRUE);
- fpi_ssm_free (ssm);
if (priv->deactivating)
{
@@ -466,7 +465,6 @@ capture_sm_complete (FpiSsm *ssm, FpDevice *device, GError *error)
FpiDeviceAesX660Private *priv = fpi_device_aes_x660_get_instance_private (self);
fp_dbg ("Capture completed");
- fpi_ssm_free (ssm);
if (priv->deactivating)
{
@@ -672,7 +670,6 @@ static void
activate_sm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
{
fpi_image_device_activate_complete (FP_IMAGE_DEVICE (_dev), error);
- fpi_ssm_free (ssm);
if (!error)
start_finger_detection (FP_IMAGE_DEVICE (_dev));
diff --git a/libfprint/drivers/elan.c b/libfprint/drivers/elan.c
index 961366e..5e80be5 100644
--- a/libfprint/drivers/elan.c
+++ b/libfprint/drivers/elan.c
@@ -479,7 +479,6 @@ stop_capture_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
G_DEBUG_HERE ();
- fpi_ssm_free (ssm);
/* The device is inactive at this point. */
self->dev_state = FP_IMAGE_DEVICE_STATE_INACTIVE;
@@ -606,7 +605,6 @@ capture_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
fpi_image_device_session_error (dev, error);
}
- fpi_ssm_free (ssm);
}
static void
@@ -789,7 +787,6 @@ calibrate_complete (FpiSsm *ssm, FpDevice *dev, GError *error)
elan_capture (dev);
}
- fpi_ssm_free (ssm);
}
static void
@@ -886,7 +883,6 @@ activate_complete (FpiSsm *ssm, FpDevice *dev, GError *error)
fpi_image_device_activate_complete (idev, error);
- fpi_ssm_free (ssm);
}
static void
diff --git a/libfprint/drivers/etes603.c b/libfprint/drivers/etes603.c
index 5c990da..55f0139 100644
--- a/libfprint/drivers/etes603.c
+++ b/libfprint/drivers/etes603.c
@@ -789,7 +789,6 @@ m_exit_complete (FpiSsm *ssm, FpDevice *dev, GError *error)
else
fp_dbg ("The device is now in idle state");
fpi_image_device_deactivate_complete (idev, error);
- fpi_ssm_free (ssm);
}
static void
@@ -911,7 +910,6 @@ m_capture_complete (FpiSsm *ssm, FpDevice *dev, GError *error)
g_error_free (error);
}
}
- fpi_ssm_free (ssm);
if (self->is_active == TRUE)
{
@@ -1061,7 +1059,6 @@ m_finger_complete (FpiSsm *ssm, FpDevice *dev, GError *error)
self->is_active = FALSE;
}
- fpi_ssm_free (ssm);
}
static void
@@ -1265,7 +1262,6 @@ m_tunevrb_complete (FpiSsm *ssm, FpDevice *dev, GError *error)
if (!self->is_active)
m_exit_start (idev);
- fpi_ssm_free (ssm);
}
/*
@@ -1409,7 +1405,6 @@ m_tunedc_complete (FpiSsm *ssm, FpDevice *dev, GError *error)
if (!self->is_active)
m_exit_start (idev);
- fpi_ssm_free (ssm);
}
static void
@@ -1543,7 +1538,6 @@ m_init_complete (FpiSsm *ssm, FpDevice *dev, GError *error)
reset_param (FPI_DEVICE_ETES603 (dev));
fpi_image_device_session_error (idev, error);
}
- fpi_ssm_free (ssm);
}
static void
diff --git a/libfprint/drivers/synaptics/synaptics.c b/libfprint/drivers/synaptics/synaptics.c
index a2286b2..4932d01 100644
--- a/libfprint/drivers/synaptics/synaptics.c
+++ b/libfprint/drivers/synaptics/synaptics.c
@@ -290,7 +290,6 @@ cmd_ssm_done (FpiSsm *ssm, FpDevice *dev, GError *error)
}
self->cmd_complete_on_removal = FALSE;
g_clear_pointer (&self->cmd_complete_error, g_error_free);
- fpi_ssm_free (ssm);
}
static void
diff --git a/libfprint/drivers/upeksonly.c b/libfprint/drivers/upeksonly.c
index ec81375..e1cd7e5 100644
--- a/libfprint/drivers/upeksonly.c
+++ b/libfprint/drivers/upeksonly.c
@@ -1380,7 +1380,6 @@ loopsm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
FpImageDevice *dev = FP_IMAGE_DEVICE (_dev);
FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (_dev);
- fpi_ssm_free (ssm);
if (self->deactivating)
{
@@ -1401,7 +1400,6 @@ initsm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
FpImageDevice *dev = FP_IMAGE_DEVICE (_dev);
FpiDeviceUpeksonly *self = FPI_DEVICE_UPEKSONLY (_dev);
- fpi_ssm_free (ssm);
fpi_image_device_activate_complete (dev, error);
if (error)
return;
diff --git a/libfprint/drivers/upektc.c b/libfprint/drivers/upektc.c
index ff5b49b..e1254ce 100644
--- a/libfprint/drivers/upektc.c
+++ b/libfprint/drivers/upektc.c
@@ -157,7 +157,6 @@ activate_sm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
if (!error)
start_finger_detection (dev);
- fpi_ssm_free (ssm);
}
@@ -345,7 +344,6 @@ capture_sm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
else
start_finger_detection (dev);
- fpi_ssm_free (ssm);
}
static void
diff --git a/libfprint/drivers/upektc_img.c b/libfprint/drivers/upektc_img.c
index 1e06b90..28a709f 100644
--- a/libfprint/drivers/upektc_img.c
+++ b/libfprint/drivers/upektc_img.c
@@ -389,7 +389,6 @@ capture_sm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error_arg)
g_autoptr(GError) error = error_arg;
- fpi_ssm_free (ssm);
/* Note: We assume that the error is a cancellation in the deactivation case */
if (self->deactivating)
@@ -470,7 +469,6 @@ deactivate_sm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (_dev);
fp_dbg ("Deactivate completed");
- fpi_ssm_free (ssm);
self->deactivating = FALSE;
fpi_image_device_deactivate_complete (dev, error);
@@ -601,7 +599,6 @@ activate_sm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
{
FpImageDevice *dev = FP_IMAGE_DEVICE (_dev);
- fpi_ssm_free (ssm);
fpi_image_device_activate_complete (dev, error);
if (!error)
diff --git a/libfprint/drivers/upekts.c b/libfprint/drivers/upekts.c
index b3481aa..4bc6556 100644
--- a/libfprint/drivers/upekts.c
+++ b/libfprint/drivers/upekts.c
@@ -990,7 +990,6 @@ enroll_stop_deinit_cb (FpiSsm *ssm, FpDevice *dev, GError *error)
fp_warn ("Error deinitializing: %s", error->message);
fpi_device_enroll_complete (dev, data->print, data->error);
- fpi_ssm_free (ssm);
}
static void
@@ -1217,7 +1216,6 @@ enroll_started (FpiSsm *ssm, FpDevice *dev, GError *error)
else
enroll_iterate (dev);
- fpi_ssm_free (ssm);
}
static void
@@ -1256,7 +1254,6 @@ verify_stop_deinit_cb (FpiSsm *ssm, FpDevice *dev, GError *error)
fp_warn ("Error deinitializing: %s", error->message);
fpi_device_verify_complete (dev, data->res, NULL, data->error);
- fpi_ssm_free (ssm);
}
static void
@@ -1540,7 +1537,6 @@ verify_started (FpiSsm *ssm, FpDevice *dev, GError *error)
upekdev->first_verify_iteration = TRUE;
verify_iterate (dev);
- fpi_ssm_free (ssm);
}
static void
diff --git a/libfprint/drivers/uru4000.c b/libfprint/drivers/uru4000.c
index f248411..89328d0 100644
--- a/libfprint/drivers/uru4000.c
+++ b/libfprint/drivers/uru4000.c
@@ -789,7 +789,6 @@ imaging_complete (FpiSsm *ssm, FpDevice *dev, GError *error)
{
FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev);
- fpi_ssm_free (ssm);
/* Report error before exiting imaging loop - the error handler
* can request state change, which needs to be postponed to end of
diff --git a/libfprint/drivers/vcom5s.c b/libfprint/drivers/vcom5s.c
index 0e10252..edd2dd4 100644
--- a/libfprint/drivers/vcom5s.c
+++ b/libfprint/drivers/vcom5s.c
@@ -301,7 +301,6 @@ loopsm_complete (FpiSsm *ssm, FpDevice *dev, GError *error)
FpImageDevice *imgdev = FP_IMAGE_DEVICE (dev);
FpDeviceVcom5s *self = FPI_DEVICE_VCOM5S (dev);
- fpi_ssm_free (ssm);
g_object_unref (self->capture_img);
self->capture_img = NULL;
self->loop_running = FALSE;
diff --git a/libfprint/drivers/vfs0050.c b/libfprint/drivers/vfs0050.c
index 4dc6782..1be272b 100644
--- a/libfprint/drivers/vfs0050.c
+++ b/libfprint/drivers/vfs0050.c
@@ -669,7 +669,6 @@ dev_activate_callback (FpiSsm *ssm, FpDevice *dev, GError *error)
g_error_free (error);
}
- fpi_ssm_free (ssm);
}
/* Activate device */
@@ -710,7 +709,6 @@ dev_open_callback (FpiSsm *ssm, FpDevice *dev, GError *error)
{
/* Notify open complete */
fpi_image_device_open_complete (FP_IMAGE_DEVICE (dev), error);
- fpi_ssm_free (ssm);
}
/* Open device */
diff --git a/libfprint/drivers/vfs101.c b/libfprint/drivers/vfs101.c
index 37e083c..9ca1b0a 100644
--- a/libfprint/drivers/vfs101.c
+++ b/libfprint/drivers/vfs101.c
@@ -960,7 +960,6 @@ m_loop_complete (FpiSsm *ssm, FpDevice *dev, GError *error)
self->active = FALSE;
- fpi_ssm_free (ssm);
}
/* Init ssm states */
@@ -1268,7 +1267,6 @@ m_init_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
}
/* Free sequential state machine */
- fpi_ssm_free (ssm);
}
/* Activate device */
diff --git a/libfprint/drivers/vfs301.c b/libfprint/drivers/vfs301.c
index 8fdac7c..7219792 100644
--- a/libfprint/drivers/vfs301.c
+++ b/libfprint/drivers/vfs301.c
@@ -168,7 +168,6 @@ m_loop_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
g_error_free (error);
}
/* Free sequential state machine */
- fpi_ssm_free (ssm);
}
/* Exec init sequential state machine */
@@ -201,7 +200,6 @@ m_init_complete (FpiSsm *ssm, FpDevice *dev, GError *error)
}
/* Free sequential state machine */
- fpi_ssm_free (ssm);
}
/* Activate device */
diff --git a/libfprint/drivers/vfs5011.c b/libfprint/drivers/vfs5011.c
index 9eddca7..007e486 100644
--- a/libfprint/drivers/vfs5011.c
+++ b/libfprint/drivers/vfs5011.c
@@ -745,7 +745,6 @@ activate_loop_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
submit_image (ssm, self, dev);
fpi_image_device_report_finger_status (dev, FALSE);
}
- fpi_ssm_free (ssm);
self->loop_running = FALSE;
@@ -793,7 +792,6 @@ open_loop_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
self->init_sequence.receive_buf = NULL;
fpi_image_device_open_complete (dev, error);
- fpi_ssm_free (ssm);
}
static void
diff --git a/libfprint/fpi-ssm.c b/libfprint/fpi-ssm.c
index 1569be8..a614860 100644
--- a/libfprint/fpi-ssm.c
+++ b/libfprint/fpi-ssm.c
@@ -51,6 +51,7 @@
*
* To start a ssm, you pass in a completion callback function to fpi_ssm_start()
* which gets called when the ssm completes (both on error and on failure).
+ * Starting a ssm also takes ownership of it.
*
* To iterate to the next state, call fpi_ssm_next_state(). It is legal to
* attempt to iterate beyond the final state - this is equivalent to marking
@@ -58,6 +59,7 @@
*
* To mark successful completion of a SSM, either iterate beyond the final
* state or call fpi_ssm_mark_completed() from any state.
+ * This will also invalidate the machine, freeing it.
*
* To mark failed completion of a SSM, call fpi_ssm_mark_failed() from any
* state. You must pass a non-zero error code.
@@ -125,7 +127,6 @@ fpi_ssm_new (FpDevice *dev,
* @ssm_data_destroy: (nullable): #GDestroyNotify for @ssm_data
*
* Sets @machine's data (freeing the existing data, if any).
- *
*/
void
fpi_ssm_set_data (FpiSsm *machine,
@@ -182,12 +183,16 @@ __ssm_call_handler (FpiSsm *machine)
/**
* fpi_ssm_start:
- * @ssm: an #FpiSsm state machine
+ * @ssm: (transfer full): an #FpiSsm state machine
* @callback: the #FpiSsmCompletedCallback callback to call on completion
*
* Starts a state machine. You can also use this function to restart
* a completed or failed state machine. The @callback will be called
* on completion.
+ *
+ * Note that @ssm will be stolen when this function is called.
+ * So that all associated data will be free'ed automatically, after the
+ * @callback is ran.
*/
void
fpi_ssm_start (FpiSsm *ssm, FpiSsmCompletedCallback callback)
@@ -210,7 +215,6 @@ __subsm_complete (FpiSsm *ssm, FpDevice *_dev, GError *error)
fpi_ssm_mark_failed (parent, error);
else
fpi_ssm_next_state (parent);
- fpi_ssm_free (ssm);
}
/**
@@ -253,6 +257,7 @@ fpi_ssm_mark_completed (FpiSsm *machine)
machine->callback (machine, machine->dev, error);
}
+ fpi_ssm_free (machine);
}
/**
@@ -260,7 +265,7 @@ fpi_ssm_mark_completed (FpiSsm *machine)
* @machine: an #FpiSsm state machine
* @error: a #GError
*
- * Mark a state machine as failed with @error as the error code.
+ * Mark a state machine as failed with @error as the error code, completing it.
*/
void
fpi_ssm_mark_failed (FpiSsm *machine, GError *error)
@@ -305,6 +310,8 @@ fpi_ssm_next_state (FpiSsm *machine)
* @state: the state to jump to
*
* Jump to the @state state, bypassing intermediary states.
+ * If @state is the last state, the machine won't be completed unless
+ * fpi_ssm_mark_completed() isn't explicitly called.
*/
void
fpi_ssm_jump_to_state (FpiSsm *machine, int state)
--
2.24.1