Changeset 257fdd4aead1f254c01cb4d1132a14cd5e0389a4

Show
Ignore:
Timestamp:
27/08/07 20:49:07 (1 year ago)
Author:
Pierre d'Herbemont <pdherbemont@videolan.org>
git-committer:
Pierre d'Herbemont <pdherbemont@videolan.org> 1188240547 +0000
git-parent:

[00749a2f54c87f20dfea50f5574e234702ef6433]

git-author:
Pierre d'Herbemont <pdherbemont@videolan.org> 1188240547 +0000
Message:

control/event.c: Locking for libvlc event.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/control/event.c

    r8239a93 r257fdd4  
    7777    p_em->p_libvlc_instance = p_libvlc_inst; 
    7878    ARRAY_INIT( p_em->listeners_groups ); 
     79    vlc_mutex_init( p_libvlc_inst->p_libvlc_int, &p_em->object_lock ); 
    7980 
    8081    return p_em; 
     
    9091    libvlc_event_listeners_group_t * listeners_group; 
    9192    libvlc_event_listener_t * listener; 
     93 
     94    vlc_mutex_destroy( &p_em->object_lock ); 
    9295 
    9396    FOREACH_ARRAY( listeners_group, p_em->listeners_groups ) 
     
    121124    ARRAY_INIT( listeners_group->listeners ); 
    122125 
     126    vlc_mutex_lock( &p_em->object_lock ); 
    123127    ARRAY_APPEND( p_em->listeners_groups, listeners_group ); 
     128    vlc_mutex_unlock( &p_em->object_lock ); 
    124129} 
    125130 
     
    133138{ 
    134139    libvlc_event_listeners_group_t * listeners_group; 
    135     libvlc_event_listener_t * listener; 
     140    libvlc_event_listener_t * listener_cached; 
     141    libvlc_event_listener_t * listener; 
     142    libvlc_event_listener_t * array_listeners_cached = NULL; 
     143    int i, i_cached_listeners = 0; 
     144 
    136145    /* Fill event with the sending object now */ 
    137146    p_event->p_obj = p_em->p_obj; 
    138147 
     148    vlc_mutex_lock( &p_em->object_lock ); 
    139149    FOREACH_ARRAY( listeners_group, p_em->listeners_groups ) 
    140150        if( listeners_group->event_type == p_event->type ) 
    141151        { 
    142             /* We found the group, now send every one the event */ 
     152            if( listeners_group->listeners.i_size <= 0 ) 
     153                break; 
     154 
     155            /* Cache a copy of the listener to avoid locking issues */ 
     156            i_cached_listeners = listeners_group->listeners.i_size; 
     157            array_listeners_cached = malloc(sizeof(libvlc_event_listener_t)*(i_cached_listeners)); 
     158            if( !array_listeners_cached ) 
     159            { 
     160                printf( "Can't alloc memory in libvlc_event_send" ); 
     161                break; 
     162            } 
     163 
     164            listener_cached = array_listeners_cached; 
    143165            FOREACH_ARRAY( listener, listeners_group->listeners ) 
    144                 listener->pf_callback( p_event, listener->p_user_data ); 
     166                memcpy( listener_cached, listener, sizeof(libvlc_event_listener_t)); 
     167                listener_cached += sizeof(libvlc_event_listener_t) ; 
    145168            FOREACH_END() 
    146169            break; 
    147170        } 
    148171    FOREACH_END() 
     172    vlc_mutex_unlock( &p_em->object_lock ); 
     173 
     174    listener_cached = array_listeners_cached; 
     175    for( i = 0; i < i_cached_listeners; i++ ) 
     176    { 
     177        listener_cached->pf_callback( p_event, listener_cached->p_user_data ); 
     178        listener_cached += sizeof(libvlc_event_listener_t) ; 
     179    } 
     180    free( array_listeners_cached ); 
    149181} 
    150182 
     
    176208    listener->p_user_data = p_user_data; 
    177209    listener->pf_callback = pf_callback; 
    178      
     210 
     211    vlc_mutex_lock( &p_event_manager->object_lock ); 
    179212    FOREACH_ARRAY( listeners_group, p_event_manager->listeners_groups ) 
    180213        if( listeners_group->event_type == listener->event_type ) 
    181214        { 
    182215            ARRAY_APPEND( listeners_group->listeners, listener ); 
     216            vlc_mutex_unlock( &p_event_manager->object_lock ); 
    183217            return; 
    184218        } 
    185219    FOREACH_END() 
    186      
     220    vlc_mutex_unlock( &p_event_manager->object_lock ); 
     221 
    187222    free(listener); 
    188223    libvlc_exception_raise( p_e, 
     
    204239    libvlc_event_listeners_group_t * listeners_group; 
    205240    libvlc_event_listener_t * listener; 
     241 
     242    vlc_mutex_lock( &p_event_manager->object_lock ); 
    206243    FOREACH_ARRAY( listeners_group, p_event_manager->listeners_groups ) 
    207244        if( listeners_group->event_type == event_type ) 
     
    217254                        fe_idx /* This comes from the macro (and that's why 
    218255                                  I hate macro) */ ); 
     256                    vlc_mutex_unlock( &p_event_manager->object_lock ); 
    219257                    return; 
    220258                } 
     
    222260        } 
    223261    FOREACH_END() 
     262    vlc_mutex_unlock( &p_event_manager->object_lock ); 
    224263 
    225264    libvlc_exception_raise( p_e, 
     
    227266            event_type, pf_callback, p_user_data ); 
    228267} 
    229  
  • src/control/libvlc_internal.h

    r48586f5 r257fdd4  
    224224    struct libvlc_instance_t * p_libvlc_instance; 
    225225    DECL_ARRAY(libvlc_event_listeners_group_t *) listeners_groups; 
     226    vlc_mutex_t object_lock; 
    226227} libvlc_event_sender_t; 
    227228 
     
    248249 
    249250/* Media List */ 
    250 VLC_EXPORT ( void, libvlc_media_list_flat_media_list_release, 
    251                         ( libvlc_media_list_t * ) ); 
     251VLC_EXPORT ( void, libvlc_media_list_flat_media_list_release, ( libvlc_media_list_t * ) ); 
    252252 
    253253/* Events */