Commit ed65a598 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

- Fix playlist deadlock between Timer and Playlist stuff

There are still other deadlocks in wx though
parent 2d16a408
/***************************************************************************** /*****************************************************************************
* playlist.cpp : wxWindows plugin for vlc * playlist.cpp : wxWindows plugin for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2000-2004 VideoLAN * Copyright (C) 2000-2005 VideoLAN
* $Id$ * $Id$
* *
* Authors: Olivier Teulire <ipkiss@via.ecp.fr> * Authors: Olivier Teulire <ipkiss@via.ecp.fr>
...@@ -838,7 +838,7 @@ void Playlist::Rebuild( vlc_bool_t b_root ) ...@@ -838,7 +838,7 @@ void Playlist::Rebuild( vlc_bool_t b_root )
var_DelCallback( p_playlist, "item-deleted", ItemDeleted, this ); var_DelCallback( p_playlist, "item-deleted", ItemDeleted, this );
/* ...and rebuild it */ /* ...and rebuild it */
vlc_mutex_lock( &p_playlist->object_lock ); LockPlaylist( p_intf->p_sys, p_playlist );
} }
p_view = playlist_ViewFind( p_playlist, i_current_view ); /* FIXME */ p_view = playlist_ViewFind( p_playlist, i_current_view ); /* FIXME */
...@@ -882,7 +882,7 @@ void Playlist::Rebuild( vlc_bool_t b_root ) ...@@ -882,7 +882,7 @@ void Playlist::Rebuild( vlc_bool_t b_root )
var_AddCallback( p_playlist, "item-append", ItemAppended, this ); var_AddCallback( p_playlist, "item-append", ItemAppended, this );
var_AddCallback( p_playlist, "item-deleted", ItemDeleted, this ); var_AddCallback( p_playlist, "item-deleted", ItemDeleted, this );
vlc_mutex_unlock( &p_playlist->object_lock ); UnlockPlaylist( p_intf->p_sys, p_playlist );
} }
vlc_object_release( p_playlist ); vlc_object_release( p_playlist );
} }
...@@ -1066,7 +1066,7 @@ void Playlist::OnSort( wxCommandEvent& event ) ...@@ -1066,7 +1066,7 @@ void Playlist::OnSort( wxCommandEvent& event )
{ {
return; return;
} }
vlc_mutex_lock( &p_playlist->object_lock ); LockPlaylist( p_intf->p_sys, p_playlist );
switch( event.GetId() ) switch( event.GetId() )
{ {
case SortTitle_Event: case SortTitle_Event:
...@@ -1077,7 +1077,7 @@ void Playlist::OnSort( wxCommandEvent& event ) ...@@ -1077,7 +1077,7 @@ void Playlist::OnSort( wxCommandEvent& event )
playlist_RecursiveNodeSort( p_playlist, p_wxitem->p_item, playlist_RecursiveNodeSort( p_playlist, p_wxitem->p_item,
SORT_TITLE_NODES_FIRST, ORDER_REVERSE ); SORT_TITLE_NODES_FIRST, ORDER_REVERSE );
} }
vlc_mutex_unlock( &p_playlist->object_lock ); UnlockPlaylist( p_intf->p_sys, p_playlist );
vlc_object_release( p_playlist ); vlc_object_release( p_playlist );
Rebuild( VLC_TRUE ); Rebuild( VLC_TRUE );
...@@ -1557,10 +1557,10 @@ void Playlist::OnPopupSort( wxMenuEvent& event ) ...@@ -1557,10 +1557,10 @@ void Playlist::OnPopupSort( wxMenuEvent& event )
if( p_playlist ) if( p_playlist )
{ {
vlc_mutex_lock( &p_playlist->object_lock ); LockPlaylist( p_intf->p_sys, p_playlist );
playlist_RecursiveNodeSort( p_playlist, p_wxitem->p_item, playlist_RecursiveNodeSort( p_playlist, p_wxitem->p_item,
SORT_TITLE_NODES_FIRST, ORDER_NORMAL ); SORT_TITLE_NODES_FIRST, ORDER_NORMAL );
vlc_mutex_unlock( &p_playlist->object_lock ); UnlockPlaylist( p_intf->p_sys, p_playlist );
treectrl->DeleteChildren( i_popup_item ); treectrl->DeleteChildren( i_popup_item );
UpdateNodeChildren( p_playlist, p_wxitem->p_item, i_popup_item ); UpdateNodeChildren( p_playlist, p_wxitem->p_item, i_popup_item );
......
/***************************************************************************** /*****************************************************************************
* timer.cpp : wxWindows plugin for vlc * timer.cpp : wxWindows plugin for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2000-2003 VideoLAN * Copyright (C) 2000-2005 VideoLAN
* $Id$ * $Id$
* *
* Authors: Gildas Bazin <gbazin@videolan.org> * Authors: Gildas Bazin <gbazin@videolan.org>
...@@ -120,11 +120,11 @@ void Timer::Notify() ...@@ -120,11 +120,11 @@ void Timer::Notify()
FIND_ANYWHERE ); FIND_ANYWHERE );
if( p_playlist != NULL ) if( p_playlist != NULL )
{ {
vlc_mutex_lock( &p_playlist->object_lock ); LockPlaylist( p_intf->p_sys, p_playlist );
p_intf->p_sys->p_input = p_playlist->p_input; p_intf->p_sys->p_input = p_playlist->p_input;
if( p_intf->p_sys->p_input ) if( p_intf->p_sys->p_input )
vlc_object_yield( p_intf->p_sys->p_input ); vlc_object_yield( p_intf->p_sys->p_input );
vlc_mutex_unlock( &p_playlist->object_lock ); UnlockPlaylist( p_intf->p_sys, p_playlist );
vlc_object_release( p_playlist ); vlc_object_release( p_playlist );
} }
......
...@@ -124,6 +124,7 @@ struct intf_sys_t ...@@ -124,6 +124,7 @@ struct intf_sys_t
/* Playlist management */ /* Playlist management */
int i_playing; /* playlist selected item */ int i_playing; /* playlist selected item */
unsigned i_playlist_usage;
/* Send an event to show a dialog */ /* Send an event to show a dialog */
void (*pf_show_dialog) ( intf_thread_t *p_intf, int i_dialog, int i_arg, void (*pf_show_dialog) ( intf_thread_t *p_intf, int i_dialog, int i_arg,
...@@ -1083,5 +1084,24 @@ private: ...@@ -1083,5 +1084,24 @@ private:
}; };
} // end of wxvlc namespace } // end of wxvlc namespace
/*
* wxWindows keeps dead locking because the timer tries to lock the playlist
* when it's already locked somewhere else in the very wxWindows interface
* module. Unless someone implements a "vlc_mutex_trylock", we need that.
*/
inline void LockPlaylist( intf_sys_t *p_sys, playlist_t *p_pl )
{
if( p_sys->i_playlist_usage++ == 0)
vlc_mutex_lock( &p_pl->object_lock );
}
inline void UnlockPlaylist( intf_sys_t *p_sys, playlist_t *p_pl )
{
if( --p_sys->i_playlist_usage == 0)
vlc_mutex_unlock( &p_pl->object_lock );
}
using namespace wxvlc; using namespace wxvlc;
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment