X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fevents.c;h=a0a44980250cb310aca95a357f3c96513bcf7dfe;hb=f2b2e37c04b2921e29daa3260dc696646ad4f10c;hp=67ffb3fee56bcbfa506a052e926d149807b446b7;hpb=192a2076ddccdb60053ae5be615ae1303353bbe4;p=vlc diff --git a/src/misc/events.c b/src/misc/events.c index 67ffb3fee5..a0a4498025 100644 --- a/src/misc/events.c +++ b/src/misc/events.c @@ -2,7 +2,6 @@ * 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$ @@ -28,7 +27,11 @@ * Preamble *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include #include @@ -62,30 +65,49 @@ typedef struct vlc_event_listeners_group_t /* Used in vlc_event_send() to make sure to behave Correctly when vlc_event_detach was called during a callback */ - vlc_bool_t b_sublistener_removed; + bool b_sublistener_removed; } vlc_event_listeners_group_t; #ifdef DEBUG_EVENT -static const char * ppsz_event_type_to_name[] = +static const char ppsz_event_type_to_name[][33] = { + [vlc_InputStateChanged] = "vlc_InputStateChanged", + [vlc_InputSelectedStreamChanged] = "vlc_InputSelectedStreamChanged", + [vlc_InputItemMetaChanged] = "vlc_InputItemMetaChanged", [vlc_InputItemSubItemAdded] = "vlc_InputItemSubItemAdded", + [vlc_InputItemDurationChanged] = "vlc_InputItemDurationChanged", + [vlc_InputItemPreparsedChanged] = "vlc_InputItemPreparsedChanged", + [vlc_InputItemNameChanged] = "vlc_InputItemNameChanged", + [vlc_InputItemInfoChanged] = "vlc_InputItemInfoChanged", + [vlc_InputItemErrorWhenReadingChanged] = "vlc_InputItemErrorWhenReadingChanged", + [vlc_ServicesDiscoveryItemAdded] = "vlc_ServicesDiscoveryItemAdded", [vlc_ServicesDiscoveryItemRemoved] = "vlc_ServicesDiscoveryItemRemoved" + [vlc_ServicesDiscoveryStarted] = "vlc_ServicesDiscoveryStarted" + [vlc_ServicesDiscoveryEnded] = "vlc_ServicesDiscoveryEnded" }; #endif -static vlc_bool_t +static bool +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 bool 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 ) - return VLC_TRUE; + if( listeners_are_equal(searched_listener, listener) ) + return true; FOREACH_END() - return VLC_FALSE; + return false; } /***************************************************************************** @@ -99,12 +121,12 @@ group_contains_listener( vlc_event_listeners_group_t * group, * for instance). * p_parent_obj gives a libvlc instance */ -int vlc_event_manager_init( vlc_event_manager_t * p_em, void * p_obj, - vlc_object_t * p_parent_obj ) +int __vlc_event_manager_init( vlc_event_manager_t * p_em, void * p_obj, + vlc_object_t * p_parent_obj ) { p_em->p_obj = p_obj; p_em->p_parent_object = p_parent_obj; - vlc_mutex_init( p_parent_obj, &p_em->object_lock ); + vlc_mutex_init( &p_em->object_lock ); /* We need a recursive lock here, because we need to be able * to call libvlc_event_detach even if vlc_event_send is in @@ -112,7 +134,7 @@ int vlc_event_manager_init( vlc_event_manager_t * p_em, void * p_obj, * This ensures that after libvlc_event_detach, the callback * will never gets triggered. * */ - vlc_mutex_init_recursive( p_parent_obj, &p_em->event_sending_lock ); + vlc_mutex_init_recursive( &p_em->event_sending_lock ); ARRAY_INIT( p_em->listeners_groups ); return VLC_SUCCESS; } @@ -167,7 +189,7 @@ int vlc_event_manager_register_event_type( 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; @@ -189,7 +211,6 @@ void vlc_event_send( vlc_event_manager_t * p_em, sizeof(vlc_event_listener_t)*i_cached_listeners ); if( !array_of_cached_listeners ) { - msg_Err( p_em->p_parent_object, "Not enough memory in vlc_event_send" ); vlc_mutex_unlock( &p_em->object_lock ); return; } @@ -210,10 +231,17 @@ void vlc_event_send( vlc_event_manager_t * p_em, /* 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; + listeners_group->b_sublistener_removed = false; for( i = 0; i < i_cached_listeners; i++ ) { @@ -229,7 +257,7 @@ void vlc_event_send( vlc_event_manager_t * p_em, if( listeners_group->b_sublistener_removed ) { /* If a callback was removed, this gets called */ - vlc_bool_t valid_listener; + bool valid_listener; vlc_mutex_lock( &p_em->object_lock ); valid_listener = group_contains_listener( listeners_group, cached_listener ); vlc_mutex_unlock( &p_em->object_lock ); @@ -319,7 +347,7 @@ int vlc_event_detach( vlc_event_manager_t *p_em, { /* Tell vlc_event_send, we did remove an item from that group, in case vlc_event_send is in our caller stack */ - listeners_group->b_sublistener_removed = VLC_TRUE; + listeners_group->b_sublistener_removed = true; /* that's our listener */ ARRAY_REMOVE( listeners_group->listeners,