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