clean up signal handling using a polling method, from the genius that is mackstann
git-svn-id: https://svn.musicpd.org/mpd/trunk@697 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
+11
-10
@@ -74,6 +74,8 @@ char directorydb[MAXPATHLEN+1];
|
||||
|
||||
int directory_updatePid = 0;
|
||||
|
||||
int directory_reReadDB = 0;
|
||||
|
||||
mpd_uint16 directory_updateJobId = 0;
|
||||
|
||||
DirectoryList * newDirectoryList();
|
||||
@@ -112,16 +114,22 @@ void directory_sigChldHandler(int pid, int status) {
|
||||
WTERMSIG(status));
|
||||
}
|
||||
else if(WEXITSTATUS(status)==EXIT_SUCCESS) {
|
||||
readDirectoryDB();
|
||||
incrPlaylistVersion();
|
||||
DEBUG("direcotry_sigChldHandler: "
|
||||
"updated db succesffully\n");
|
||||
directory_reReadDB = 1;
|
||||
}
|
||||
else ERROR("problems updating db\n");
|
||||
directory_updatePid = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void readDirectoryDBIfUpdateIsFinished() {
|
||||
if(directory_reReadDB && 0==directory_updatePid) {
|
||||
DEBUG("readDirectoryDB since update finished successfully\n");
|
||||
readDirectoryDB();
|
||||
directory_reReadDB = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int updateInit(FILE * fp, List * pathList) {
|
||||
if(directory_updatePid > 0) {
|
||||
myfprintf(fp,"%s already updating\n",COMMAND_RESPOND_ERROR);
|
||||
@@ -135,13 +143,6 @@ int updateInit(FILE * fp, List * pathList) {
|
||||
if(directory_updatePid==0) {
|
||||
unblockSignals();
|
||||
/* child */
|
||||
struct sigaction sa;
|
||||
sa.sa_flags = 0;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
|
||||
sa.sa_handler = SIG_IGN;
|
||||
sigaction(SIGPIPE,&sa,NULL);
|
||||
sigaction(SIGCHLD,&sa,NULL);
|
||||
|
||||
finishSigHandlers();
|
||||
close(listenSocket);
|
||||
|
||||
Reference in New Issue
Block a user