[vlc-devel] commit: vlc_objects.h: Export and implement vlc_object_set_destructor(). ( Pierre d'Herbemont )
git version control
git at videolan.org
Wed Mar 19 00:05:21 CET 2008
vlc | branch: master | Pierre d'Herbemont <pdherbemont at free.fr> | Tue Mar 18 23:23:23 2008 +0100| [56a0945078146cedcd3c9e33ce86caa24de79b2f]
vlc_objects.h: Export and implement vlc_object_set_destructor().
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=56a0945078146cedcd3c9e33ce86caa24de79b2f
---
include/vlc_objects.h | 10 ++++++++++
src/libvlc.h | 5 +++--
src/misc/objects.c | 30 ++++++++++++++++++++++++++++++
3 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/include/vlc_objects.h b/include/vlc_objects.h
index aa4d1dc..0f5bbde 100644
--- a/include/vlc_objects.h
+++ b/include/vlc_objects.h
@@ -83,6 +83,12 @@
#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) )
diff --git a/src/libvlc.h b/src/libvlc.h
index 898efce..fb1e598 100644
--- a/src/libvlc.h
+++ b/src/libvlc.h
@@ -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")
diff --git a/src/misc/objects.c b/src/misc/objects.c
index 7cbd1f8..27bf8cd 100644
--- a/src/misc/objects.c
+++ b/src/misc/objects.c
@@ -73,6 +73,12 @@
#include <assert.h>
/*****************************************************************************
+ * Constants
+ *****************************************************************************/
+
+const vlc_destructor_t kVLCDestructor = NULL;
+
+/*****************************************************************************
* Local prototypes
*****************************************************************************/
static int DumpCommand( vlc_object_t *, char const *,
@@ -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;
@@ -354,6 +361,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)
*
* This function destroys an object that has been previously allocated with
@@ -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 )
More information about the vlc-devel
mailing list