1From 84fd8c8948c03f2f28215b31b925cdcaad79c686 Mon Sep 17 00:00:00 2001
2From: Jeffy Chen <jeffy.chen@rock-chips.com>
3Date: Mon, 29 Nov 2021 14:49:25 +0800
4Subject: [PATCH 2/4] HACK: gstpad: Add 1 sec timeout for activation
5
6When using ghost pad, changing the activation mode might cause
7recursive waiting and hang the pipeline.
8
9It's hard to fix it without bring in new issues, let's just add a
10timeout as a workaround.
11
12Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
13---
14 gst/gstpad.c | 22 ++++++++++++++++++++++
15 1 file changed, 22 insertions(+)
16
17diff --git a/gst/gstpad.c b/gst/gstpad.c
18index db98933..2982d10 100644
19--- a/gst/gstpad.c
20+++ b/gst/gstpad.c
21@@ -969,6 +969,18 @@ gst_pad_mode_get_name (GstPadMode mode)
22   return "unknown";
23 }
24
25+static inline void
26+wait_activation_locked (GstPad * pad)
27+{
28+  /* HACK: 1 sec timeout for activation */
29+  for (gint i = 0; i < 1000; i++) {
30+    if (G_LIKELY (!pad->priv->in_activation))
31+      break;
32+
33+    g_usleep(1000);
34+  }
35+}
36+
37 /* Returns TRUE if pad wasn't already in the new_mode */
38 static gboolean
39 pre_activate (GstPad * pad, GstPadMode new_mode)
40@@ -976,8 +988,13 @@ pre_activate (GstPad * pad, GstPadMode new_mode)
41   switch (new_mode) {
42     case GST_PAD_MODE_NONE:
43       GST_OBJECT_LOCK (pad);
44+#if 0
45       while (G_UNLIKELY (pad->priv->in_activation))
46         g_cond_wait (&pad->priv->activation_cond, GST_OBJECT_GET_LOCK (pad));
47+#else
48+      if (G_UNLIKELY (pad->priv->in_activation))
49+        wait_activation_locked (pad);
50+#endif
51       if (new_mode == GST_PAD_MODE (pad)) {
52         GST_WARNING_OBJECT (pad,
53             "Pad is already in the process of being deactivated");
54@@ -996,8 +1013,13 @@ pre_activate (GstPad * pad, GstPadMode new_mode)
55     case GST_PAD_MODE_PUSH:
56     case GST_PAD_MODE_PULL:
57       GST_OBJECT_LOCK (pad);
58+#if 0
59       while (G_UNLIKELY (pad->priv->in_activation))
60         g_cond_wait (&pad->priv->activation_cond, GST_OBJECT_GET_LOCK (pad));
61+#else
62+      if (G_UNLIKELY (pad->priv->in_activation))
63+        wait_activation_locked (pad);
64+#endif
65       if (new_mode == GST_PAD_MODE (pad)) {
66         GST_WARNING_OBJECT (pad,
67             "Pad is already in the process of being activated");
68--
692.20.1
70
71