aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.c
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2006-08-14 23:31:08 +0000
committerEric Wong <normalperson@yhbt.net>2006-08-14 23:31:08 +0000
commite5df85db158c440048af7d9f34681562cefbf7d2 (patch)
tree7e16edc34308abbc7366082a302ac6601c70f393 /src/main.c
parent6459b3ee29e13d5141b9e7b40bb4abce68c404be (diff)
downloadmpd-e5df85db158c440048af7d9f34681562cefbf7d2.tar.gz
mpd-e5df85db158c440048af7d9f34681562cefbf7d2.tar.xz
mpd-e5df85db158c440048af7d9f34681562cefbf7d2.zip
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
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c4
1 files changed, 2 insertions, 2 deletions
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;