From c7630833dfa55f336d9f4813f5481d27a112d43a Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 8 Jun 2020 14:01:49 -0400 Subject: [PATCH] scenario: Fix waiting for signal The signal callback signature was just wrong and not generic leading to crash if waiting for any signal that didn't match it. This commit fixes it. Part-of: --- validate/gst/validate/gst-validate-scenario.c | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/validate/gst/validate/gst-validate-scenario.c b/validate/gst/validate/gst-validate-scenario.c index 9c9e7bf941..fb082c1539 100644 --- a/validate/gst/validate/gst-validate-scenario.c +++ b/validate/gst/validate/gst-validate-scenario.c @@ -2484,21 +2484,28 @@ static GstElement *_get_target_element (GstValidateScenario * scenario, GstValidateAction * action); static void -stop_waiting_signal (GstBin * bin, GstElement * element, - GstValidateAction * action) +stop_waiting_signal (GstStructure * data) { - GstValidateScenario *scenario = gst_validate_action_get_scenario (action); - GstValidateScenarioPrivate *priv = scenario->priv; + GstElement *target; + GstValidateAction *action; + GstValidateScenario *scenario; + + gst_structure_get (data, "target", G_TYPE_POINTER, &target, + "action", G_TYPE_POINTER, &action, NULL); + gst_structure_free (data); + + scenario = gst_validate_action_get_scenario (action); g_assert (scenario); gst_validate_printf (scenario, "Stop waiting for signal\n"); - g_signal_handler_disconnect (bin, priv->signal_handler_id); + g_signal_handler_disconnect (target, scenario->priv->signal_handler_id); - priv->signal_handler_id = 0; + scenario->priv->signal_handler_id = 0; gst_validate_action_set_done (action); _add_execute_actions_gsource (scenario); gst_object_unref (scenario); + gst_object_unref (target); } static GstValidateExecuteActionReturn @@ -2581,10 +2588,10 @@ _execute_wait_for_signal (GstValidateScenario * scenario, } priv->signal_handler_id = - g_signal_connect (target, signal_name, (GCallback) stop_waiting_signal, - action); + g_signal_connect_swapped (target, signal_name, + (GCallback) stop_waiting_signal, gst_structure_new ("a", "action", + G_TYPE_POINTER, action, "target", G_TYPE_POINTER, target, NULL)); - gst_object_unref (target); gst_object_unref (pipeline); return GST_VALIDATE_EXECUTE_ACTION_ASYNC;