]> git.sesse.net Git - vlc/blobdiff - src/misc/objects.c
Remnants of I64F.
[vlc] / src / misc / objects.c
index cc5120b3d22339c587e8e093c4668c72cd5fa94b..8caf4d0b5202f03f60ac281b71573e01957df116 100644 (file)
 #include <vlc_sout.h>
 #include "stream_output/stream_output.h"
 
-#include "vlc_playlist.h"
 #include "vlc_interface.h"
 #include "vlc_codec.h"
 #include "vlc_filter.h"
 
-#include "vlc_meta.h"
-
 #include "variables.h"
 #ifndef WIN32
 # include <unistd.h>
@@ -83,7 +80,7 @@ static void           DetachObject  ( vlc_object_t * );
 static void           PrintObject   ( vlc_object_t *, const char * );
 static void           DumpStructure ( vlc_object_t *, int, char * );
 static int            FindIndex     ( vlc_object_t *, vlc_object_t **, int );
-static void           SetAttachment ( vlc_object_t *, vlc_bool_t );
+static void           SetAttachment ( vlc_object_t *, bool );
 
 static vlc_list_t   * NewList       ( int );
 static void           ListReplace   ( vlc_list_t *, vlc_object_t *, int );
@@ -98,7 +95,6 @@ static void vlc_object_yield_locked( vlc_object_t *p_this );
  * Local structure lock
  *****************************************************************************/
 static vlc_mutex_t    structure_lock;
-static vlc_object_internals_t global_internals;
 
 void *vlc_custom_create( vlc_object_t *p_this, size_t i_size,
                          int i_type, const char *psz_type )
@@ -106,18 +102,24 @@ void *vlc_custom_create( vlc_object_t *p_this, size_t i_size,
     vlc_object_t *p_new;
     vlc_object_internals_t *p_priv;
 
+    /* NOTE:
+     * VLC objects are laid out as follow:
+     * - first the LibVLC-private per-object data,
+     * - then VLC_COMMON members from vlc_object_t,
+     * - finally, the type-specific data (if any).
+     *
+     * This function initializes the LibVLC and common data,
+     * and zeroes the rest.
+     */
+    p_priv = calloc( 1, sizeof( *p_priv ) + i_size );
+    if( p_priv == NULL )
+        return NULL;
+
     if( i_type == VLC_OBJECT_GLOBAL )
-    {
         p_new = p_this;
-        p_priv = &global_internals;
-        memset( p_priv, 0, sizeof( *p_priv ) );
-    }
     else
     {
-        p_priv = calloc( 1, sizeof( *p_priv ) + i_size );
-        if( p_priv == NULL )
-            return NULL;
-
+        assert (i_size >= sizeof (vlc_object_t));
         p_new = (vlc_object_t *)(p_priv + 1);
     }
 
@@ -127,27 +129,22 @@ void *vlc_custom_create( vlc_object_t *p_this, size_t i_size,
 
     p_new->psz_object_name = NULL;
 
-    p_new->b_die = VLC_FALSE;
-    p_new->b_error = VLC_FALSE;
-    p_new->b_dead = VLC_FALSE;
-    p_priv->b_attached = VLC_FALSE;
-    p_new->b_force = VLC_FALSE;
+    p_new->b_die = false;
+    p_new->b_error = false;
+    p_new->b_dead = false;
+    p_priv->b_attached = false;
+    p_new->b_force = false;
 
     p_new->psz_header = NULL;
 
-    if( p_this->i_flags & OBJECT_FLAGS_NODBG )
-        p_new->i_flags |= OBJECT_FLAGS_NODBG;
-    if( p_this->i_flags & OBJECT_FLAGS_QUIET )
-        p_new->i_flags |= OBJECT_FLAGS_QUIET;
-    if( p_this->i_flags & OBJECT_FLAGS_NOINTERACT )
-        p_new->i_flags |= OBJECT_FLAGS_NOINTERACT;
+    p_new->i_flags |= p_this->i_flags
+        & (OBJECT_FLAGS_NODBG|OBJECT_FLAGS_QUIET|OBJECT_FLAGS_NOINTERACT);
 
     p_priv->p_vars = calloc( sizeof( variable_t ), 16 );
 
     if( !p_priv->p_vars )
     {
-        if( i_type != VLC_OBJECT_GLOBAL )
-            free( p_priv );
+        free( p_priv );
         return NULL;
     }
 
@@ -163,7 +160,8 @@ void *vlc_custom_create( vlc_object_t *p_this, size_t i_size,
         p_libvlc_global->i_objects = 1;
         p_libvlc_global->pp_objects = malloc( sizeof(vlc_object_t *) );
         p_libvlc_global->pp_objects[0] = p_new;
-        p_priv->b_attached = VLC_TRUE;
+        p_priv->b_attached = true;
+        vlc_mutex_init( p_new, &structure_lock );
     }
     else
     {
@@ -171,7 +169,7 @@ void *vlc_custom_create( vlc_object_t *p_this, size_t i_size,
         if( i_type == VLC_OBJECT_LIBVLC )
         {
             p_new->p_libvlc = (libvlc_int_t*)p_new;
-            p_priv->b_attached = VLC_TRUE;
+            p_priv->b_attached = true;
         }
         else
         {
@@ -193,7 +191,7 @@ void *vlc_custom_create( vlc_object_t *p_this, size_t i_size,
 
     p_priv->i_refcount = 1;
     p_priv->pf_destructor = kVLCDestructor;
-    p_priv->b_thread = VLC_FALSE;
+    p_priv->b_thread = false;
     p_new->p_parent = NULL;
     p_new->pp_children = NULL;
     p_new->i_children = 0;
@@ -207,11 +205,6 @@ void *vlc_custom_create( vlc_object_t *p_this, size_t i_size,
     vlc_spin_init( &p_priv->spin );
     p_priv->pipes[0] = p_priv->pipes[1] = -1;
 
-    if( i_type == VLC_OBJECT_GLOBAL )
-    {
-        vlc_mutex_init( p_new, &structure_lock );
-    }
-
     if( i_type == VLC_OBJECT_LIBVLC )
     {
         var_Create( p_new, "list", VLC_VAR_STRING | VLC_VAR_ISCOMMAND );
@@ -241,10 +234,6 @@ void * __vlc_object_create( vlc_object_t *p_this, int i_type )
 
     switch( i_type )
     {
-        case VLC_OBJECT_GLOBAL:
-            i_size = sizeof(libvlc_global_data_t);
-            psz_type = "global";
-            break;
         case VLC_OBJECT_LIBVLC:
             i_size = sizeof(libvlc_int_t);
             psz_type = "libvlc";
@@ -257,14 +246,6 @@ void * __vlc_object_create( vlc_object_t *p_this, int i_type )
             i_size = sizeof(intf_thread_t);
             psz_type = "dialogs";
             break;
-        case VLC_OBJECT_PLAYLIST:
-            i_size = sizeof(playlist_t);
-            psz_type = "playlist";
-            break;
-        case VLC_OBJECT_INPUT:
-            i_size = sizeof(input_thread_t);
-            psz_type = "input";
-            break;
         case VLC_OBJECT_DEMUX:
             i_size = sizeof(demux_t);
             psz_type = "demux";
@@ -390,6 +371,10 @@ static void vlc_object_destroy( vlc_object_t *p_this )
                      p_this->pp_children[i]->psz_object_name );
         }
         fflush(stderr);
+
+        /* Dump libvlc object to ease debugging */
+        vlc_object_dump( p_this->p_libvlc );
+
         abort();
     }
 
@@ -421,8 +406,16 @@ static void vlc_object_destroy( vlc_object_t *p_this )
                          p_global->pp_objects[i]->i_object_id,
                          p_global->pp_objects[i]->psz_object_type,
                          p_global->pp_objects[i]->psz_object_name );
+
+                /* Dump libvlc object to ease debugging */
+                vlc_object_dump( p_global->pp_objects[i] );
+
                 fflush(stderr);
             }
+
+            /* Dump libvlc object to ease debugging */
+            vlc_object_dump( p_this );
+
             /* Strongly abort, cause we want these to be fixed */
             abort();
         }
@@ -434,6 +427,8 @@ static void vlc_object_destroy( vlc_object_t *p_this )
         vlc_mutex_destroy( &structure_lock );
     }
 
+    FREENULL( p_this->psz_object_name );
+
 #if defined(WIN32) || defined(UNDER_CE)
     /* if object has an associated thread, close it now */
     if( p_priv->thread_id.hThread )
@@ -448,9 +443,7 @@ static void vlc_object_destroy( vlc_object_t *p_this )
     if( p_priv->pipes[0] != -1 )
         close( p_priv->pipes[0] );
 
-    /* global is not dynamically allocated by vlc_object_create */
-    if( p_this->i_object_type != VLC_OBJECT_GLOBAL )
-        free( p_priv );
+    free( p_priv );
 }
 
 
@@ -536,7 +529,7 @@ int __vlc_object_waitpipe( vlc_object_t *obj )
 {
     int pfd[2] = { -1, -1 };
     struct vlc_object_internals_t *internals = obj->p_internals;
-    vlc_bool_t killed = VLC_FALSE;
+    bool killed = false;
 
     vlc_spin_lock (&internals->spin);
     if (internals->pipes[0] == -1)
@@ -591,7 +584,7 @@ int __vlc_object_waitpipe( vlc_object_t *obj )
  *
  * @return true if the object is dying and should terminate.
  */
-vlc_bool_t __vlc_object_wait( vlc_object_t *obj )
+bool __vlc_object_wait( vlc_object_t *obj )
 {
     vlc_assert_locked( &obj->object_lock );
     vlc_cond_wait( &obj->object_wait, &obj->object_lock );
@@ -644,7 +637,7 @@ int __vlc_object_timedwait( vlc_object_t *obj, mtime_t deadline )
  *
  * @return true iff the object has not been killed yet
  */
-vlc_bool_t __vlc_object_alive( vlc_object_t *obj )
+bool __vlc_object_alive( vlc_object_t *obj )
 {
     vlc_assert_locked( &obj->object_lock );
     return !obj->b_die;
@@ -671,7 +664,7 @@ void __vlc_object_kill( vlc_object_t *p_this )
     int fd;
 
     vlc_mutex_lock( &p_this->object_lock );
-    p_this->b_die = VLC_TRUE;
+    p_this->b_die = true;
 
     vlc_spin_lock (&internals->spin);
     fd = internals->pipes[1];
@@ -898,7 +891,7 @@ void __vlc_object_yield( vlc_object_t *p_this )
  *****************************************************************************/
 void __vlc_object_release( vlc_object_t *p_this )
 {
-    vlc_bool_t b_should_destroy;
+    bool b_should_destroy;
 
     vlc_mutex_lock( &structure_lock );
 
@@ -953,7 +946,7 @@ void __vlc_object_attach( vlc_object_t *p_this, vlc_object_t *p_parent )
     /* Climb up the tree to see whether we are connected with the root */
     if( p_parent->p_internals->b_attached )
     {
-        SetAttachment( p_this, VLC_TRUE );
+        SetAttachment( p_this, true );
     }
 
     vlc_mutex_unlock( &structure_lock );
@@ -981,7 +974,7 @@ void __vlc_object_detach( vlc_object_t *p_this )
     /* Climb up the tree to see whether we are connected with the root */
     if( p_this->p_parent->p_internals->b_attached )
     {
-        SetAttachment( p_this, VLC_FALSE );
+        SetAttachment( p_this, false );
     }
 
     DetachObject( p_this );
@@ -1215,7 +1208,7 @@ static int DumpCommand( vlc_object_t *p_this, char const *psz_cmd,
                         printf( ": %f", p_var->val.f_float );
                         break;
                     case VLC_VAR_TIME:
-                        printf( ": " I64Fi, (int64_t)p_var->val.i_time );
+                        printf( ": %"PRIi64, (int64_t)p_var->val.i_time );
                         break;
                     case VLC_VAR_ADDRESS:
                         printf( ": %p", p_var->val.p_address );
@@ -1258,6 +1251,18 @@ void vlc_list_release( vlc_list_t *p_list )
     free( p_list );
 }
 
+/*****************************************************************************
+ * dump an object. (Debug function)
+ *****************************************************************************/
+void __vlc_object_dump( vlc_object_t *p_this )
+{
+    vlc_mutex_lock( &structure_lock );
+    char psz_foo[2 * MAX_DUMPSTRUCTURE_DEPTH + 1];
+    psz_foo[0] = '|';
+    DumpStructure( p_this, 0, psz_foo );
+    vlc_mutex_unlock( &structure_lock );
+}
+
 /* Following functions are local */
 
 /*****************************************************************************
@@ -1449,7 +1454,7 @@ static void DetachObject( vlc_object_t *p_this )
  * This function is used by the attach and detach functions to propagate
  * the b_attached flag in a subtree.
  *****************************************************************************/
-static void SetAttachment( vlc_object_t *p_this, vlc_bool_t b_attached )
+static void SetAttachment( vlc_object_t *p_this, bool b_attached )
 {
     int i_index;
 
@@ -1466,7 +1471,7 @@ static void PrintObject( vlc_object_t *p_this, const char *psz_prefix )
     char psz_children[20], psz_refcount[20], psz_thread[30], psz_name[50],
          psz_parent[20];
 
-    psz_name[0] = '\0';
+    memset( &psz_name, 0, sizeof(psz_name) );
     if( p_this->psz_object_name )
     {
         snprintf( psz_name, 49, " \"%s\"", p_this->psz_object_name );