/*****************************************************************************
* playlist.cpp : wxWindows plugin for vlc
*****************************************************************************
- * Copyright (C) 2000-2004 VideoLAN
+ * Copyright (C) 2000-2005 VideoLAN
* $Id$
*
* Authors: Olivier Teulière <ipkiss@via.ecp.fr>
var_DelCallback( p_playlist, "item-deleted", ItemDeleted, this );
/* ...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 */
var_AddCallback( p_playlist, "item-append", ItemAppended, 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 );
}
{
return;
}
- vlc_mutex_lock( &p_playlist->object_lock );
+ LockPlaylist( p_intf->p_sys, p_playlist );
switch( event.GetId() )
{
case SortTitle_Event:
playlist_RecursiveNodeSort( p_playlist, p_wxitem->p_item,
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 );
Rebuild( VLC_TRUE );
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,
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 );
UpdateNodeChildren( p_playlist, p_wxitem->p_item, i_popup_item );
/*****************************************************************************
* timer.cpp : wxWindows plugin for vlc
*****************************************************************************
- * Copyright (C) 2000-2003 VideoLAN
+ * Copyright (C) 2000-2005 VideoLAN
* $Id$
*
* Authors: Gildas Bazin <gbazin@videolan.org>
FIND_ANYWHERE );
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;
if( 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 );
}
/* Playlist management */
int i_playing; /* playlist selected item */
+ unsigned i_playlist_usage;
/* Send an event to show a dialog */
void (*pf_show_dialog) ( intf_thread_t *p_intf, int i_dialog, int i_arg,
};
} // 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;