X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Fvlm.c;h=f7f80edfdcee7053ee7179978df2d5d6bc69b4b0;hb=b72b3e538b7844b05d01857139eb9a1ba3a8b705;hp=611785ee28a10047c317895417b6dfc0ddb7f885;hpb=0bb7a50e7484c73cdc7a61b01a4980e77b20c799;p=vlc diff --git a/src/input/vlm.c b/src/input/vlm.c index 611785ee28..f7f80edfdc 100644 --- a/src/input/vlm.c +++ b/src/input/vlm.c @@ -62,7 +62,7 @@ *****************************************************************************/ static void vlm_Destructor( vlm_t *p_vlm ); -static void* Manage( vlc_object_t * ); +static void* Manage( void * ); static int vlm_MediaVodControl( void *, vod_media_t *, const char *, int, va_list ); /***************************************************************************** @@ -85,7 +85,7 @@ vlm_t *__vlm_New ( vlc_object_t *p_this ) p_vlm = *pp_vlm; if( p_vlm ) { /* VLM already exists */ - vlc_object_yield( p_vlm ); + vlc_object_hold( p_vlm ); vlc_mutex_unlock( lockval.p_address ); return p_vlm; } @@ -108,8 +108,7 @@ vlm_t *__vlm_New ( vlc_object_t *p_this ) p_vlm->p_vod = NULL; vlc_object_attach( p_vlm, p_this->p_libvlc ); - if( vlc_thread_create( p_vlm, "vlm thread", - Manage, VLC_THREAD_PRIORITY_LOW, false ) ) + if( vlc_clone( &p_vlm->thread, Manage, p_vlm, VLC_THREAD_PRIORITY_LOW ) ) { vlc_mutex_destroy( &p_vlm->lock ); vlc_object_release( p_vlm ); @@ -155,8 +154,6 @@ void vlm_Delete( vlm_t *p_vlm ) * is serialized against setting libvlc_priv->p_vlm from vlm_New(). */ var_Get( p_vlm->p_libvlc, "vlm_mutex", &lockval ); vlc_mutex_lock( lockval.p_address ); - vlc_object_kill( p_vlm ); - vlc_thread_join( p_vlm ); vlc_object_release( p_vlm ); vlc_mutex_unlock( lockval.p_address ); } @@ -174,6 +171,9 @@ static void vlm_Destructor( vlm_t *p_vlm ) vlm_ControlInternal( p_vlm, VLM_CLEAR_SCHEDULES ); TAB_CLEAN( p_vlm->schedule, p_vlm->schedule ); + vlc_object_kill( p_vlm ); + /*vlc_cancel( p_vlm->thread ); */ + vlc_join( p_vlm->thread, NULL ); vlc_mutex_destroy( &p_vlm->lock ); } @@ -302,13 +302,14 @@ static int vlm_MediaVodControl( void *p_private, vod_media_t *p_vod_media, /***************************************************************************** * Manage: *****************************************************************************/ -static void* Manage( vlc_object_t* p_object ) +static void* Manage( void* p_object ) { vlm_t *vlm = (vlm_t*)p_object; int i, j; mtime_t i_lastcheck; mtime_t i_time; + int canc = vlc_savecancel (); i_lastcheck = vlm_Date(); while( !vlm->b_die ) @@ -412,6 +413,7 @@ static void* Manage( vlc_object_t* p_object ) msleep( 100000 ); } + vlc_restorecancel (canc); return NULL; } @@ -530,6 +532,7 @@ static int vlm_OnMediaUpdate( vlm_t *p_vlm, vlm_media_sys_t *p_media ) msleep( 100000 ); input_StopThread( p_input ); + vlc_thread_join( p_input ); vlc_object_release( p_input ); } free( psz_header ); @@ -605,7 +608,7 @@ static int vlm_ControlMediaAdd( vlm_t *p_vlm, vlm_media_t *p_cfg, int64_t *p_id p_vlm->p_vod = vlc_custom_create( VLC_OBJECT(p_vlm), sizeof( vod_t ), VLC_OBJECT_GENERIC, "vod server" ); vlc_object_attach( p_vlm->p_vod, p_vlm ); - p_vlm->p_vod->p_module = module_Need( p_vlm->p_vod, "vod server", 0, 0 ); + p_vlm->p_vod->p_module = module_need( p_vlm->p_vod, "vod server", 0, 0 ); if( !p_vlm->p_vod->p_module ) { msg_Err( p_vlm, "cannot find vod server" ); @@ -673,7 +676,7 @@ static int vlm_ControlMediaDel( vlm_t *p_vlm, int64_t id ) /* Check if we need to unload the VOD server */ if( p_vlm->p_vod && p_vlm->i_vod <= 0 ) { - module_Unneed( p_vlm->p_vod, p_vlm->p_vod->p_module ); + module_unneed( p_vlm->p_vod, p_vlm->p_vod->p_module ); vlc_object_detach( p_vlm->p_vod ); vlc_object_release( p_vlm->p_vod ); p_vlm->p_vod = NULL;