<div dir="ltr"><div>Hi,</div><div><br></div><div>I'm using gst-python 0.10.22 and gstreamer 0.10.36 (unfortunately, at this time I can not upgrade to the 1.x branch). I have a python program that creates a pipeline, in which it serves video via rtsp.</div>

<div><br></div><div>Everything works correctly if I let it stream on its own, but it can deadlock very easily under the following situation.</div><div><br></div><div>Thread 1:</div><div>--------------</div><div>At the request of the rtsp client, the rtsp server may decide to change some parameters on its pipeline elements, all while the video is PLAYING. Part of that process involves calling:</div>

<div>my_pipeline.get_by_name("my_videocrop")</div><div><br></div><div>Internally, get_by_name() will try to temporarily acquire the pipeline->lock mutex. This action is originated in python code, so thread 1 has the GIL while get_by_name() tries to acquire the pipeline lock.</div>

<div><br></div><div><br></div><div>Thread 2:</div><div>--------------</div><div>On the otherhand, during PLAYING state, a gstreamer C thread will be calling several gst_pad_push() functions throughout the pipeline elements.</div>

<div><br></div><div>In my case, this long chain of function calls arrives at a call to:</div><div>gst_pad_set_caps()</div><div>then (after a few calls): gst_object_dispatch_properties_changed()</div><div>then (again after a few calls): gst_object_get_parent()</div>

<div>Inside this last function, the aforementioned pipeline->lock mutex is succesfully acquired.</div><div>Shortly after that, pyg_toggle_notify() is called, which tries to acquire the GIL lock in order to modify a python object reference count.</div>

<div><br></div><div><br></div><div>So there we have the deadlock:</div><div> - Thread 1 already has the GIL, and tries to acquire the pipeline lock in order to finish get_by_name().</div><div> - Thread 2 already has the pipeline lock, and tries to acquire the GIL in order to Py_INCREF() or Py_DECREF().</div>

<div><br></div><div><br></div><div>From what I understand, this means that get_by_name() should never be called by python code while the pipeline is running.</div><div>Does this happen by design? I.e. should I always set the pipeline to PAUSE or NULL before searching for its elements by name, or use some other workaround?</div>

<div>Or is it a bug in my code, and Thread 2 should never need to modify any reference count?</div><div><br></div><div><br></div><div>Any help is much appreciated. Thanks!</div><div><div><br>-- <br>Regards/Saludos,<br>     Bruno Gonzalez<br>

<br><a href="http://www.stenyak.com" target="_blank">http://www.stenyak.com</a> | stenyak @ irc://<a href="http://irc.freenode.net" target="_blank">irc.freenode.net</a></div>
</div></div>