]> git.sesse.net Git - vlc/blobdiff - src/input/vlm.c
Removed one dependency of the clock on input_thread_t.
[vlc] / src / input / vlm.c
index 611785ee28a10047c317895417b6dfc0ddb7f885..f7f80edfdcee7053ee7179978df2d5d6bc69b4b0 100644 (file)
@@ -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;