From e5df85db158c440048af7d9f34681562cefbf7d2 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 14 Aug 2006 23:31:08 +0000 Subject: Several bugfixes during exit found by valgrind First, make sure we call finishPlaylist() before closeMp3Directory() since the latter will free non-SONG_TYPE_URL songs in playlist, which causes an invalid read when we try to look for SONG_TYPE_URL songs to free in finishPlaylist. Secondly, make sure our children have all exited before freeing the playerData. If we do not, slowly-delivered signals can trigger a race condition in the signal handlers of the decode and player processes which rely on getPlayerData. To avoid waitpid-ing too long (or at all), move the freePlayerData() call farther down in main() (this won't affect anything else) to give the OS a better chance to deliver signals and finish running sig handlers for terminated children. git-svn-id: https://svn.musicpd.org/mpd/trunk@4640 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- src/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index 43311b3a7..6c175fbd7 100644 --- a/src/main.c +++ b/src/main.c @@ -477,14 +477,13 @@ int main(int argc, char *argv[]) playerKill(); freeAllInterfaces(); closeAllListenSockets(); + finishPlaylist(); start = clock(); closeMp3Directory(); DEBUG("closeMp3Directory took %f seconds\n", ((float)(clock()-start))/CLOCKS_PER_SEC); - finishPlaylist(); - freePlayerData(); finishNormalization(); finishAudioDriver(); finishAudioConfig(); @@ -495,6 +494,7 @@ int main(int argc, char *argv[]) finishInputPlugins(); cleanUpPidFile(); finishConf(); + freePlayerData(); close_log_files(); return EXIT_SUCCESS; -- cgit v1.2.3