From f7fa395ea9d0d8d3d57fe6bd90a549bc469006f3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Tue, 17 Nov 2009 21:32:30 +0200 Subject: [PATCH] RTMP: use new thread API, remove bogus uses of b_die and FifoWake --- modules/access/rtmp/access.c | 31 ++++++++++++++---------------- modules/access/rtmp/rtmp_amf_flv.c | 3 +-- modules/access/rtmp/rtmp_amf_flv.h | 1 + modules/access_output/rtmp.c | 27 +++++++++++++------------- 4 files changed, 29 insertions(+), 33 deletions(-) diff --git a/modules/access/rtmp/access.c b/modules/access/rtmp/access.c index e91c3c0088..24df9a4663 100644 --- a/modules/access/rtmp/access.c +++ b/modules/access/rtmp/access.c @@ -84,7 +84,7 @@ static ssize_t Read( access_t *, uint8_t *, size_t ); static int Seek( access_t *, int64_t ); static int Control( access_t *, int, va_list ); -static void* ThreadControl( vlc_object_t * ); +static void* ThreadControl( void * ); /***************************************************************************** * Open: open the rtmp connection @@ -149,7 +149,6 @@ static int Open( vlc_object_t *p_this ) } /* Initialize thread variables */ - p_sys->p_thread->b_die = 0; p_sys->p_thread->b_error= 0; p_sys->p_thread->p_fifo_input = block_FifoNew(); p_sys->p_thread->p_empty_blocks = block_FifoNew(); @@ -227,8 +226,8 @@ static int Open( vlc_object_t *p_this ) p_sys->p_thread->result_publish = 0; } - if( vlc_thread_create( p_sys->p_thread, "rtmp control thread", ThreadControl, - VLC_THREAD_PRIORITY_INPUT ) ) + if( vlc_clone( &p_sys->p_thread->thread, ThreadControl, p_sys->p_thread, + VLC_THREAD_PRIORITY_INPUT ) ) { msg_Err( p_access, "cannot spawn rtmp control thread" ); goto error2; @@ -240,9 +239,8 @@ static int Open( vlc_object_t *p_this ) { msg_Err( p_access, "connect active failed"); /* Kill the running thread */ - vlc_object_kill( p_sys->p_thread ); - block_FifoWake( p_sys->p_thread->p_fifo_input ); - vlc_thread_join( p_sys->p_thread ); + vlc_cancel( p_sys->p_thread->thread ); + vlc_join( p_sys->p_thread->thread, NULL ); goto error2; } } @@ -289,11 +287,8 @@ static void Close( vlc_object_t * p_this ) access_sys_t *p_sys = p_access->p_sys; int i; -/* p_sys->p_thread->b_die = true;*/ - vlc_object_kill( p_sys->p_thread ); - block_FifoWake( p_sys->p_thread->p_fifo_input ); - - vlc_thread_join( p_sys->p_thread ); + vlc_cancel( p_sys->p_thread->thread ); + vlc_join( p_sys->p_thread->thread, NULL ); vlc_cond_destroy( &p_sys->p_thread->wait ); vlc_mutex_destroy( &p_sys->p_thread->lock ); @@ -521,17 +516,19 @@ static int Control( access_t *p_access, int i_query, va_list args ) /***************************************************************************** * ThreadControl: manage control messages and pipe media to Read *****************************************************************************/ -static void* ThreadControl( vlc_object_t *p_this ) +static void* ThreadControl( void *p_this ) { - rtmp_control_thread_t *p_thread = (rtmp_control_thread_t *) p_this; + rtmp_control_thread_t *p_thread = p_this; rtmp_packet_t *rtmp_packet; int canc = vlc_savecancel (); rtmp_init_handler( p_thread->rtmp_handler ); - while( vlc_object_alive (p_thread) ) + for( ;; ) { + vlc_restorecancel( canc ); rtmp_packet = rtmp_read_net_packet( p_thread ); + canc = vlc_savecancel( ); if( rtmp_packet != NULL ) { if( rtmp_packet->content_type < 0x01 /* RTMP_CONTENT_TYPE_CHUNK_SIZE */ @@ -557,10 +554,10 @@ static void* ThreadControl( vlc_object_t *p_this ) vlc_mutex_unlock( &p_thread->lock ); } - p_thread->b_die = 1; +#warning info cannot be accessed outside input thread! ((access_t *) p_thread->p_base_object)->info.b_eof = true; - block_FifoWake( p_thread->p_fifo_input ); + break; } } vlc_restorecancel (canc); diff --git a/modules/access/rtmp/rtmp_amf_flv.c b/modules/access/rtmp/rtmp_amf_flv.c index bf2b83b7f0..374baba4b7 100644 --- a/modules/access/rtmp/rtmp_amf_flv.c +++ b/modules/access/rtmp/rtmp_amf_flv.c @@ -878,6 +878,7 @@ rtmp_build_flv_over_rtmp( rtmp_control_thread_t *p_thread, block_t *p_buffer ) return rtmp_packet; } +/* This function must be cancellation-safe! */ rtmp_packet_t * rtmp_read_net_packet( rtmp_control_thread_t *p_thread ) { @@ -1288,8 +1289,6 @@ rtmp_handler_invoke( rtmp_control_thread_t *p_thread, rtmp_packet_t *rtmp_packet } else if( strcmp( "NetConnection.Connect.InvalidApp", string2 ) == 0 ) { - p_thread->b_die = 1; - vlc_mutex_lock( &p_thread->lock ); vlc_cond_signal( &p_thread->wait ); vlc_mutex_unlock( &p_thread->lock ); diff --git a/modules/access/rtmp/rtmp_amf_flv.h b/modules/access/rtmp/rtmp_amf_flv.h index 6f5b19be03..43786ea7eb 100644 --- a/modules/access/rtmp/rtmp_amf_flv.h +++ b/modules/access/rtmp/rtmp_amf_flv.h @@ -66,6 +66,7 @@ struct rtmp_control_thread_t vlc_mutex_t lock; vlc_cond_t wait; + vlc_thread_t thread; int result_connect; int result_publish; diff --git a/modules/access_output/rtmp.c b/modules/access_output/rtmp.c index 8c8b7993e0..7e880ea6c2 100644 --- a/modules/access_output/rtmp.c +++ b/modules/access_output/rtmp.c @@ -68,7 +68,7 @@ vlc_module_end () *****************************************************************************/ static ssize_t Write( sout_access_out_t *, block_t * ); static int Seek ( sout_access_out_t *, off_t ); -static void* ThreadControl( vlc_object_t * ); +static void* ThreadControl( void * ); struct sout_access_out_sys_t { @@ -143,7 +143,6 @@ static int Open( vlc_object_t *p_this ) } /* Initialize thread variables */ - p_sys->p_thread->b_die = 0; p_sys->p_thread->b_error= 0; p_sys->p_thread->p_fifo_input = block_FifoNew(); p_sys->p_thread->p_empty_blocks = block_FifoNew(); @@ -219,8 +218,8 @@ static int Open( vlc_object_t *p_this ) } } - if( vlc_thread_create( p_sys->p_thread, "rtmp control thread", ThreadControl, - VLC_THREAD_PRIORITY_INPUT ) ) + if( vlc_clone( &p_sys->p_thread->thread, ThreadControl, p_sys->p_thread, + VLC_THREAD_PRIORITY_INPUT ) ) { msg_Err( p_access, "cannot spawn rtmp control thread" ); goto error2; @@ -231,6 +230,8 @@ static int Open( vlc_object_t *p_this ) if( rtmp_connect_passive( p_sys->p_thread ) < 0 ) { msg_Err( p_access, "connect passive failed"); + vlc_cancel( p_sys->p_thread->thread ); + vlc_join( p_sys->p_thread->thread, NULL ); goto error2; } } @@ -267,11 +268,8 @@ static void Close( vlc_object_t * p_this ) sout_access_out_sys_t *p_sys = p_access->p_sys; int i; -// p_sys->p_thread->b_die = true; - vlc_object_kill( p_sys->p_thread ); - block_FifoWake( p_sys->p_thread->p_fifo_input ); - - vlc_thread_join( p_sys->p_thread ); + vlc_cancel( p_sys->p_thread->thread ); + vlc_join( p_sys->p_thread->thread, NULL ); vlc_cond_destroy( &p_sys->p_thread->wait ); vlc_mutex_destroy( &p_sys->p_thread->lock ); @@ -376,17 +374,19 @@ static int Seek( sout_access_out_t *p_access, off_t i_pos ) /***************************************************************************** * ThreadControl: manage control messages and pipe media to Read *****************************************************************************/ -static void* ThreadControl( vlc_object_t *p_this ) +static void* ThreadControl( void *p_this ) { - rtmp_control_thread_t *p_thread = (rtmp_control_thread_t *) p_this; + rtmp_control_thread_t *p_thread = p_this; rtmp_packet_t *rtmp_packet; int canc = vlc_savecancel (); rtmp_init_handler( p_thread->rtmp_handler ); - while( vlc_object_alive (p_thread) ) + for( ;; ) { + vlc_restorecancel( canc ); rtmp_packet = rtmp_read_net_packet( p_thread ); + canc = vlc_savecancel( ); if( rtmp_packet != NULL ) { if( rtmp_packet->content_type < 0x01 /* RTMP_CONTENT_TYPE_CHUNK_SIZE */ @@ -411,8 +411,7 @@ static void* ThreadControl( vlc_object_t *p_this ) vlc_cond_signal( &p_thread->wait ); vlc_mutex_unlock( &p_thread->lock ); } - - p_thread->b_die = 1; + break; } } vlc_restorecancel (canc); -- 2.39.5