<div dir="ltr">Thanks, Tim!<div><br></div><div>Imagine your code is a part of a bigger loop (as I said):</div><div><br></div><div>for (;;) {</div><div><span style="font-family:arial,sans-serif;font-size:13.333333969116211px">  msg = gst_bus_timed_pop_filtered(...</span><span style="font-family:arial,sans-serif;font-size:13.333333969116211px">)</span><br style="font-family:arial,sans-serif;font-size:13.333333969116211px">
<span style="font-family:arial,sans-serif;font-size:13.333333969116211px">  while (msg) {</span><br style="font-family:arial,sans-serif;font-size:13.333333969116211px"><span style="font-family:arial,sans-serif;font-size:13.333333969116211px">    handle_message (msg);</span><br style="font-family:arial,sans-serif;font-size:13.333333969116211px">
<span style="font-family:arial,sans-serif;font-size:13.333333969116211px">    gst_message_unref (msg);</span><br style="font-family:arial,sans-serif;font-size:13.333333969116211px"><span style="font-family:arial,sans-serif;font-size:13.333333969116211px">    msg = gst_bus_pop (bus);</span><br>
</div><div><span style="font-family:arial,sans-serif;font-size:13.333333969116211px">  }</span></div><div>}</div><div><br></div><div>Suppose while you are handling msg in the while loop the other thread posts a message on the bus. It turns out that this message is not expected nor handled (the blocking msg = <span style="font-family:arial,sans-serif;font-size:13.333333969116211px"> </span><span style="font-family:arial,sans-serif;font-size:13.333333969116211px">gst_bus_timed_pop_filtered is not active</span>). [This is bad, especially in real-time applications.]</div>
<div><br></div><div>How could I figure in the other thread that the message is being expected, i.e., stays in the blocking <span style="font-size:13.333333969116211px;font-family:arial,sans-serif">msg = gst_bus_timed_pop_filtered(...</span><span style="font-size:13.333333969116211px;font-family:arial,sans-serif">)?</span></div>
<div><br></div><div>Of course, this is a general synchronization problem, but I though GStreamer had special APIs or idioms for this common problem. This would be possible, if, e.g.,  <span style="font-family:arial,sans-serif;font-size:13.333333969116211px">gst_bus_post (bus, ...) returned more meaningful (than just boolean) return codes.</span></div>
<div><span style="font-family:arial,sans-serif;font-size:13.333333969116211px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13.333333969116211px">I suggested surrounding by flush OFF/ON since this (almost) allows the other thread to check whether its posting is expected or not (by boolean result), and repeat (and/or taking other actions) until it is.</span></div>
<div><span style="font-family:arial,sans-serif;font-size:13.333333969116211px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13.333333969116211px">BTW, if you post a message on the bus no one is listening to, does it disappear or remains until someone starts to listen for this kind of messages on the bus?</span></div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jun 13, 2014 at 2:15 PM, Tim Müller <span dir="ltr"><<a href="mailto:tim@centricular.com" target="_blank">tim@centricular.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Fri, 2014-06-13 at 13:47 +0200, Sergei Vorobyov wrote:<br>
<br>
Hi Sergei,<br>
<div><div class="h5"><br>
> Sorry for a simple question, I could do it by using mutexes, of<br>
> course, but maybe there is a canonical way of doing it using the<br>
> GStreamer APIs?<br>
><br>
><br>
> The problem is this.<br>
><br>
><br>
> 1. In one thread, periodically, in the loop, I am waiting for a<br>
> message on the bus:<br>
><br>
><br>
> msg = gst_bus_timed_pop_filtered (bus, duration,<br>
><br>
> (GstMessageType)(GST_MESSAGE_EOS |<br>
><br>
>  GST_MESSAGE_SEGMENT_DONE |<br>
><br>
>  GST_MESSAGE_ERROR |<br>
><br>
>  GST_MESSAGE_APPLICATION));<br>
><br>
><br>
> and this waiting occupies only part of the whole loop:<br>
><br>
><br>
> for(;;) {<br>
>   // do smth else...<br>
><br>
><br>
>   msg = gst_bus_timed_pop_filtered...<br>
><br>
><br>
>   // do smth else ...<br>
> }<br>
><br>
><br>
> In the other thread I am posting (using the GStreamer's gift):<br>
><br>
><br>
> gst_bus_post (bus, gst_message_new_application (NULL, NULL));<br>
><br>
><br>
><br>
> But how can I make sure, before posting, that it is being expected<br>
> (and received) by the blocking<br>
><br>
><br>
> msg = gst_bus_timed_pop_filtered... in the other thread,<br>
><br>
><br>
><br>
> and not consumed by the loop doing smth else?<br>
><br>
><br>
> Actually, the boolean TRUE returned by gst_bus_post does not guarantee<br>
> that the posting was expected and received.<br>
><br>
><br>
> One might naively think that the following is a solution (simply<br>
> surround with gst_bus_set_flushing):<br>
><br>
><br>
> for(;;) {<br>
>   // do smth else...<br>
><br>
><br>
>   gst_bus_set_flushing (bus, FALSE);<br>
>   msg = gst_bus_timed_pop_filtered...<br>
>   gst_bus_set_flushing (bus, TRUE);<br>
><br>
><br>
>   // do smth else ...<br>
> }<br>
><br>
><br>
> However, it isn't. Imagine gst_bus_timed_pop_filtered returns because<br>
> duration expired, but before the next gst_bus_set_flushing (bus, TRUE)<br>
> the other thread makes gst_bus_post (bus, gst_message_new_application<br>
> (NULL, NULL)). Then this posting is acknowledged (returns TRUE) but<br>
> the message is actually flushed.<br>
><br>
><br>
> Some real acknowledge mechanism is desired. Does it exist in the<br>
> GStreamer API?<br>
<br>
</div></div>It's not entirely clear to me what you're trying to achieve, if you want<br>
to make sure in your element that the message was actually processed<br>
(and maybe block until then), or if you're having trouble picking up the<br>
message in your other thread.<br>
<br>
In you sample code you would probably want to do something like:<br>
<br>
  msg = gst_bus_timed_pop_filtered(...)<br>
  while (msg) {<br>
    handle_message (msg);<br>
    gst_message_unref (msg);<br>
    msg = gst_bus_pop (bus);<br>
  }<br>
<br>
to make sure that if there's a message you get all pending messages off<br>
in one go before you do something else.<br>
<br>
Flushing the bus is a bit weird IMHO and should probably only be done in<br>
special circumstances.<br>
<br>
 Cheers<br>
<span class="HOEnZb"><font color="#888888">  -Tim<br>
<br>
--<br>
Tim Müller, Centricular Ltd - <a href="http://www.centricular.com" target="_blank">http://www.centricular.com</a><br>
<br>
_______________________________________________<br>
gstreamer-devel mailing list<br>
<a href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a><br>
</font></span></blockquote></div><br></div>