From: Pierre d'Herbemont Date: Tue, 18 Mar 2008 22:23:23 +0000 (+0100) Subject: vlc_objects.h: Export and implement vlc_object_set_destructor(). X-Git-Tag: 0.9.0-test0~2011 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=56a0945078146cedcd3c9e33ce86caa24de79b2f;p=vlc vlc_objects.h: Export and implement vlc_object_set_destructor(). --- diff --git a/include/vlc_objects.h b/include/vlc_objects.h index aa4d1dc5bc..0f5bbde69c 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 898efceba9..fb1e598c9a 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 7cbd1f8348..27bf8cd5bd 100644 --- a/src/misc/objects.c +++ b/src/misc/objects.c @@ -72,6 +72,12 @@ #endif #include +/***************************************************************************** + * 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 )