gst/: Since remove is virtual in GstBin we must not assume the elements GList to have anothing usefull.

Original commit message from CVS:
* gst/gstbin.c: (gst_bin_remove), (gst_bin_dispose):
* gst/gstthread.c: (gst_thread_dispose), (gst_thread_catch),
(gst_thread_main_loop):
Since remove is virtual in GstBin we must not assume the
elements GList to have anothing usefull.
Add some more logging to GstThread and be a bit more paranoid
when resetting the scheduler.
Set the state of the bin to NULL before removing the children.
This commit is contained in:
Wim Taymans 2004-07-09 15:03:51 +00:00
parent becad99a95
commit 31b478533c
3 changed files with 20 additions and 4 deletions

View file

@ -1,3 +1,14 @@
2004-07-09 Wim Taymans <wim@fluendo.com>
* gst/gstbin.c: (gst_bin_remove), (gst_bin_dispose):
* gst/gstthread.c: (gst_thread_dispose), (gst_thread_catch),
(gst_thread_main_loop):
Since remove is virtual in GstBin we must not assume the
elements GList to have anothing usefull.
Add some more logging to GstThread and be a bit more paranoid
when resetting the scheduler.
Set the state of the bin to NULL before removing the children.
2004-07-09 Zaheer Abbas Merali <zaheerabbas at merali dot org> 2004-07-09 Zaheer Abbas Merali <zaheerabbas at merali dot org>
* testsuite/threads/Makefile.am: * testsuite/threads/Makefile.am:

View file

@ -588,7 +588,6 @@ gst_bin_remove (GstBin * bin, GstElement * element)
g_return_if_fail (GST_IS_BIN (bin)); g_return_if_fail (GST_IS_BIN (bin));
g_return_if_fail (GST_IS_ELEMENT (element)); g_return_if_fail (GST_IS_ELEMENT (element));
g_return_if_fail (bin->children != NULL);
bclass = GST_BIN_GET_CLASS (bin); bclass = GST_BIN_GET_CLASS (bin);
@ -833,8 +832,7 @@ gst_bin_dispose (GObject * object)
GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, object, "dispose"); GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, object, "dispose");
if (gst_element_get_state (GST_ELEMENT (object)) == GST_STATE_PLAYING) gst_element_set_state (GST_ELEMENT (object), GST_STATE_NULL);
gst_element_set_state (GST_ELEMENT (object), GST_STATE_PAUSED);
while (bin->children) { while (bin->children) {
gst_bin_remove (bin, GST_ELEMENT (bin->children->data)); gst_bin_remove (bin, GST_ELEMENT (bin->children->data));

View file

@ -223,6 +223,8 @@ gst_thread_dispose (GObject * object)
g_assert (GST_STATE (thread) == GST_STATE_NULL); g_assert (GST_STATE (thread) == GST_STATE_NULL);
GST_CAT_DEBUG (GST_CAT_REFCOUNTING, "GstThread: dispose, freeing locks");
g_mutex_free (thread->lock); g_mutex_free (thread->lock);
g_cond_free (thread->cond); g_cond_free (thread->cond);
@ -369,12 +371,14 @@ gst_thread_catch (GstThread * thread)
if (thread == gst_thread_get_current ()) { if (thread == gst_thread_get_current ()) {
/* we're trying to catch ourself */ /* we're trying to catch ourself */
if (!GST_FLAG_IS_SET (thread, GST_THREAD_MUTEX_LOCKED)) { if (!GST_FLAG_IS_SET (thread, GST_THREAD_MUTEX_LOCKED)) {
GST_DEBUG_OBJECT (thread, "catching itself, grabbing lock");
g_mutex_lock (thread->lock); g_mutex_lock (thread->lock);
GST_FLAG_SET (thread, GST_THREAD_MUTEX_LOCKED); GST_FLAG_SET (thread, GST_THREAD_MUTEX_LOCKED);
} }
GST_DEBUG_OBJECT (thread, "catching itself"); GST_DEBUG_OBJECT (thread, "catching itself");
GST_FLAG_UNSET (thread, GST_THREAD_STATE_SPINNING); GST_FLAG_UNSET (thread, GST_THREAD_STATE_SPINNING);
} else { } else {
GST_DEBUG_OBJECT (thread, "catching thread, grabbing lock");
/* another thread is trying to catch us */ /* another thread is trying to catch us */
g_mutex_lock (thread->lock); g_mutex_lock (thread->lock);
wait = !GST_FLAG_IS_SET (thread, GST_THREAD_STATE_SPINNING); wait = !GST_FLAG_IS_SET (thread, GST_THREAD_STATE_SPINNING);
@ -555,6 +559,7 @@ gst_thread_main_loop (void *arg)
{ {
GstThread *thread = NULL; GstThread *thread = NULL;
gboolean status; gboolean status;
GstScheduler *sched;
thread = GST_THREAD (arg); thread = GST_THREAD (arg);
g_mutex_lock (thread->lock); g_mutex_lock (thread->lock);
@ -595,7 +600,9 @@ gst_thread_main_loop (void *arg)
/* we need to destroy the scheduler here because it has mapped it's /* we need to destroy the scheduler here because it has mapped it's
* stack into the threads stack space */ * stack into the threads stack space */
gst_scheduler_reset (GST_ELEMENT_SCHED (thread)); sched = GST_ELEMENT_SCHED (thread);
if (sched)
gst_scheduler_reset (sched);
/* must do that before releasing the lock - we might get disposed before being done */ /* must do that before releasing the lock - we might get disposed before being done */
g_signal_emit (G_OBJECT (thread), gst_thread_signals[SHUTDOWN], 0); g_signal_emit (G_OBJECT (thread), gst_thread_signals[SHUTDOWN], 0);