]> git.sesse.net Git - vlc/commitdiff
intf_Destroy(): use vlc_object_release() and a destructor instead
authorRémi Denis-Courmont <rem@videolan.org>
Wed, 28 May 2008 17:56:15 +0000 (20:56 +0300)
committerRémi Denis-Courmont <rem@videolan.org>
Wed, 28 May 2008 17:56:15 +0000 (20:56 +0300)
While reading this, you will find a bunch of:
  while (find (VLC_OBJECT_INTERFACE))
     release; release;

These are of course plain BUGS (which are neither introduced nor fixed
by this commit). Imagine, for instance, what happens if two threads run
the code above at the same time... they end up releasing the interface
once too many.

include/vlc_interface.h
modules/access/vcdx/demux.c
modules/codec/cmml/cmml.c
modules/control/ntservice.c
modules/control/rc.c
src/interface/interface.c
src/libvlc-common.c
src/libvlccore.sym

index 8040ab8405f9e72487817b2cd7ab74b9b10ba0a7..04c7c19db6a1102585c89c059c326272a1c8e934 100644 (file)
@@ -120,7 +120,6 @@ struct intf_dialog_args_t
 VLC_EXPORT( intf_thread_t *, __intf_Create,     ( vlc_object_t *, const char *, int, const char *const * ) );
 VLC_EXPORT( int,               intf_RunThread,  ( intf_thread_t * ) );
 VLC_EXPORT( void,              intf_StopThread, ( intf_thread_t * ) );
-VLC_EXPORT( void,              intf_Destroy,    ( intf_thread_t * ) );
 
 /* If the interface is in the main thread, it should listen both to
  * p_intf->b_die and p_libvlc->b_die */
index c7c62e2d0fedd9b810332eb11b345e438aa86daa..8d1b674f858b6ec99f8763d46d3e0ec2575bef5a 100644 (file)
@@ -129,7 +129,7 @@ void VCDEnd ( vlc_object_t *p_this )
         intf_StopThread( p_intf );
         vlc_object_detach( p_intf );
         vlc_object_release( p_intf );
-        intf_Destroy( p_intf );
+        vlc_object_release( p_intf );
     }
 
     p_vcd->p_intf = NULL;
index 373ca4918108980c9cdd3dd408d5cf570adef9cd..ef66d4a821d02fadfff0e08fd751663ece5c6848 100644 (file)
@@ -189,7 +189,7 @@ static void CloseDecoder( vlc_object_t *p_this )
         intf_StopThread( p_intf );
         vlc_object_detach( p_intf );
         vlc_object_release( p_intf );
-        intf_Destroy( p_intf );
+        vlc_object_release( p_intf );
     }
 
     p_sys->p_intf = NULL;
index 99c0d86024ea9e7d53c4edf162212cb0fc4bf760..7eed573b3ab7408f1fd51e95c8596f87587d4ba1 100644 (file)
@@ -164,7 +164,7 @@ static void Run( intf_thread_t *p_intf )
         intf_StopThread( p_extraintf );
         vlc_object_detach( p_extraintf );
         vlc_object_release( p_extraintf );
-        intf_Destroy( p_extraintf );
+        vlc_object_release( p_extraintf );
     }
 
     /* Make sure we exit (In case other interfaces have been spawned) */
@@ -332,7 +332,7 @@ static void WINAPI ServiceDispatch( DWORD numArgs, char **args )
             if( intf_RunThread( p_new_intf ) )
             {
                 vlc_object_detach( p_new_intf );
-                intf_Destroy( p_new_intf );
+                vlc_object_release( p_new_intf );
                 msg_Err( p_intf, "interface \"%s\" cannot run", psz_temp );
             }
 
index 3bfd0a62babd4ec032cae6b50ce336e9f4a1e647..05aa08a37f87a656656499d58ff8752993e65150 100644 (file)
@@ -1543,7 +1543,7 @@ static int Intf( vlc_object_t *p_this, char const *psz_cmd,
         if( intf_RunThread( p_newintf ) )
         {
             vlc_object_detach( p_newintf );
-            intf_Destroy( p_newintf );
+            vlc_object_release( p_newintf );
         }
     }
 
index 3cdd819b21052697dff9f53750fd2e6c470d3ebf..7f95e01598d142abae7b7fb1b6e134b6bc768c48 100644 (file)
@@ -54,6 +54,24 @@ static void RunInterface( intf_thread_t *p_intf );
 static int AddIntfCallback( vlc_object_t *, char const *,
                             vlc_value_t , vlc_value_t , void * );
 
+/**
+ * \brief Destroy the interface after the main loop endeed.
+ *
+ * \param p_intf the interface thread
+ * \return nothing
+ */
+static void intf_Destroy( vlc_object_t *obj )
+{
+    intf_thread_t *p_intf = (intf_thread_t *)obj;
+
+    /* Unlock module if present (a switch may have failed) */
+    if( p_intf->p_module )
+        module_Unneed( p_intf, p_intf->p_module );
+
+    free( p_intf->psz_intf );
+    vlc_mutex_destroy( &p_intf->change_lock );
+}
+
 /*****************************************************************************
  * intf_Create: prepare interface before main loop
  *****************************************************************************
@@ -114,6 +132,7 @@ intf_thread_t* __intf_Create( vlc_object_t *p_this, const char *psz_module,
 
     /* Attach interface to its parent object */
     vlc_object_attach( p_intf, p_this );
+    vlc_object_set_destructor( p_intf, intf_Destroy );
 
     return p_intf;
 }
@@ -140,6 +159,8 @@ int intf_RunThread( intf_thread_t *p_intf )
     if( p_intf->b_should_run_on_first_thread )
     {
         RunInterface( p_intf );
+        vlc_object_detach( p_intf );
+        vlc_object_release( p_intf );
         return VLC_SUCCESS;
     }
     
@@ -172,29 +193,6 @@ void intf_StopThread( intf_thread_t *p_intf )
     }
 }
 
-/**
- * \brief Destroy the interface after the main loop endeed.
- *
- * Destroys interfaces and closes output devices
- * \param p_intf the interface thread
- * \return nothing
- */
-void intf_Destroy( intf_thread_t *p_intf )
-{
-    /* Unlock module if present (a switch may have failed) */
-    if( p_intf->p_module )
-    {
-        module_Unneed( p_intf, p_intf->p_module );
-    }
-    free( p_intf->psz_intf );
-
-    vlc_mutex_destroy( &p_intf->change_lock );
-
-    /* Free structure */
-    vlc_object_release( p_intf );
-}
-
-
 /* Following functions are local */
 
 /*****************************************************************************
@@ -283,7 +281,7 @@ static int AddIntfCallback( vlc_object_t *p_this, char const *psz_cmd,
     if( intf_RunThread( p_intf ) != VLC_SUCCESS )
     {
         vlc_object_detach( p_intf );
-        intf_Destroy( p_intf );
+        vlc_object_release( p_intf );
         return VLC_EGENERIC;
     }
 
index fdb1d8b531e606b65062ef1cf6d4142152c18d73..7be0f85c4121fef68020667f87ff6a7c92ab8adb 100644 (file)
@@ -936,9 +936,8 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc )
     {
         intf_StopThread( p_intf );
         vlc_object_detach( p_intf );
-        vlc_object_release( p_intf );
-        intf_Destroy( p_intf );
-        p_intf = NULL;
+        vlc_object_release( p_intf ); /* for intf_Create() */
+        vlc_object_release( p_intf ); /* for vlc_object_find() */
     }
 
     /* Free video outputs */
@@ -1144,11 +1143,10 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc,
     /* Try to run the interface */
     p_intf->b_play = b_play;
     i_err = intf_RunThread( p_intf );
-    if( i_err || p_intf->b_should_run_on_first_thread )
+    if( i_err )
     {
         vlc_object_detach( p_intf );
-        intf_Destroy( p_intf );
-        p_intf = NULL;
+        vlc_object_release( p_intf );
         return i_err;
     }
 
@@ -1161,7 +1159,7 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc,
             while( vlc_object_lock_and_wait( p_intf ) == 0 );
 
         vlc_object_detach( p_intf );
-        intf_Destroy( p_intf );
+        vlc_object_release( p_intf );
     }
 
     return VLC_SUCCESS;
index d4283706f2ddfbe5d02581553023b320f0fedfc1..bd77501ad42f65e29627fd10425e8639dabc78cf 100644 (file)
@@ -147,7 +147,6 @@ __input_Read
 input_StopThread
 input_vaControl
 __intf_Create
-intf_Destroy
 __intf_Eject
 __intf_Progress
 __intf_ProgressUpdate