Commit 5f9f9ea4 authored by Pierre d'Herbemont's avatar Pierre d'Herbemont

misc/events.c: Avoid a couple of warning and move the calling back out of the lock.

parent 6e3263c3
...@@ -64,13 +64,16 @@ typedef struct vlc_event_listeners_group_t ...@@ -64,13 +64,16 @@ typedef struct vlc_event_listeners_group_t
/** /**
* Initialize event manager object * Initialize event manager object
* p_this is the object that contains the event manager. But not * p_obj is the object that contains the event manager. But not
* necessarily a vlc_object_t (an input_item_t is not a vlc_object_t * necessarily a vlc_object_t (an input_item_t is not a vlc_object_t
* for instance). * for instance).
* p_parent_obj gives a libvlc instance
*/ */
int vlc_event_manager_init( vlc_event_manager_t * p_em, void * p_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_obj = p_obj;
vlc_mutex_init( p_parent_obj, &p_em->object_lock );
ARRAY_INIT( p_em->listeners_groups ); ARRAY_INIT( p_em->listeners_groups );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -83,6 +86,8 @@ void vlc_event_manager_fini( vlc_event_manager_t * p_em ) ...@@ -83,6 +86,8 @@ void vlc_event_manager_fini( vlc_event_manager_t * p_em )
struct vlc_event_listeners_group_t * listeners_group; struct vlc_event_listeners_group_t * listeners_group;
struct vlc_event_listener_t * listener; struct vlc_event_listener_t * listener;
vlc_mutex_destroy( &p_em->object_lock );
FOREACH_ARRAY( listeners_group, p_em->listeners_groups ) FOREACH_ARRAY( listeners_group, p_em->listeners_groups )
FOREACH_ARRAY( listener, listeners_group->listeners ) FOREACH_ARRAY( listener, listeners_group->listeners )
free( listener ); free( listener );
...@@ -106,8 +111,10 @@ int vlc_event_manager_register_event_type( ...@@ -106,8 +111,10 @@ int vlc_event_manager_register_event_type(
listeners_group->event_type = event_type; listeners_group->event_type = event_type;
ARRAY_INIT( listeners_group->listeners ); ARRAY_INIT( listeners_group->listeners );
vlc_mutex_lock( &p_em->object_lock );
ARRAY_APPEND( p_em->listeners_groups, listeners_group ); ARRAY_APPEND( p_em->listeners_groups, listeners_group );
vlc_mutex_unlock( &p_em->object_lock );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -120,26 +127,33 @@ void vlc_event_send( vlc_event_manager_t * p_em, ...@@ -120,26 +127,33 @@ void vlc_event_send( vlc_event_manager_t * p_em,
{ {
vlc_event_listeners_group_t * listeners_group; vlc_event_listeners_group_t * listeners_group;
vlc_event_listener_t * listener; vlc_event_listener_t * listener;
vlc_event_callback_t func;
void * user_data;
/* Fill event with the sending object now */ /* Fill event with the sending object now */
p_event->p_obj = p_em->p_obj; p_event->p_obj = p_em->p_obj;
vlc_mutex_lock( &p_em->object_lock );
FOREACH_ARRAY( listeners_group, p_em->listeners_groups ) FOREACH_ARRAY( listeners_group, p_em->listeners_groups )
if( listeners_group->event_type == p_event->type ) if( listeners_group->event_type == p_event->type )
{ {
/* We found the group, now send every one the event */ /* We found the group, now send every one the event */
FOREACH_ARRAY( listener, listeners_group->listeners ) FOREACH_ARRAY( listener, listeners_group->listeners )
listener->pf_callback( p_event, listener->p_user_data ); func = listener->pf_callback;
user_data = listener->p_user_data;
FOREACH_END() FOREACH_END()
break; break;
} }
FOREACH_END() FOREACH_END()
vlc_mutex_unlock( &p_em->object_lock );
func( p_event, user_data );
} }
/** /**
* Add a callback for an event. * Add a callback for an event.
*/ */
int vlc_event_attach( vlc_event_manager_t * p_event_manager, int vlc_event_attach( vlc_event_manager_t * p_em,
vlc_event_type_t event_type, vlc_event_type_t event_type,
vlc_event_callback_t pf_callback, vlc_event_callback_t pf_callback,
void *p_user_data ) void *p_user_data )
...@@ -152,15 +166,18 @@ int vlc_event_attach( vlc_event_manager_t * p_event_manager, ...@@ -152,15 +166,18 @@ int vlc_event_attach( vlc_event_manager_t * p_event_manager,
listener->p_user_data = p_user_data; listener->p_user_data = p_user_data;
listener->pf_callback = pf_callback; listener->pf_callback = pf_callback;
FOREACH_ARRAY( listeners_group, p_event_manager->listeners_groups ) vlc_mutex_lock( &p_em->object_lock );
FOREACH_ARRAY( listeners_group, p_em->listeners_groups )
if( listeners_group->event_type == event_type ) if( listeners_group->event_type == event_type )
{ {
ARRAY_APPEND( listeners_group->listeners, listener ); ARRAY_APPEND( listeners_group->listeners, listener );
vlc_mutex_unlock( &p_em->object_lock );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
FOREACH_END() FOREACH_END()
vlc_mutex_unlock( &p_em->object_lock );
free(listener); free(listener);
return VLC_EGENERIC; return VLC_EGENERIC;
} }
...@@ -168,14 +185,16 @@ int vlc_event_attach( vlc_event_manager_t * p_event_manager, ...@@ -168,14 +185,16 @@ int vlc_event_attach( vlc_event_manager_t * p_event_manager,
/** /**
* Remove a callback for an event. * Remove a callback for an event.
*/ */
int vlc_event_detach( vlc_event_manager_t *p_event_manager, int vlc_event_detach( vlc_event_manager_t *p_em,
vlc_event_type_t event_type, vlc_event_type_t event_type,
vlc_event_callback_t pf_callback, vlc_event_callback_t pf_callback,
void *p_user_data ) void *p_user_data )
{ {
vlc_event_listeners_group_t * listeners_group; vlc_event_listeners_group_t * listeners_group;
struct vlc_event_listener_t * listener; struct vlc_event_listener_t * listener;
FOREACH_ARRAY( listeners_group, p_event_manager->listeners_groups )
vlc_mutex_lock( &p_em->object_lock );
FOREACH_ARRAY( listeners_group, p_em->listeners_groups )
if( listeners_group->event_type == event_type ) if( listeners_group->event_type == event_type )
{ {
FOREACH_ARRAY( listener, listeners_group->listeners ) FOREACH_ARRAY( listener, listeners_group->listeners )
...@@ -183,15 +202,17 @@ int vlc_event_detach( vlc_event_manager_t *p_event_manager, ...@@ -183,15 +202,17 @@ int vlc_event_detach( vlc_event_manager_t *p_event_manager,
listener->p_user_data == p_user_data ) listener->p_user_data == p_user_data )
{ {
/* that's our listener */ /* that's our listener */
free( listener );
ARRAY_REMOVE( listeners_group->listeners, ARRAY_REMOVE( listeners_group->listeners,
fe_idx /* This comes from the macro (and that's why fe_idx /* This comes from the macro (and that's why
I hate macro) */ ); I hate macro) */ );
free( listener );
vlc_mutex_unlock( &p_em->object_lock );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
FOREACH_END() FOREACH_END()
} }
FOREACH_END() FOREACH_END()
vlc_mutex_unlock( &p_em->object_lock );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
......
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