Commit 56a09450 authored by Pierre d'Herbemont's avatar Pierre d'Herbemont

vlc_objects.h: Export and implement vlc_object_set_destructor().

parent 879e3eb2
...@@ -83,6 +83,12 @@ ...@@ -83,6 +83,12 @@
#define OBJECT_FLAGS_QUIET 0x0002 #define OBJECT_FLAGS_QUIET 0x0002
#define OBJECT_FLAGS_NOINTERACT 0x0004 #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 :-) * The vlc_object_t type. Yes, it's that simple :-)
*****************************************************************************/ *****************************************************************************/
...@@ -96,6 +102,7 @@ struct vlc_object_t ...@@ -96,6 +102,7 @@ struct vlc_object_t
* Prototypes * Prototypes
*****************************************************************************/ *****************************************************************************/
VLC_EXPORT( void *, __vlc_object_create, ( vlc_object_t *, int ) ); 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_attach, ( vlc_object_t *, vlc_object_t * ) );
VLC_EXPORT( void, __vlc_object_detach, ( vlc_object_t * ) ); VLC_EXPORT( void, __vlc_object_detach, ( vlc_object_t * ) );
VLC_EXPORT( void *, vlc_object_get, ( int ) ); VLC_EXPORT( void *, vlc_object_get, ( int ) );
...@@ -111,6 +118,9 @@ VLC_EXPORT( void, vlc_list_release, ( vlc_list_t * ) ); ...@@ -111,6 +118,9 @@ VLC_EXPORT( void, vlc_list_release, ( vlc_list_t * ) );
#define vlc_object_create(a,b) \ #define vlc_object_create(a,b) \
__vlc_object_create( VLC_OBJECT(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) \ #define vlc_object_detach(a) \
__vlc_object_detach( VLC_OBJECT(a) ) __vlc_object_detach( VLC_OBJECT(a) )
......
...@@ -133,8 +133,9 @@ struct vlc_object_internals_t ...@@ -133,8 +133,9 @@ struct vlc_object_internals_t
vlc_spinlock_t spin; vlc_spinlock_t spin;
/* Objects management */ /* Objects management */
unsigned i_refcount; unsigned i_refcount;
vlc_bool_t b_attached; vlc_destructor_t pf_destructor;
vlc_bool_t b_attached;
}; };
#define ZOOM_SECTION N_("Zoom") #define ZOOM_SECTION N_("Zoom")
......
...@@ -72,6 +72,12 @@ ...@@ -72,6 +72,12 @@
#endif #endif
#include <assert.h> #include <assert.h>
/*****************************************************************************
* Constants
*****************************************************************************/
const vlc_destructor_t kVLCDestructor = NULL;
/***************************************************************************** /*****************************************************************************
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
...@@ -193,6 +199,7 @@ vlc_object_t *vlc_custom_create( vlc_object_t *p_this, size_t i_size, ...@@ -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->i_refcount = 1;
p_priv->pf_destructor = kVLCDestructor;
p_new->p_parent = NULL; p_new->p_parent = NULL;
p_new->pp_children = NULL; p_new->pp_children = NULL;
p_new->i_children = 0; p_new->i_children = 0;
...@@ -352,6 +359,24 @@ void * __vlc_object_create( vlc_object_t *p_this, int i_type ) ...@@ -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) * Destroy a vlc object (Internal)
...@@ -400,6 +425,11 @@ static void vlc_object_destroy( vlc_object_t *p_this ) ...@@ -400,6 +425,11 @@ static void vlc_object_destroy( vlc_object_t *p_this )
abort(); 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 /* Destroy the associated variables, starting from the end so that
* no memmove calls have to be done. */ * no memmove calls have to be done. */
while( p_priv->i_vars ) while( p_priv->i_vars )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment