]> git.sesse.net Git - vlc/commitdiff
Added a ref count on input_resource_t.
authorLaurent Aimar <fenrir@videolan.org>
Thu, 17 Jun 2010 21:55:22 +0000 (23:55 +0200)
committerLaurent Aimar <fenrir@videolan.org>
Thu, 17 Jun 2010 21:57:02 +0000 (23:57 +0200)
It should fix invalid accesses of input_resource_t using input_GetVout/Aout.

include/vlc_input.h
src/control/media_player.c
src/input/input.c
src/input/resource.c
src/input/resource.h
src/input/vlm.c
src/libvlccore.sym
src/playlist/thread.c

index 930f3eb4d58e3c5a01bdccd9b0606b04ab019716..da575481a77c976cb0b88a3303cb7df8e5701ef6 100644 (file)
@@ -663,13 +663,18 @@ VLC_EXPORT( char *, input_CreateFilename, ( vlc_object_t *, const char *psz_path
 VLC_EXPORT( input_resource_t *, input_resource_New, ( vlc_object_t * ) );
 
 /**
- * It deletes an input resource.
+ * It releases an input resource.
  */
-VLC_EXPORT(void, input_resource_Delete, ( input_resource_t * ) );
+VLC_EXPORT(void, input_resource_Release, ( input_resource_t * ) );
 
 /**
  * Forcefully destroys the video output (e.g. when the playlist is stopped).
  */
 VLC_EXPORT(void, input_resource_TerminateVout, ( input_resource_t * ) );
 
+/**
+ * This function releases all resources (object).
+ */
+VLC_EXPORT( void, input_resource_Terminate, ( input_resource_t * ) );
+
 #endif
index 6d8b540609b548b640a0cbd7b42cf108eb17b713..5b33293aafd132adaccd9c2dab8e5f6e763f1979 100644 (file)
@@ -506,7 +506,8 @@ static void libvlc_media_player_destroy( libvlc_media_player_t *p_mi )
         release_input_thread(p_mi, true);
     if( p_mi->input.p_resource )
     {
-        input_resource_Delete( p_mi->input.p_resource );
+        input_resource_Terminate( p_mi->input.p_resource );
+        input_resource_Release( p_mi->input.p_resource );
         p_mi->input.p_resource = NULL;
     }
     vlc_mutex_destroy( &p_mi->input.lock );
index 9f3b7bb3d91ca75a9dddc8d5068901db34f17caa..f66c0638bdfa058a7490b07404abf43c15374456 100644 (file)
@@ -386,12 +386,12 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,
     if( p_resource )
     {
         p_input->p->p_resource_private = NULL;
-        p_input->p->p_resource = p_resource;
+        p_input->p->p_resource = input_resource_Hold( p_resource );
     }
     else
     {
         p_input->p->p_resource_private = input_resource_New( VLC_OBJECT( p_input ) );
-        p_input->p->p_resource = p_input->p->p_resource_private;
+        p_input->p->p_resource = input_resource_Hold( p_input->p->p_resource_private );
     }
     input_resource_SetInput( p_input->p->p_resource, p_input );
 
@@ -500,8 +500,10 @@ static void Destructor( input_thread_t * p_input )
     if( p_input->p->p_es_out_display )
         es_out_Delete( p_input->p->p_es_out_display );
 
+    if( p_input->p->p_resource )
+        input_resource_Release( p_input->p->p_resource );
     if( p_input->p->p_resource_private )
-        input_resource_Delete( p_input->p->p_resource_private );
+        input_resource_Release( p_input->p->p_resource_private );
 
     vlc_gc_decref( p_input->p->p_item );
 
index 677b50e1639003bd0e8bab0dcb8439728f97dab0..f683e61b3679d7c3b8b5c276075236ee6f522e4e 100644 (file)
@@ -44,6 +44,8 @@
 
 struct input_resource_t
 {
+    VLC_GC_MEMBERS
+
     vlc_object_t   *p_parent;
 
     /* This lock is used to serialize request and protect
@@ -387,6 +389,18 @@ static void TerminateAout( input_resource_t *p_resource )
         vlc_object_release( p_aout );
 }
 
+static void Destructor( gc_object_t *p_gc )
+{
+    input_resource_t *p_resource = vlc_priv( p_gc, input_resource_t );
+
+    DestroySout( p_resource );
+    DestroyVout( p_resource );
+    DestroyAout( p_resource );
+
+    vlc_mutex_destroy( &p_resource->lock_hold );
+    vlc_mutex_destroy( &p_resource->lock );
+    free( p_resource );
+}
 
 /* */
 input_resource_t *input_resource_New( vlc_object_t *p_parent )
@@ -395,21 +409,22 @@ input_resource_t *input_resource_New( vlc_object_t *p_parent )
     if( !p_resource )
         return NULL;
 
+    vlc_gc_init( p_resource, Destructor );
     p_resource->p_parent = p_parent;
     vlc_mutex_init( &p_resource->lock );
     vlc_mutex_init( &p_resource->lock_hold );
     return p_resource;
 }
 
-void input_resource_Delete( input_resource_t *p_resource )
+void input_resource_Release( input_resource_t *p_resource )
 {
-    DestroySout( p_resource );
-    DestroyVout( p_resource );
-    DestroyAout( p_resource );
+    vlc_gc_decref( p_resource );
+}
 
-    vlc_mutex_destroy( &p_resource->lock_hold );
-    vlc_mutex_destroy( &p_resource->lock );
-    free( p_resource );
+input_resource_t *input_resource_Hold( input_resource_t *p_resource )
+{
+    vlc_gc_incref( p_resource );
+    return p_resource;
 }
 
 void input_resource_SetInput( input_resource_t *p_resource, input_thread_t *p_input )
index d8b45f2ed7c33100238a4ce49928d0c05ddf9d2b..713fe8e05499c3110541bc3f0c1a987b3e252261 100644 (file)
@@ -76,5 +76,10 @@ void input_resource_HoldVouts( input_resource_t *, vout_thread_t ***, size_t * )
  */
 void input_resource_Terminate( input_resource_t * );
 
+/**
+ * This function holds the input_resource_t itself
+ */
+input_resource_t *input_resource_Hold( input_resource_t * );
+
 #endif
 
index c117d52aa047b813e8706c02f5aafed70072ffbf..772ce7c76d83996293e9806c7f806a225d413cef 100644 (file)
@@ -867,7 +867,10 @@ static void vlm_MediaInstanceDelete( vlm_t *p_vlm, int64_t id, vlm_media_instanc
         vlm_SendEventMediaInstanceStopped( p_vlm, id, p_media->cfg.psz_name );
     }
     if( p_instance->p_input_resource )
-        input_resource_Delete( p_instance->p_input_resource );
+    {
+        input_resource_Terminate( p_instance->p_input_resource );
+        input_resource_Release( p_instance->p_input_resource );
+    }
 
     TAB_REMOVE( p_media->i_instance, p_media->instance, p_instance );
     vlc_gc_decref( p_instance->p_item );
index eca26908fc028246bf4a976d034c048215540559..49942250e9e71d64b56ea8badcb267a36a59c060 100644 (file)
@@ -219,8 +219,9 @@ input_item_SetURI
 input_item_WriteMeta
 input_Read
 input_resource_New
-input_resource_Delete
+input_resource_Release
 input_resource_TerminateVout
+input_resource_Terminate
 input_SplitMRL
 input_Start
 input_Stop
index 0ed215e7e7205cd4ee4a90b9a2b20e4b580c3db8..194099631c3b44d3f632d0f7e5144b7559114b33 100644 (file)
@@ -84,7 +84,10 @@ void playlist_Deactivate( playlist_t *p_playlist )
 
     /* release input resources */
     if( p_sys->p_input_resource )
-        input_resource_Delete( p_sys->p_input_resource );
+    {
+        input_resource_Terminate( p_sys->p_input_resource );
+        input_resource_Release( p_sys->p_input_resource );
+    }
     p_sys->p_input_resource = NULL;
 
     if( var_InheritBool( p_playlist, "media-library" ) )