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
This commit is contained in:
+2
-2
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user