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

git version control git at videolan.org
Tue Jun 2 10:20:14 CEST 2009


vlc | branch: master | Pierre d'Herbemont <pdherbemont at free.fr> | Mon Jun  1 19:36:53 2009 -0700| [5d59d04c9d6f72c39f1d697afa6c5aa67164fec1] | 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=5d59d04c9d6f72c39f1d697afa6c5aa67164fec1
---

 src/control/event.c |   37 +++++++++----------------------------
 1 files changed, 9 insertions(+), 28 deletions(-)

diff --git a/src/control/event.c b/src/control/event.c
index 69d8b26..d7f0b41 100644
--- a/src/control/event.c
+++ b/src/control/event.c
@@ -93,8 +93,8 @@ void libvlc_event_manager_release( libvlc_event_manager_t * p_em )
     libvlc_event_listeners_group_t * p_lg;
     int i,j ;
 
-    vlc_mutex_lock( &p_em->event_sending_lock );
-    vlc_mutex_lock( &p_em->object_lock );
+    vlc_mutex_destroy( &p_em->event_sending_lock );
+    vlc_mutex_destroy( &p_em->object_lock );
 
     for( i = 0; i < vlc_array_count(&p_em->listeners_groups); i++)
     {
@@ -107,15 +107,7 @@ void libvlc_event_manager_release( libvlc_event_manager_t * p_em )
         free( p_lg );
     }
     vlc_array_clear( &p_em->listeners_groups );
-
-    vlc_mutex_unlock( &p_em->object_lock );
-    vlc_mutex_unlock( &p_em->event_sending_lock );
-
     libvlc_release( p_em->p_libvlc_instance );
-
-    vlc_mutex_destroy( &p_em->event_sending_lock );
-    vlc_mutex_destroy( &p_em->object_lock );
-
     free( p_em );
 }
 
@@ -130,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;
     }
@@ -145,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 );
 }
@@ -183,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;
             }
 
@@ -200,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;
     }
@@ -229,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 );
 }
 
 /*
@@ -314,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;
     }
@@ -329,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);
@@ -339,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));
@@ -364,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);
@@ -387,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