[vlc-devel] commit: Revert "libvlc_event_*: fix locking" (Pierre d'Herbemont )

git version control git at videolan.org
Tue Jun 9 07:35:50 CEST 2009


vlc | branch: 1.0-bugfix | Pierre d'Herbemont <pdherbemont at free.fr> | Mon Jun  1 19:36:53 2009 -0700| [5e857623e275d2a8ce65ee8e1deb1b88d17ee629] | committer: Pierre d'Herbemont 

Revert "libvlc_event_*: fix locking"

This reverts commit 13b7d257de1eced08708034186e290c0a5f5628a.

This is incorrect as it introduces locking the release when this should not be needed.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5e857623e275d2a8ce65ee8e1deb1b88d17ee629
---

 src/control/event.c |   27 +++++++--------------------
 1 files changed, 7 insertions(+), 20 deletions(-)

diff --git a/src/control/event.c b/src/control/event.c
index 87251db..d7f0b41 100644
--- a/src/control/event.c
+++ b/src/control/event.c
@@ -107,9 +107,7 @@ 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 );
 }
 
@@ -124,14 +122,9 @@ 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;
     }
@@ -139,6 +132,7 @@ 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 );
 }
@@ -177,7 +171,6 @@ 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;
             }
 
@@ -194,7 +187,6 @@ 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;
     }
@@ -223,10 +215,9 @@ 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 );
 }
 
 /*
@@ -308,13 +299,9 @@ 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;
     }
@@ -323,6 +310,7 @@ 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);
@@ -333,11 +321,9 @@ void libvlc_event_attach( libvlc_event_manager_t * p_event_manager,
             return;
         }
     }
-
-    free(listener);
-
     vlc_mutex_unlock( &p_event_manager->object_lock );
 
+    free(listener);
     libvlc_exception_raise( p_e,
             "This object event manager doesn't know about '%s' events",
             libvlc_event_type_name(event_type));
@@ -358,8 +344,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);
@@ -381,13 +367,14 @@ 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",




More information about the vlc-devel mailing list