]> git.sesse.net Git - vlc/commitdiff
vlc_objects.h: Export and implement vlc_object_set_destructor().
authorPierre d'Herbemont <pdherbemont@free.fr>
Tue, 18 Mar 2008 22:23:23 +0000 (23:23 +0100)
committerPierre d'Herbemont <pdherbemont@free.fr>
Tue, 18 Mar 2008 23:05:06 +0000 (00:05 +0100)
include/vlc_objects.h
src/libvlc.h
src/misc/objects.c

index aa4d1dc5bc236b9721b1d5816877c1b835ec651c..0f5bbde69c7dc400b6c974973a3b506b54eadfa8 100644 (file)
 #define OBJECT_FLAGS_QUIET       0x0002
 #define OBJECT_FLAGS_NOINTERACT  0x0004
 
+/* Types */
+typedef void (*vlc_destructor_t)(struct vlc_object_t *);
+
+/* Constants */
+VLC_PUBLIC_API const vlc_destructor_t kVLCDestructor;
+
 /*****************************************************************************
  * The vlc_object_t type. Yes, it's that simple :-)
  *****************************************************************************/
@@ -96,6 +102,7 @@ struct vlc_object_t
  * Prototypes
  *****************************************************************************/
 VLC_EXPORT( void *, __vlc_object_create, ( vlc_object_t *, int ) );
+VLC_EXPORT( void, __vlc_object_set_destructor, ( vlc_object_t *, vlc_destructor_t ) );
 VLC_EXPORT( void, __vlc_object_attach, ( vlc_object_t *, vlc_object_t * ) );
 VLC_EXPORT( void, __vlc_object_detach, ( vlc_object_t * ) );
 VLC_EXPORT( void *, vlc_object_get, ( int ) );
@@ -111,6 +118,9 @@ VLC_EXPORT( void, vlc_list_release, ( vlc_list_t * ) );
 #define vlc_object_create(a,b) \
     __vlc_object_create( VLC_OBJECT(a), b )
 
+#define vlc_object_set_destructor(a,b) \
+    __vlc_object_set_destructor( VLC_OBJECT(a), b )
+
 #define vlc_object_detach(a) \
     __vlc_object_detach( VLC_OBJECT(a) )
 
index 898efceba98942429c29484e812f8cd73fe221d3..fb1e598c9a95e9154f124c6e94c7b046c44af25a 100644 (file)
@@ -133,8 +133,9 @@ struct vlc_object_internals_t
     vlc_spinlock_t  spin;
 
     /* Objects management */
-    unsigned        i_refcount;
-    vlc_bool_t      b_attached;
+    unsigned         i_refcount;
+    vlc_destructor_t pf_destructor;
+    vlc_bool_t       b_attached;
 };
 
 #define ZOOM_SECTION N_("Zoom")
index 7cbd1f8348877e0bd22172dc87761b237322372a..27bf8cd5bd6bbc4cb994390ecb2cf248f3ab1447 100644 (file)
 #endif
 #include <assert.h>
 
+/*****************************************************************************
+ * Constants
+ *****************************************************************************/
+
+const vlc_destructor_t kVLCDestructor = NULL;
+
 /*****************************************************************************
  * Local prototypes
  *****************************************************************************/
@@ -193,6 +199,7 @@ vlc_object_t *vlc_custom_create( vlc_object_t *p_this, size_t i_size,
     }
 
     p_priv->i_refcount = 1;
+    p_priv->pf_destructor = kVLCDestructor;
     p_new->p_parent = NULL;
     p_new->pp_children = NULL;
     p_new->i_children = 0;
@@ -352,6 +359,24 @@ void * __vlc_object_create( vlc_object_t *p_this, int i_type )
 }
 
 
+/**
+ ****************************************************************************
+ * Set the destructor of a vlc object
+ *
+ * This function sets the destructor of the vlc object. It will be called
+ * when the object is destroyed when the its refcount reaches 0.
+ * (It is called by the internal function vlc_object_destroy())
+ *****************************************************************************/
+void __vlc_object_set_destructor( vlc_object_t *p_this,
+                                  vlc_destructor_t pf_destructor )
+{
+    vlc_object_internals_t *p_priv = vlc_internals(p_this );
+
+    vlc_mutex_lock( &structure_lock );
+    p_priv->pf_destructor = pf_destructor;
+    vlc_mutex_unlock( &structure_lock );
+}
+
 /**
  ****************************************************************************
  * Destroy a vlc object (Internal)
@@ -400,6 +425,11 @@ static void vlc_object_destroy( vlc_object_t *p_this )
         abort();
     }
 
+    /* Call the custom "subclass" destructor */
+    if( p_priv->pf_destructor )
+        p_priv->pf_destructor( p_this );
+
+
     /* Destroy the associated variables, starting from the end so that
      * no memmove calls have to be done. */
     while( p_priv->i_vars )