[vlc-devel] commit: libvlc_event_*: fix locking (Jean-Paul Saman )

Pierre d'Herbemont pdherbemont at free.fr
Mon May 25 11:55:29 CEST 2009


What were you trying to fix. This should break event handling.

Could you add a test case for the specific thing you were trying to fix?

On Sun, May 24, 2009 at 3:36 PM, git version control <git at videolan.org> wrote:
> vlc | branch: 1.0-bugfix | Jean-Paul Saman <jpsaman at videolan.org> | Tue May 12 12:39:50 2009 +0200| [d600db5f113edd122ec12be9c589e27fcbed4917] | committer: Jean-Paul Saman
>
> libvlc_event_*: fix locking
> (cherry picked from commit 13b7d257de1eced08708034186e290c0a5f5628a)
>
> Reverted change to libvlc_event_manger_release().
>
>> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d600db5f113edd122ec12be9c589e27fcbed4917
> ---
>
>  src/control/event.c |   27 ++++++++++++++++++++-------
>  1 files changed, 20 insertions(+), 7 deletions(-)
>
> diff --git a/src/control/event.c b/src/control/event.c
> index d7f0b41..87251db 100644
> --- a/src/control/event.c
> +++ b/src/control/event.c
> @@ -107,7 +107,9 @@ void libvlc_event_manager_release( libvlc_event_manager_t * p_em )
>         free( p_lg );
>     }
>     vlc_array_clear( &p_em->listeners_groups );
> +
>     libvlc_release( p_em->p_libvlc_instance );
> +
>     free( p_em );
>  }
>
> @@ -122,9 +124,14 @@ void libvlc_event_manager_register_event_type(
>         libvlc_exception_t * p_e )
>  {
>     libvlc_event_listeners_group_t * listeners_group;
> +
> +    vlc_mutex_lock( &p_em->object_lock );
> +
>     listeners_group = malloc(sizeof(libvlc_event_listeners_group_t));
>     if( !listeners_group )
>     {
> +        vlc_mutex_unlock( &p_em->object_lock );
> +
>         libvlc_exception_raise( p_e, "No Memory left" );
>         return;
>     }
> @@ -132,7 +139,6 @@ void libvlc_event_manager_register_event_type(
>     listeners_group->event_type = event_type;
>     vlc_array_init( &listeners_group->listeners );
>
> -    vlc_mutex_lock( &p_em->object_lock );
>     vlc_array_append( &p_em->listeners_groups, listeners_group );
>     vlc_mutex_unlock( &p_em->object_lock );
>  }
> @@ -171,6 +177,7 @@ void libvlc_event_send( libvlc_event_manager_t * p_em,
>             if( !array_listeners_cached )
>             {
>                 fprintf(stderr, "Can't alloc memory in libvlc_event_send" );
> +                vlc_mutex_unlock( &p_em->object_lock );
>                 return;
>             }
>
> @@ -187,6 +194,7 @@ void libvlc_event_send( libvlc_event_manager_t * p_em,
>
>     if( !listeners_group )
>     {
> +        vlc_mutex_unlock( &p_em->object_lock );
>         free( array_listeners_cached );
>         return;
>     }
> @@ -215,9 +223,10 @@ void libvlc_event_send( libvlc_event_manager_t * p_em,
>         listener_cached->pf_callback( p_event, listener_cached->p_user_data );
>         listener_cached++;
>     }
> -    vlc_mutex_unlock( &p_em->event_sending_lock );
>
>     free( array_listeners_cached );
> +
> +    vlc_mutex_unlock( &p_em->event_sending_lock );
>  }
>
>  /*
> @@ -299,9 +308,13 @@ void libvlc_event_attach( libvlc_event_manager_t * p_event_manager,
>     libvlc_event_listener_t * listener;
>     int i;
>
> +    vlc_mutex_lock( &p_event_manager->object_lock );
> +
>     listener = malloc(sizeof(libvlc_event_listener_t));
>     if( !listener )
>     {
> +        vlc_mutex_unlock( &p_event_manager->object_lock );
> +
>         libvlc_exception_raise( p_e, "No Memory left" );
>         return;
>     }
> @@ -310,7 +323,6 @@ void libvlc_event_attach( libvlc_event_manager_t * p_event_manager,
>     listener->p_user_data = p_user_data;
>     listener->pf_callback = pf_callback;
>
> -    vlc_mutex_lock( &p_event_manager->object_lock );
>     for( i = 0; i < vlc_array_count(&p_event_manager->listeners_groups); i++ )
>     {
>         listeners_group = vlc_array_item_at_index(&p_event_manager->listeners_groups, i);
> @@ -321,9 +333,11 @@ void libvlc_event_attach( libvlc_event_manager_t * p_event_manager,
>             return;
>         }
>     }
> -    vlc_mutex_unlock( &p_event_manager->object_lock );
>
>     free(listener);
> +
> +    vlc_mutex_unlock( &p_event_manager->object_lock );
> +
>     libvlc_exception_raise( p_e,
>             "This object event manager doesn't know about '%s' events",
>             libvlc_event_type_name(event_type));
> @@ -344,8 +358,8 @@ void libvlc_event_detach( libvlc_event_manager_t *p_event_manager,
>     libvlc_event_listener_t * listener;
>     int i, j;
>
> -    vlc_mutex_lock( &p_event_manager->event_sending_lock );
>     vlc_mutex_lock( &p_event_manager->object_lock );
> +
>     for( i = 0; i < vlc_array_count(&p_event_manager->listeners_groups); i++)
>     {
>         listeners_group = vlc_array_item_at_index(&p_event_manager->listeners_groups, i);
> @@ -367,14 +381,13 @@ void libvlc_event_detach( libvlc_event_manager_t *p_event_manager,
>                     free( listener );
>                     vlc_array_remove( &listeners_group->listeners, j );
>                     vlc_mutex_unlock( &p_event_manager->object_lock );
> -                    vlc_mutex_unlock( &p_event_manager->event_sending_lock );
>                     return;
>                 }
>             }
>         }
>     }
> +
>     vlc_mutex_unlock( &p_event_manager->object_lock );
> -    vlc_mutex_unlock( &p_event_manager->event_sending_lock );
>
>     libvlc_exception_raise( p_e,
>             "This object event manager doesn't know about '%s,%p,%p' event observer",
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel
>



More information about the vlc-devel mailing list