<div dir="ltr">Problem solved. Thanks all.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jan 25, 2013 at 7:21 PM, Duzy Chan <span dir="ltr"><<a href="mailto:geek@duzy.info" target="_blank">geek@duzy.info</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">And here are some CRITICAL warnings:<div><br></div><div><div>  GStreamer-CRITICAL **: gst_poll_get_read_gpollfd: assertion `set != NULL' failed</div>

<div>  GStreamer-CRITICAL **: gst_bus_create_watch: assertion `bus->priv->poll != NULL' failed<br>
</div><div>  GLib-CRITICAL **: g_source_set_callback: assertion `source != NULL' failed<br></div></div><div><br></div><div><br></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">

On Fri, Jan 25, 2013 at 7:09 PM, Duzy Chan <span dir="ltr"><<a href="mailto:geek@duzy.info" target="_blank">geek@duzy.info</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">The worker in this case is wrapping a pipeline and watching the bus of the pipeline. And the crash was happened while creating the worker and preparing for further usage.<div>


<br></div><div>While repeatedly creating many workers and each worker may exist only for a short time (maybe less than 1 second), and then be stopped (gst_element_set_state to null state), and then unref (including the pipeline). After repeat for a while, the problem occurs.</div>



</div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jan 25, 2013 at 5:44 PM, Duzy Chan <span dir="ltr"><<a href="mailto:geek@duzy.info" target="_blank">geek@duzy.info</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">Greeting, all<div><br></div><div>I'm currently working on a app. But I'm now confronting a crash while repeatedly creating a pipeline very quickly. And I found that it was caused by a gst_bus_add_watch (<a href="http://pastebin.com/b2DVmHnQ" target="_blank">http://pastebin.com/b2DVmHnQ</a>). The code in <b><font color="#000000">gst_bus_add_watch_full_unlocked</font></b> was trying to creating a new GSource by calling <b>gst_bus_create_watch</b>, yet it turned out a NULL source. This is the final end point of the cause. And the code in <i>gstbus.c</i> looks like this:</div>




<blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><font color="#666666">static guint</font></div></div><div><div><font color="#666666"><b>gst_bus_add_watch_full_unlocked</b> (GstBus * bus, gint priority,</font></div>




</div><div><div><font color="#666666">    GstBusFunc func, gpointer user_data, GDestroyNotify notify)</font></div></div><div><div><font color="#666666">{</font></div></div><div><div><font color="#666666">  GMainContext *ctx;</font></div>




</div><div><div><font color="#666666">  guint id;</font></div></div><div><div><font color="#666666">  GSource *source;</font></div></div><div><div><font color="#666666"><br></font></div>
</div><div><div><font color="#666666">  if (bus->priv->watch_id) {</font></div></div><div><div><font color="#666666">    GST_ERROR_OBJECT (bus,</font></div></div><div><div><font color="#666666">        "Tried to add new watch while one was already there");</font></div>




</div><div><div><font color="#666666">    return 0;</font></div></div><div><div><font color="#666666">  }</font></div></div><div><div><font color="#666666"><br></font></div></div><div>
<div><font color="#666666">  <b>source</b> = </font><b><font color="#444444">gst_bus_create_watch</font></b><font color="#666666"> (bus);</font></div></div><div><div><font color="#666666"><br></font></div>
</div><div><div><font color="#666666">  if (priority != G_PRIORITY_DEFAULT)</font></div></div><div><div><font color="#666666">    g_source_set_priority (<b>source</b>, priority);</font></div></div>
<div><div><font color="#666666"><br></font></div></div><div><div><font color="#666666">  g_source_set_callback (<b>source</b>, (GSourceFunc) func, user_data, notify);</font></div></div><div><div>
<font color="#666666"><br></font></div></div><div><div><font color="#666666">  ctx = g_main_context_get_thread_default ();</font></div></div><div><div><font color="#666666">  id = g_source_attach (source, ctx);</font></div>




</div><div><div><font color="#666666">  g_source_unref (source);</font></div></div><div><div><font color="#666666"><br></font></div></div><div><div><font color="#666666">  if (id) {</font></div>
</div><div><div><font color="#666666">    bus->priv->watch_id = source;</font></div></div><div><div><font color="#666666">  }</font></div></div><div><div><font color="#666666"><br>
</font></div></div><div><div><font color="#666666">  GST_DEBUG_OBJECT (bus, "New source %p with id %u", source, id);</font></div></div><div><div><font color="#666666">  return id;</font></div>
</div><div><div><font color="#666666">}</font></div></div></blockquote><div><br></div><div>And the client code from my app looks like this:</div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">
<div><div><font color="#666666">  worker->pipeline = workerclass->create_pipeline (worker);</font></div></div><div><div><font color="#666666">  if (!worker->pipeline)</font></div></div><div>
<div><font color="#666666">    goto error_create_pipeline;</font></div></div><div><div><font color="#666666"><br></font></div></div><div><div><font color="#666666">  gst_pipeline_set_auto_flush_bus (GST_PIPELINE (worker->pipeline), FALSE);</font></div>




</div><div><div><font color="#666666"><br></font></div></div><div><div><font color="#666666">  worker->bus = gst_pipeline_get_bus (GST_PIPELINE (worker->pipeline));</font></div></div><div>
<div><font color="#666666">  worker->watch = <b>gst_bus_add_watch</b> (worker->bus, gst_worker_message, worker);</font></div></div></blockquote><div><div><br></div></div><div>Part of the stack when it crashed is like this:</div>




<blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><font color="#666666">#0  0x00007ffff728ef56 in </font><font color="#444444"><b>g_source_attach</b></font><font color="#666666"> () from /lib/x86_64-linux-gnu/libglib-2.0.so.0</font></div>




</div><div><div><font color="#666666">#1  0x00007ffff7b1e228 in </font><b><font color="#444444">gst_bus_add_watch_full_unlocked</font></b><font color="#666666"> (notify=<optimized out>, user_data=0x7fffc801a0c0, func=0x403d50 <gst_worker_message>, priority=<optimized out>, bus=<optimized out>) at gstbus.c:867</font></div>




</div><div><div><font color="#666666">#2  gst_bus_add_watch_full_unlocked (bus=<optimized out>, priority=<optimized out>, func=0x403d50 <gst_worker_message>, user_data=0x7fffc801a0c0, notify=<optimized out>) at gstbus.c:846</font></div>




</div><div><div><font color="#666666">#3  0x00007ffff7b1e367 in gst_bus_add_watch_full (bus=0x991c10, priority=priority@entry=0, func=func@entry=0x403d50 <gst_worker_message>, user_data=user_data@entry=0x7fffc801a0c0, notify=notify@entry=0x0) at gstbus.c:916</font></div>




</div><div><div><font color="#666666">#4  0x00007ffff7b1e390 in </font><b><font color="#444444">gst_bus_add_watch</font></b><font color="#666666"> (bus=<optimized out>, func=func@entry=0x403d50 <gst_worker_message>, user_data=user_data@entry=0x7fffc801a0c0) at gstbus.c:948</font></div>




</div><div><div><font color="#666666">#5  0x00000000004041b1 in gst_worker_prepare (worker=0x7fffc801a0c0) at gstworker.c:480</font></div></div></blockquote><div><div><br></div><div>Do you have any ideas about this? I've been tracking on it for long time, still have no lucks.</div>




<div><br></div><div>Regards</div><span><font color="#888888"><div>Duzy Chan</div></font></span></div><div><br></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>