diff options
Diffstat (limited to '')
-rw-r--r-- | src/audioOutputs/audioOutput_alsa.c | 2 | ||||
-rw-r--r-- | src/decode.c | 5 | ||||
-rw-r--r-- | src/decode.h | 3 | ||||
-rw-r--r-- | src/sig_handlers.c | 7 |
4 files changed, 12 insertions, 5 deletions
diff --git a/src/audioOutputs/audioOutput_alsa.c b/src/audioOutputs/audioOutput_alsa.c index 594988162..0cf453ffe 100644 --- a/src/audioOutputs/audioOutput_alsa.c +++ b/src/audioOutputs/audioOutput_alsa.c @@ -284,7 +284,7 @@ static int alsa_playAudio(AudioOutput * audioOutput, char * playChunk, while (size > 0) { ret = ad->writei(ad->pcmHandle, playChunk, size); - if(ret == -EAGAIN) continue; + if(ret == -EAGAIN || ret == -EINTR) continue; if(ret < 0) { if( alsa_errorRecovery(ad, ret) < 0) { diff --git a/src/decode.c b/src/decode.c index 4416552e1..32deb075a 100644 --- a/src/decode.c +++ b/src/decode.c @@ -39,7 +39,7 @@ volatile int * volatile decode_pid = NULL; -void decodeSigHandler(int sig) { +void decodeSigHandler(int sig, siginfo_t * si, void * v) { if(sig==SIGCHLD) { int status; if(decode_pid && *decode_pid==wait3(&status,WNOHANG,NULL)) { @@ -52,7 +52,8 @@ void decodeSigHandler(int sig) { *decode_pid = 0; } } - else if(sig==SIGTERM) { + else if(sig==SIGTERM && si->si_pid==getppid()) { + DEBUG("player/decoder got SIGTERM from parent process\n"); if(decode_pid) { int pid = *decode_pid; if(pid>0) kill(pid,SIGTERM); diff --git a/src/decode.h b/src/decode.h index fd9bc1949..b27fcf4e9 100644 --- a/src/decode.h +++ b/src/decode.h @@ -27,6 +27,7 @@ #include <stdio.h> #include <sys/param.h> +#include <signal.h> #define DECODE_TYPE_FILE 0 #define DECODE_TYPE_URL 1 @@ -61,7 +62,7 @@ typedef struct _DecoderControl { volatile float totalTime; } DecoderControl; -void decodeSigHandler(int sig); +void decodeSigHandler(int sig, siginfo_t * siginfo, void * v); void decode(); diff --git a/src/sig_handlers.c b/src/sig_handlers.c index 4ab5163bf..4c7b99635 100644 --- a/src/sig_handlers.c +++ b/src/sig_handlers.c @@ -74,6 +74,7 @@ void initSigHandlers() { sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sa.sa_handler = SIG_IGN; + sa.sa_sigaction = NULL; while(sigaction(SIGPIPE,&sa,NULL)<0 && errno==EINTR); sa.sa_handler = chldSigHandler; while(sigaction(SIGCHLD,&sa,NULL)<0 && errno==EINTR); @@ -98,8 +99,11 @@ void setSigHandlersForDecoder() { sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sa.sa_handler = SIG_IGN; + sa.sa_sigaction = NULL; while(sigaction(SIGHUP,&sa,NULL)<0 && errno==EINTR); - sa.sa_handler = decodeSigHandler; + sa.sa_handler = NULL; + sa.sa_flags = SA_SIGINFO; + sa.sa_sigaction = decodeSigHandler; while(sigaction(SIGCHLD,&sa,NULL)<0 && errno==EINTR); while(sigaction(SIGTERM,&sa,NULL)<0 && errno==EINTR); while(sigaction(SIGINT,&sa,NULL)<0 && errno==EINTR); @@ -111,6 +115,7 @@ void ignoreSignals() { sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sa.sa_handler = SIG_IGN; + sa.sa_sigaction = NULL; while(sigaction(SIGPIPE,&sa,NULL)<0 && errno==EINTR); while(sigaction(SIGCHLD,&sa,NULL)<0 && errno==EINTR); while(sigaction(SIGUSR1,&sa,NULL)<0 && errno==EINTR); |