]> git.sesse.net Git - vlc/blobdiff - src/misc/objects.c
Less memleaks in Qt interface.
[vlc] / src / misc / objects.c
index 8a8e6d23e0a53ae10c68f614da9af56ef4b5316e..96214c14d0710889a451e8df0252bc433da03894 100644 (file)
@@ -96,8 +96,8 @@ static void held_objects_destroy (void *);
  *****************************************************************************/
 static vlc_mutex_t     structure_lock;
 
-void *vlc_custom_create( vlc_object_t *p_this, size_t i_size,
-                         int i_type, const char *psz_type )
+void *__vlc_custom_create( vlc_object_t *p_this, size_t i_size,
+                           int i_type, const char *psz_type )
 {
     vlc_object_t *p_new;
     vlc_object_internals_t *p_priv;
@@ -226,18 +226,10 @@ void * __vlc_object_create( vlc_object_t *p_this, int i_type )
 
     switch( i_type )
     {
-        case VLC_OBJECT_LIBVLC:
-            i_size = sizeof(libvlc_int_t);
-            psz_type = "libvlc";
-            break;
         case VLC_OBJECT_INTF:
             i_size = sizeof(intf_thread_t);
             psz_type = "interface";
             break;
-        case VLC_OBJECT_DIALOGS:
-            i_size = sizeof(intf_thread_t);
-            psz_type = "dialogs";
-            break;
         case VLC_OBJECT_DECODER:
             i_size = sizeof(decoder_t);
             psz_type = "decoder";
@@ -250,14 +242,6 @@ void * __vlc_object_create( vlc_object_t *p_this, int i_type )
             i_size = sizeof(encoder_t);
             psz_type = "encoder";
             break;
-        case VLC_OBJECT_FILTER:
-            i_size = sizeof(filter_t);
-            psz_type = "filter";
-            break;
-        case VLC_OBJECT_VOUT:
-            i_size = sizeof(vout_thread_t);
-            psz_type = "video output";
-            break;
         case VLC_OBJECT_AOUT:
             i_size = sizeof(aout_instance_t);
             psz_type = "audio output";
@@ -271,8 +255,8 @@ void * __vlc_object_create( vlc_object_t *p_this, int i_type )
             psz_type = "announce";
             break;
         default:
-            i_size = i_type > (int)sizeof(vlc_object_t)
-                         ? i_type : (int)sizeof(vlc_object_t);
+            assert( i_type > 0 ); /* unknown type?! */
+            i_size = i_type;
             i_type = VLC_OBJECT_GENERIC;
             psz_type = "generic";
             break;
@@ -317,7 +301,12 @@ static void vlc_object_destroy( vlc_object_t *p_this )
 
     /* If we are running on a thread, wait until it ends */
     if( p_priv->b_thread )
+    {
+        msg_Warn (p_this->p_libvlc, /* do NOT use a dead object for logging! */
+                  "%s %d destroyed while thread alive (VLC might crash)",
+                  p_this->psz_object_type, p_this->i_object_id);
         vlc_thread_join( p_this );
+    }
 
     /* Call the custom "subclass" destructor */
     if( p_priv->pf_destructor )
@@ -337,9 +326,9 @@ static void vlc_object_destroy( vlc_object_t *p_this )
 
     if( p_this->p_libvlc == NULL )
     {
+#ifndef NDEBUG
         libvlc_global_data_t *p_global = (libvlc_global_data_t *)p_this;
 
-#ifndef NDEBUG
         assert( p_global == vlc_global() );
         /* Test for leaks */
         if (p_priv->next != p_this)
@@ -557,35 +546,6 @@ int __vlc_object_timedwait( vlc_object_t *obj, mtime_t deadline )
 }
 
 
-/**
- * Checks whether an object has been "killed".
- * The object lock must be held.
- *
- * Typical code for an object thread could be:
- *
-   vlc_object_lock (self);
-   ...initialization...
-   while (vlc_object_alive (self))
-   {
-       ...preprocessing...
-
-       vlc_object_wait (self);
-
-       ...postprocessing...
-   }
-   ...deinitialization...
-   vlc_object_unlock (self);
- *
- *
- * @return true iff the object has not been killed yet
- */
-bool __vlc_object_alive( vlc_object_t *obj )
-{
-    vlc_assert_locked( &(vlc_internals(obj)->lock) );
-    return !obj->b_die;
-}
-
-
 /**
  * Signals an object for which the lock is held.
  * At least one thread currently sleeping in vlc_object_wait() or
@@ -624,6 +584,7 @@ void __vlc_object_kill( vlc_object_t *p_this )
     }
 
     vlc_object_signal_unlocked( p_this );
+    /* This also serves as a memory barrier toward vlc_object_alive(): */
     vlc_object_unlock( p_this );
 }