From f58827951ff79539125dcb4b1bd08e549e347a62 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 11 Oct 2008 23:59:45 -0700 Subject: update: serialize song_free in main thread It's actually possible to have a traverser accessing a song while we're freeing it in the main thread, as the songvec iterators don't lock the individual elements. --- src/update.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/update.c b/src/update.c index 99a58a06e..c3e5b9a7c 100644 --- a/src/update.c +++ b/src/update.c @@ -74,9 +74,6 @@ static void delete_song(struct directory *dir, struct mpd_song *del) wakeup_main_task(); do { cond_wait(&delete_cond); } while (delete); cond_leave(&delete_cond); - - /* finally, all possible references gone, free it */ - song_free(del); } static int delete_each_song(struct mpd_song *song, mpd_unused void *data) @@ -423,6 +420,7 @@ void reap_update_task(void) char tmp[MPD_PATH_MAX]; LOG("removing: %s\n", song_get_url(delete, tmp)); deleteASongFromPlaylist(delete); + song_free(delete); delete = NULL; cond_signal(&delete_cond); } -- cgit v1.2.3