[vlc-devel] commit: Fixed input_StopThread by really killing all input children (even ( Laurent Aimar )
git version control
git at videolan.org
Sat Jul 5 13:32:34 CEST 2008
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Sat Jul 5 11:33:53 2008 +0000| [d10dffca3516b7650fa79c94947bfd18ac6a6fa0]
Fixed input_StopThread by really killing all input children (even
grandchildren)
It fixes when access-filter is used or when a demuxer instanciates sub
access/stream/demuxer
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d10dffca3516b7650fa79c94947bfd18ac6a6fa0
---
src/input/input.c | 34 ++++++++++++++++------------------
1 files changed, 16 insertions(+), 18 deletions(-)
diff --git a/src/input/input.c b/src/input/input.c
index 90ce56a..d0295b5 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -434,23 +434,26 @@ int __input_Preparse( vlc_object_t *p_parent, input_item_t *p_item )
*
* \param the input thread to stop
*/
-void input_StopThread( input_thread_t *p_input )
+static void ObjectKillChildrens( vlc_object_t *p_obj )
{
vlc_list_t *p_list;
int i;
+ vlc_object_kill( p_obj );
- /* Set die for input */
- vlc_object_kill( p_input );
- /* FIXME: seems to be duplicated in ControlPush(INPUT_CONTROL_SET_DIE) */
-
- /* We cannot touch p_input fields directly (we come from another thread),
- * so use the vlc_object_find way, it's perfectly safe */
-
- /* Set die for all access, stream, demux, etc */
- p_list = vlc_list_children( p_input );
+ p_list = vlc_list_children( p_obj );
for( i = 0; i < p_list->i_count; i++ )
- vlc_object_kill( p_list->p_values[i].p_object );
+ ObjectKillChildrens( p_list->p_values[i].p_object );
vlc_list_release( p_list );
+}
+void input_StopThread( input_thread_t *p_input )
+{
+ vlc_list_t *p_list;
+ int i;
+
+ /* Set die for input and ALL of this childrens (even (grand-)grand-childrens)
+ * It is needed here even if it is done in INPUT_CONTROL_SET_DIE handler to
+ * unlock the control loop */
+ ObjectKillChildrens( VLC_OBJECT(p_input) );
input_ControlPush( p_input, INPUT_CONTROL_SET_DIE, NULL );
}
@@ -1425,14 +1428,9 @@ static bool Control( input_thread_t *p_input, int i_type,
{
case INPUT_CONTROL_SET_DIE:
msg_Dbg( p_input, "control: stopping input" );
- /* Mark all submodules to die */
- if( p_input->p->input.p_access )
- vlc_object_kill( p_input->p->input.p_access );
- if( p_input->p->input.p_stream )
- vlc_object_kill( p_input->p->input.p_stream );
- vlc_object_kill( p_input->p->input.p_demux );
- vlc_object_kill( p_input );
+ /* Mark all submodules to die */
+ ObjectKillChildrens( p_input );
break;
case INPUT_CONTROL_SET_POSITION:
More information about the vlc-devel
mailing list