* events.c: events interface
* This library provides an interface to the send and receive events.
* It is more lightweight than variable based callback.
- * Methode
*****************************************************************************
* Copyright (C) 1998-2005 the VideoLAN team
* $Id$
* Preamble
*****************************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include <vlc/vlc.h>
#include <assert.h>
};
#endif
+static vlc_bool_t
+listeners_are_equal( vlc_event_listener_t * listener1,
+ vlc_event_listener_t * listener2 )
+{
+ return listener1->pf_callback == listener2->pf_callback &&
+ listener1->p_user_data == listener2->p_user_data;
+}
+
static vlc_bool_t
group_contains_listener( vlc_event_listeners_group_t * group,
vlc_event_listener_t * searched_listener )
{
vlc_event_listener_t * listener;
FOREACH_ARRAY( listener, group->listeners )
- if( searched_listener == listener )
+ if( listeners_are_equal(searched_listener, listener) )
return VLC_TRUE;
FOREACH_END()
return VLC_FALSE;
void vlc_event_send( vlc_event_manager_t * p_em,
vlc_event_t * p_event )
{
- vlc_event_listeners_group_t * listeners_group;
+ vlc_event_listeners_group_t * listeners_group = NULL;
vlc_event_listener_t * listener;
vlc_event_listener_t * array_of_cached_listeners = NULL;
vlc_event_listener_t * cached_listener;
/* Call the function attached */
cached_listener = array_of_cached_listeners;
- vlc_mutex_lock( &p_em->event_sending_lock );
+
+ if( !listeners_group || !array_of_cached_listeners )
+ {
+ free( array_of_cached_listeners );
+ return;
+ }
+
+ vlc_mutex_lock( &p_em->event_sending_lock ) ;
/* Track item removed from *this* thread, with a simple flag */
listeners_group->b_sublistener_removed = VLC_FALSE;