Changeset 5f9f9ea47f81cfa7350e2930495602cc1137b2d7

Show
Ignore:
Timestamp:
17/08/07 04:15:59 (1 year ago)
Author:
Pierre d'Herbemont <pdherbemont@videolan.org>
git-committer:
Pierre d'Herbemont <pdherbemont@videolan.org> 1187316959 +0000
git-parent:

[6e3263c3d6fe0e9bfed279f8e10fca0d20df10a6]

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

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

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/misc/events.c

    r5d963f0 r5f9f9ea  
    6565/** 
    6666 * Initialize event manager object 
    67  * p_this is the object that contains the event manager. But not 
     67 * p_obj is the object that contains the event manager. But not 
    6868 * necessarily a vlc_object_t (an input_item_t is not a vlc_object_t 
    6969 * for instance). 
    70  */ 
    71 int vlc_event_manager_init( vlc_event_manager_t * p_em, void * p_obj ) 
     70 * p_parent_obj gives a libvlc instance 
     71 */ 
     72int vlc_event_manager_init( vlc_event_manager_t * p_em, void * p_obj, 
     73                            vlc_object_t * p_parent_obj ) 
    7274{ 
    7375    p_em->p_obj = p_obj; 
     76    vlc_mutex_init( p_parent_obj, &p_em->object_lock ); 
    7477    ARRAY_INIT( p_em->listeners_groups ); 
    7578    return VLC_SUCCESS; 
     
    8386    struct vlc_event_listeners_group_t * listeners_group; 
    8487    struct vlc_event_listener_t * listener; 
     88 
     89    vlc_mutex_destroy( &p_em->object_lock ); 
    8590 
    8691    FOREACH_ARRAY( listeners_group, p_em->listeners_groups ) 
     
    107112    listeners_group->event_type = event_type; 
    108113    ARRAY_INIT( listeners_group->listeners ); 
    109  
     114     
     115    vlc_mutex_lock( &p_em->object_lock ); 
    110116    ARRAY_APPEND( p_em->listeners_groups, listeners_group ); 
     117    vlc_mutex_unlock( &p_em->object_lock ); 
    111118 
    112119    return VLC_SUCCESS; 
     
    121128    vlc_event_listeners_group_t * listeners_group; 
    122129    vlc_event_listener_t * listener; 
     130    vlc_event_callback_t func; 
     131    void * user_data; 
    123132 
    124133    /* Fill event with the sending object now */ 
    125134    p_event->p_obj = p_em->p_obj; 
    126135 
     136    vlc_mutex_lock( &p_em->object_lock ); 
    127137    FOREACH_ARRAY( listeners_group, p_em->listeners_groups ) 
    128138        if( listeners_group->event_type == p_event->type ) 
     
    130140            /* We found the group, now send every one the event */ 
    131141            FOREACH_ARRAY( listener, listeners_group->listeners ) 
    132                 listener->pf_callback( p_event, listener->p_user_data ); 
     142                func = listener->pf_callback; 
     143                user_data = listener->p_user_data; 
    133144            FOREACH_END() 
    134145            break; 
    135146        } 
    136147    FOREACH_END() 
     148    vlc_mutex_unlock( &p_em->object_lock ); 
     149     
     150    func( p_event, user_data ); 
    137151} 
    138152 
     
    140154 * Add a callback for an event. 
    141155 */ 
    142 int vlc_event_attach( vlc_event_manager_t * p_event_manager
     156int vlc_event_attach( vlc_event_manager_t * p_em
    143157                      vlc_event_type_t event_type, 
    144158                      vlc_event_callback_t pf_callback, 
     
    153167    listener->p_user_data = p_user_data; 
    154168    listener->pf_callback = pf_callback; 
    155      
    156     FOREACH_ARRAY( listeners_group, p_event_manager->listeners_groups ) 
     169 
     170    vlc_mutex_lock( &p_em->object_lock ); 
     171    FOREACH_ARRAY( listeners_group, p_em->listeners_groups ) 
    157172        if( listeners_group->event_type == event_type ) 
    158173        { 
    159174            ARRAY_APPEND( listeners_group->listeners, listener ); 
     175            vlc_mutex_unlock( &p_em->object_lock ); 
    160176            return VLC_SUCCESS; 
    161177        } 
    162178    FOREACH_END() 
    163      
     179    vlc_mutex_unlock( &p_em->object_lock ); 
     180 
    164181    free(listener); 
    165182    return VLC_EGENERIC; 
     
    169186 * Remove a callback for an event. 
    170187 */ 
    171 int vlc_event_detach( vlc_event_manager_t *p_event_manager
     188int vlc_event_detach( vlc_event_manager_t *p_em
    172189                      vlc_event_type_t event_type, 
    173190                      vlc_event_callback_t pf_callback, 
     
    176193    vlc_event_listeners_group_t * listeners_group; 
    177194    struct vlc_event_listener_t * listener; 
    178     FOREACH_ARRAY( listeners_group, p_event_manager->listeners_groups ) 
     195 
     196    vlc_mutex_lock( &p_em->object_lock ); 
     197    FOREACH_ARRAY( listeners_group, p_em->listeners_groups ) 
    179198        if( listeners_group->event_type == event_type ) 
    180199        { 
     
    184203                { 
    185204                    /* that's our listener */ 
    186                     free( listener ); 
    187205                    ARRAY_REMOVE( listeners_group->listeners, 
    188206                        fe_idx /* This comes from the macro (and that's why 
    189207                                  I hate macro) */ ); 
     208                    free( listener ); 
     209                    vlc_mutex_unlock( &p_em->object_lock ); 
    190210                    return VLC_SUCCESS; 
    191211                } 
     
    193213        } 
    194214    FOREACH_END() 
     215    vlc_mutex_unlock( &p_em->object_lock ); 
    195216 
    196217    return VLC_EGENERIC;