Hi all,

all of the remove functions in the playlist manager have the same bug:
for example, in RemoveAll(), below, items are deleted and left in the
playlists.  Bad.  This code will crash by repeatedly clicking on a
given song in the playlist tree, which will toggle between RemoveAll(),
adding the item, and playing it -- this finally gets hold of a deleted 
entry and then crashes.  

I've modified the destructor for the PlaylistManager class, and changed
all of the remove functions to simply set the items state to the 
to-be-deleted state.  

the only 2 places that a PlaylistItem gets deleted are in 
~PlaylistManager and in the MetaDataThreadFunction()

note: there were leaks in this code, and there still are.  But, with
the changes I'm attaching, the crashes are gone :-)

note2: extremely likely that this is the cause of random crashes when 
player goes to next track..  also, the bugzilla entry for the randomized
play, deleting items, crash!

-Jason

===================================================
Error PlaylistManager::RemoveAll()
{
...
            // if the metadata thread is still accessing this item
            // we don't wanna delete the item  out from under it.
            // instead we set a flag and let the metadata thread
            // clean up when it returns.
            if(item->GetState() == kPlaylistItemState_RetrievingMetaData)
            {
                item->SetState(kPlaylistItemState_Delete);  
            }
            else
            {
                delete item;
            }          
            
            itemList.push_back(item);
            indexList.push_back(index);
...
}
=====================================================

playlist_cpp.diff

Reply via email to