Changeset 91d93983e61dbc6cc7392fdfc71fede68dec7a5b

Show
Ignore:
Timestamp:
14/12/04 12:40:09 (4 years ago)
Author:
Clément Stenac <zorglub@videolan.org>
git-committer:
Clément Stenac <zorglub@videolan.org> 1103024409 +0000
git-parent:

[5d3edb82f37d177671789808248251bfdeaf7fd1]

git-author:
Clément Stenac <zorglub@videolan.org> 1103024409 +0000
Message:

* Provide playlist_LockFoo functions for some functions
* Fix deadlock with preparse

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • include/vlc_playlist.h

    r01aca2c r91d9398  
    8080}; 
    8181 
    82 #define PLAYLIST_SAVE_FLAG      0x1     /**< Must it be saved */ 
    83 #define PLAYLIST_SKIP_FLAG      0x2     /**< Must playlist skip after it ? */ 
    84 #define PLAYLIST_ENA_FLAG       0x4     /**< Is it enabled ? */ 
    85 #define PLAYLIST_DEL_FLAG       0x8     /**< Autodelete ? */ 
     82#define PLAYLIST_SAVE_FLAG      0x01     /**< Must it be saved */ 
     83#define PLAYLIST_SKIP_FLAG      0x02     /**< Must playlist skip after it ? */ 
     84#define PLAYLIST_ENA_FLAG       0x04     /**< Is it enabled ? */ 
     85#define PLAYLIST_DEL_FLAG       0x08     /**< Autodelete ? */ 
     86#define PLAYLIST_RO_FLAG        0x10    /**< Write-enabled ? */ 
    8687 
    8788/** 
     
    248249 
    249250VLC_EXPORT( int,  playlist_Clear, ( playlist_t * ) ); 
     251VLC_EXPORT( int,  playlist_LockClear, ( playlist_t * ) ); 
    250252 
    251253VLC_EXPORT( int, playlist_PreparseEnqueue, (playlist_t *, input_item_t *) ); 
     
    312314/* Misc item operations (act on item+playlist) */ 
    313315VLC_EXPORT( int,  playlist_Delete, ( playlist_t *, int ) ); 
     316VLC_EXPORT( int,  playlist_LockDelete, ( playlist_t *, int ) ); 
    314317VLC_EXPORT( int,  playlist_Disable, ( playlist_t *, playlist_item_t * ) ); 
    315318VLC_EXPORT( int,  playlist_Enable, ( playlist_t *, playlist_item_t * ) ); 
    316319VLC_EXPORT( int, playlist_ItemToNode, (playlist_t *,playlist_item_t *) ); 
     320VLC_EXPORT( int, playlist_LockItemToNode, (playlist_t *,playlist_item_t *) ); 
    317321VLC_EXPORT( int, playlist_Replace, (playlist_t *,playlist_item_t *, input_item_t*) ); 
     322VLC_EXPORT( int, playlist_LockReplace, (playlist_t *,playlist_item_t *, input_item_t*) ); 
    318323 
    319324 
    320325/* Item search functions */ 
    321326VLC_EXPORT( playlist_item_t *, playlist_ItemGetById, (playlist_t *, int) ); 
     327VLC_EXPORT( playlist_item_t *, playlist_LockItemGetById, (playlist_t *, int) ); 
    322328VLC_EXPORT( playlist_item_t *, playlist_ItemGetByPos, (playlist_t *, int) ); 
     329VLC_EXPORT( playlist_item_t *, playlist_LockItemGetByPos, (playlist_t *, int) ); 
     330VLC_EXPORT( playlist_item_t *, playlist_ItemGetByInput, (playlist_t *,input_item_t * ) ); 
     331VLC_EXPORT( playlist_item_t *, playlist_LockItemGetByInput, (playlist_t *,input_item_t * ) ); 
    323332VLC_EXPORT( int, playlist_GetPositionById, (playlist_t *,int ) ); 
    324 VLC_EXPORT( playlist_item_t *, playlist_ItemGetByInput, (playlist_t *,input_item_t * ) ); 
    325333 
    326334/* Info functions */ 
  • modules/access/cdda/info.c

    rc569f53 r91d9398  
    921921    } 
    922922 
    923     p_item = playlist_ItemGetByInput( p_playlist, 
     923    p_item = playlist_LockItemGetByInput( p_playlist, 
    924924                        ((input_thread_t *)p_access->p_parent)->input.p_item ); 
    925925 
  • modules/access/directory.c

    r5a6a1bd r91d9398  
    229229        input_item_t *p_current = ( (input_thread_t*)p_access->p_parent)-> 
    230230                                                        input.p_item; 
    231         p_item = playlist_ItemGetByInput( p_playlist, p_current ); 
     231        p_item = playlist_LockItemGetByInput( p_playlist, p_current ); 
    232232        msg_Dbg( p_access, "not starting directory playback"); 
    233233        if( !p_item ) 
  • modules/access/vcdx/access.c

    r6c4b8e5 r91d9398  
    13651365                          p_playlist->i_index); 
    13661366 
    1367     }  
    1368   else  
     1367    } 
     1368  else 
    13691369    { 
    13701370    vcdinfo_itemid_t list_itemid; 
    13711371    list_itemid.type=VCDINFO_ITEM_TYPE_ENTRY; 
    13721372 
    1373     playlist_Delete( p_playlist, p_playlist->i_index); 
     1373    playlist_LockDelete( p_playlist, p_playlist->i_index); 
    13741374 
    13751375    for( i = 0 ; i < p_vcd->num_entries ; i++ ) 
  • modules/control/http.c

    ra90a19a r91d9398  
    18911891                            } 
    18921892 
    1893                             playlist_Delete( p_sys->p_playlist, 
     1893                            playlist_LockDelete( p_sys->p_playlist, 
    18941894                                             p_items[i_index] ); 
    18951895                            msg_Dbg( p_intf, "requested playlist delete: %d", 
     
    19311931                        if( j == i_nb_items ) 
    19321932                        { 
    1933                             playlist_Delete( p_sys->p_playlist, i ); 
     1933                            playlist_LockDelete( p_sys->p_playlist, i ); 
    19341934                            msg_Dbg( p_intf, "requested playlist delete: %d", 
    19351935                                     i ); 
     
    19421942                case MVLC_EMPTY: 
    19431943                { 
    1944                     while( p_sys->p_playlist->i_size > 0 ) 
    1945                     { 
    1946                         playlist_Delete( p_sys->p_playlist, 0 ); 
    1947                     } 
     1944                    playlist_LockClear( p_sys->p_playlist ); 
    19481945                    msg_Dbg( p_intf, "requested playlist empty" ); 
    19491946                    break; 
  • modules/demux/m3u.c

    ra90a19a r91d9398  
    653653         input_item_t *p_current = 
    654654             ((input_thread_t*)p_demux->p_parent)->input.p_item; 
    655          *pp_item = playlist_ItemGetByInput( p_playlist, p_current ); 
     655         *pp_item = playlist_LockItemGetByInput( p_playlist, p_current ); 
    656656 
    657657         if( !*pp_item ) 
  • modules/demux/mp4/mp4.c

    ra90a19a r91d9398  
    339339        if( p_playlist ) 
    340340        { 
    341             p_item = playlist_ItemGetByInput( p_playlist, 
     341            p_item = playlist_LockItemGetByInput( p_playlist, 
    342342                      ((input_thread_t *)p_demux->p_parent)->input.p_item ); 
    343343            playlist_ItemToNode( p_playlist, p_item ); 
  • modules/demux/playlist/playlist.c

    r3fdff4b r91d9398  
    128128         input_item_t *p_current = ( (input_thread_t*)p_demux->p_parent)-> 
    129129                                                        input.p_item; 
    130          *pp_item = playlist_ItemGetByInput( p_playlist, p_current ); 
     130         *pp_item = playlist_LockItemGetByInput( p_playlist, p_current ); 
    131131         if( !*pp_item ) 
    132132         { 
  • modules/gui/gtk/playlist.c

    r562ab59 r91d9398  
    507507    playlist_t * p_playlist = param; 
    508508 
    509     playlist_Delete( p_playlist, i_cur_row ); 
     509    playlist_LockDelete( p_playlist, i_cur_row ); 
    510510} 
    511511 
  • modules/gui/macosx/playlist.m

    r5d3edb8 r91d9398  
    315315                playlist_Stop( p_playlist ); 
    316316            } 
    317             playlist_Delete( p_playlist, p_item->input.i_id ); 
     317            playlist_LockDelete( p_playlist, p_item->input.i_id ); 
    318318        } 
    319319        [self playlistUpdated]; 
  • modules/gui/ncurses.c

    ra90a19a r91d9398  
    420420                int i_item = p_sys->p_playlist->i_index; 
    421421 
    422                 playlist_Delete( p_sys->p_playlist, p_sys->i_box_plidx ); 
    423                 if( i_item < p_sys->p_playlist->i_size && i_item != p_sys->p_playlist->i_index ) 
     422                playlist_LockDelete( p_sys->p_playlist, p_sys->i_box_plidx ); 
     423                if( i_item < p_sys->p_playlist->i_size && 
     424                    i_item != p_sys->p_playlist->i_index ) 
    424425                { 
    425426                    playlist_Goto( p_sys->p_playlist, i_item ); 
  • modules/gui/pda/pda_callbacks.c

    r65fd1e9 r91d9398  
    874874                p_rows = g_list_reverse( p_rows ); 
    875875            } 
    876      
     876 
    877877            for (p_node=p_rows; p_node!=NULL; p_node = p_node->next) 
    878878            { 
     
    888888 
    889889                        gtk_tree_model_get(p_model, &iter, 2, &item, -1); 
    890                         playlist_Delete(p_playlist, item); 
     890                        playlist_LockDelete(p_playlist, item); 
    891891                    } 
    892892                } 
     
    930930    for(item = p_playlist->i_size - 1; item >= 0 ;item-- ) 
    931931    { 
    932         playlist_Delete( p_playlist, item); 
     932        playlist_LockDelete( p_playlist, item); 
    933933    } 
    934934    vlc_object_release( p_playlist ); 
  • modules/gui/skins2/vars/playlist.cpp

    rb851c88 r91d9398  
    6565        if( (*it).m_selected ) 
    6666        { 
    67             playlist_item_t *p_item = playlist_ItemGetByPos( m_pPlaylist, 
    68                                                              index ); 
    69             playlist_Delete( m_pPlaylist, p_item->input.i_id ); 
     67            playlist_item_t *p_item = playlist_LockItemGetByPos( m_pPlaylist, 
     68                                                                 index ); 
     69            playlist_LockDelete( m_pPlaylist, p_item->input.i_id ); 
    7070        } 
    7171        else 
  • modules/gui/wxwindows/dialogs.cpp

    r542b992 r91d9398  
    391391                                             (const char *)path.mb_str(), 
    392392                                             PLAYLIST_APPEND, PLAYLIST_END ); 
    393         p_item = playlist_ItemGetById( p_playlist, i_id ); 
     393        p_item = playlist_LockItemGetById( p_playlist, i_id ); 
    394394        if( p_item ) 
    395395        { 
  • modules/gui/wxwindows/playlist.cpp

    r9de73f4 r91d9398  
    620620    } 
    621621 
    622     p_item = playlist_ItemGetById( p_playlist, i ); 
     622    p_item = playlist_LockItemGetById( p_playlist, i ); 
    623623 
    624624    wxTreeItemId item = FindItem( treectrl->GetRootItem(), p_item); 
     
    924924    } 
    925925 
    926     playlist_Delete( p_playlist, item_id ); 
     926    playlist_LockDelete( p_playlist, item_id ); 
    927927 
    928928    vlc_object_release( p_playlist ); 
     
    14811481        if( p_popup_item->i_children == -1 ) 
    14821482        { 
     1483            wxMutexGuiLeave(); 
    14831484            playlist_PreparseEnqueue( p_playlist, &p_popup_item->input ); 
     1485            wxMutexGuiEnter(); 
    14841486        } 
    14851487        else 
  • modules/services_discovery/sap.c

    ra90a19a r91d9398  
    13761376    if( p_announce->p_item ) 
    13771377    { 
    1378         playlist_Delete( p_playlist, p_announce->p_item->input.i_id ); 
     1378        playlist_LockDelete( p_playlist, p_announce->p_item->input.i_id ); 
    13791379    } 
    13801380 
  • modules/visualization/xosd.c

    rd090e47 r91d9398  
    241241            { 
    242242    //           vlc_mutex_lock(&p_playlist->object_lock ); 
    243                  p_item = playlist_ItemGetByPos( p_playlist, 
    244                                  p_playlist->i_index ); 
     243                 p_item = p_playlist->status.p_item; 
    245244                item = p_item->input; 
    246245                if( !p_item ) 
  • src/playlist/item-ext.c

    r0aed16b r91d9398  
    437437} 
    438438 
     439playlist_item_t *playlist_LockItemGetByPos( playlist_t *p_playlist, int i_pos ) 
     440{ 
     441    playlist_item_t *p_ret; 
     442    vlc_mutex_lock( &p_playlist->object_lock ); 
     443    p_ret = playlist_ItemGetByPos( p_playlist, i_pos ); 
     444    vlc_mutex_unlock( &p_playlist->object_lock ); 
     445    return p_ret; 
     446} 
     447 
    439448/** 
    440449 * Search an item by its id 
     
    457466} 
    458467 
     468playlist_item_t *playlist_LockItemGetById( playlist_t *p_playlist, int i_id) 
     469{ 
     470    playlist_item_t *p_ret; 
     471    vlc_mutex_lock( &p_playlist->object_lock ); 
     472    p_ret = playlist_ItemGetById( p_playlist, i_id ); 
     473    vlc_mutex_unlock( &p_playlist->object_lock ); 
     474    return p_ret; 
     475} 
     476 
    459477/** 
    460478 * Search an item by its input_item_t 
     
    483501} 
    484502 
     503playlist_item_t *playlist_LockItemGetByInput( playlist_t *p_playlist, 
     504                                               input_item_t *p_item ) 
     505{ 
     506    playlist_item_t *p_ret; 
     507    vlc_mutex_lock( &p_playlist->object_lock ); 
     508    p_ret = playlist_ItemGetByInput( p_playlist, p_item ); 
     509    vlc_mutex_unlock( &p_playlist->object_lock ); 
     510    return p_ret; 
     511} 
    485512 
    486513 
     
    506533    } 
    507534 
    508     vlc_mutex_lock( &p_playlist->object_lock ); 
    509  
    510535    /* Remove it from the array of available items */ 
    511536    for( i = 0 ; i < p_playlist->i_size ; i++ ) 
     
    516541        } 
    517542    } 
    518     vlc_mutex_unlock( &p_playlist->object_lock ); 
    519543    var_SetInteger( p_playlist, "item-change", p_item->input.i_id ); 
    520544 
    521545    return VLC_SUCCESS; 
     546} 
     547 
     548int playlist_LockItemToNode( playlist_t *p_playlist, playlist_item_t *p_item ) 
     549{ 
     550    int i_ret; 
     551    vlc_mutex_lock( &p_playlist->object_lock ); 
     552    i_ret = playlist_ItemToNode( p_playlist, p_item ); 
     553    vlc_mutex_unlock( &p_playlist->object_lock ); 
     554    return i_ret; 
    522555} 
    523556 
     
    528561 * \see playlist_Replace 
    529562 */ 
    530 int playlist_LockAndReplace( playlist_t *p_playlist, 
     563int playlist_LockReplace( playlist_t *p_playlist, 
    531564                             playlist_item_t *p_olditem, 
    532565                             input_item_t *p_new ) 
     
    605638    if( p_playlist->status.p_item == p_item ) 
    606639    { 
    607         playlist_Control( p_playlist, PLAYLIST_STOP ); 
     640        /* Hack we don't call playlist_Control for lock reasons */ 
     641        p_playlist->status.i_status = PLAYLIST_STOPPED; 
     642        p_playlist->request.b_request = VLC_TRUE; 
    608643        p_playlist->status.p_item = NULL; 
    609644    } 
    610  
    611     vlc_mutex_lock( &p_playlist->object_lock ); 
    612645 
    613646    msg_Dbg( p_playlist, "deleting playlist item `%s'", 
     
    629662    playlist_ItemDelete( p_item ); 
    630663 
    631     vlc_mutex_unlock( &p_playlist->object_lock ); 
    632  
    633664    return VLC_SUCCESS; 
     665} 
     666 
     667int playlist_LockDelete( playlist_t * p_playlist, int i_id ) 
     668{ 
     669    int i_ret; 
     670    vlc_mutex_lock( &p_playlist->object_lock ); 
     671    i_ret = playlist_Delete( p_playlist, i_id ); 
     672    vlc_mutex_unlock( &p_playlist->object_lock ); 
     673    return i_ret; 
    634674} 
    635675 
     
    653693    } 
    654694    return VLC_SUCCESS; 
     695} 
     696 
     697int playlist_LockClear( playlist_t *p_playlist ) 
     698{ 
     699    int i_ret; 
     700    vlc_mutex_lock( &p_playlist->object_lock ); 
     701    playlist_Clear( p_playlist ); 
     702    vlc_mutex_unlock( &p_playlist->object_lock ); 
     703    return i_ret; 
    655704} 
    656705 
  • src/playlist/playlist.c

    r0aed16b r91d9398  
    128128    p_playlist->p_general = playlist_NodeCreate( p_playlist, VIEW_CATEGORY, 
    129129                                        _( "General" ), p_view->p_root ); 
     130    p_playlist->p_general->i_flags |= PLAYLIST_RO_FLAG; 
    130131 
    131132    /* Set startup status 
     
    573574                if( p_autodelete_item ) 
    574575                { 
    575                     vlc_mutex_unlock( &p_playlist->object_lock ); 
    576576                    playlist_Delete( p_playlist, 
    577577                                     p_autodelete_item->input.i_id ); 
    578                     vlc_mutex_lock( &p_playlist->object_lock ); 
    579578                    p_autodelete_item = NULL; 
    580579                } 
     
    588587            if( p_autodelete_item ) 
    589588            { 
    590                 vlc_mutex_unlock( &p_playlist->object_lock ); 
    591589                playlist_Delete( p_playlist, p_autodelete_item->input.i_id ); 
    592                 vlc_mutex_lock( &p_playlist->object_lock ); 
    593590                p_autodelete_item = NULL; 
    594591            } 
     
    771768    } 
    772769 
    773     if( !p_playlist->request.b_request && p_playlist->status.p_item &&  
     770    if( !p_playlist->request.b_request && p_playlist->status.p_item && 
    774771        !(p_playlist->status.p_item->i_flags & PLAYLIST_SKIP_FLAG) ) 
    775772    { 
  • src/playlist/view.c

    r0aed16b r91d9398  
    8787 * Creates a new view and add it to the list 
    8888 * 
     89 * This function must be entered without the playlist lock 
     90 * 
    8991 * \param p_playlist a playlist object 
    9092 * \param i_id the view identifier 
     
    114116 * Deletes a view 
    115117 * 
     118 * This function must be entered wit the playlist lock 
     119 * 
    116120 * \param p_view the view to delete 
    117121 * \return nothing 
     
    122126    return VLC_SUCCESS; 
    123127} 
    124  
    125128 
    126129/** 
     
    367370        } 
    368371    } 
    369     var_SetInteger( p_playlist, "item-deleted", p_root->input.i_id );     
    370372    /* Delete the node */ 
    371     for( i = 0 ; i< p_root->i_parents; i++ ) 
    372     { 
    373         playlist_NodeRemoveItem( p_playlist, p_root, 
    374                                  p_root->pp_parents[i]->p_parent ); 
    375     } 
    376     playlist_ItemDelete( p_root ); 
    377    return VLC_SUCCESS; 
     373    if( p_root->i_flags & PLAYLIST_RO_FLAG ) 
     374    { 
     375        msg_Dbg( p_playlist, "unable to remove node, write-protected" ); 
     376    } 
     377    else 
     378    { 
     379        for( i = 0 ; i< p_root->i_parents; i++ ) 
     380        { 
     381            playlist_NodeRemoveItem( p_playlist, p_root, 
     382                                     p_root->pp_parents[i]->p_parent ); 
     383        } 
     384        var_SetInteger( p_playlist, "item-deleted", p_root->input.i_id ); 
     385        playlist_ItemDelete( p_root ); 
     386    } 
     387    return VLC_SUCCESS; 
    378388} 
    379389