From fadb0acbc486f85e31f4a784c8d4005033e078af Mon Sep 17 00:00:00 2001 From: Brandon Skari Date: Wed, 24 Feb 2016 21:48:00 -0700 Subject: [PATCH] Ignore certain signals --- src/RpiDma.c | 41 ++++++++++++++++++++++++++++++++++----- src/RpiDma.h | 2 +- src/RpiTx.c | 13 +++++++------ src/RpiTx.h | 5 +++-- src/python/_rpitxmodule.c | 9 ++++++++- 5 files changed, 55 insertions(+), 15 deletions(-) diff --git a/src/RpiDma.c b/src/RpiDma.c index 133679f..7d17275 100644 --- a/src/RpiDma.c +++ b/src/RpiDma.c @@ -3,7 +3,21 @@ #include #include "RpiDma.h" #include "RpiGpio.h" -char InitDma(void *FunctionTerminate) + +static int compareInts(const void* first, const void* second) { + const int firstInt = *((int*)first); + const int secondInt = *((int*)second); + if (firstInt < secondInt) { + return -1; + } + if (firstInt == secondInt) { + return 0; + } + return 1; +} + + +char InitDma(void *FunctionTerminate, int* skipSignals) { DMA_CHANNEL=4; char *line = NULL; @@ -31,15 +45,32 @@ char InitDma(void *FunctionTerminate) pclose(flinux); //printf("Init DMA\n"); + int sentinel[] = {0}; + if (skipSignals == NULL) { + skipSignals = sentinel; + } + int sentinelIndex; + for (sentinelIndex = 0; ; ++sentinelIndex) { + if (skipSignals[sentinelIndex] == 0) { + break; + } + } + qsort(skipSignals, sentinelIndex, sizeof(int), compareInts); + // Catch all signals possible - it is vital we kill the DMA engine // on process exit! int i; for (i = 0; i < 64; i++) { - struct sigaction sa; + // Some signals are fine, so don't catch them + if (i == *skipSignals) { + ++skipSignals; + } else { + struct sigaction sa; - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = FunctionTerminate;//terminate; - sigaction(i, &sa, NULL); + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = FunctionTerminate;//terminate; + sigaction(i, &sa, NULL); + } } //NUM_SAMPLES = NUM_SAMPLES_MAX; diff --git a/src/RpiDma.h b/src/RpiDma.h index 9058b0c..e585b1c 100644 --- a/src/RpiDma.h +++ b/src/RpiDma.h @@ -16,7 +16,7 @@ #include #include "mailbox.h" -char InitDma(void *FunctionTerminate); +char InitDma(void *FunctionTerminate, int* skipSignals); uint32_t mem_virt_to_phys(volatile void *virt); uint32_t mem_phys_to_virt(volatile uint32_t phys); diff --git a/src/RpiTx.c b/src/RpiTx.c index 2c2b251..f47d3d0 100644 --- a/src/RpiTx.c +++ b/src/RpiTx.c @@ -173,7 +173,7 @@ terminate(int dummy) { stop_dma(); //munmap(virtbase,NUM_PAGES * PAGE_SIZE); - printf("END OF PiTx\n", dummy); + printf("END OF PiTx\n"); exit(1); } @@ -951,10 +951,10 @@ void update_ppm( } } -int pitx_init(int SampleRate,double TuningFrequency) +int pitx_init(int SampleRate, double TuningFrequency, int* skipSignals) { InitGpio(); - InitDma(terminate); + InitDma(terminate, skipSignals); SetupGpioClock(SampleRate,TuningFrequency); @@ -1141,7 +1141,7 @@ main(int argc, char* argv[]) } resetFile(); - return pitx_run(Mode, SampleRate, SetFrequency, ppmpll, NoUsePwmFrequency, readFile, resetFile); + return pitx_run(Mode, SampleRate, SetFrequency, ppmpll, NoUsePwmFrequency, readFile, resetFile, NULL); } int pitx_run( @@ -1151,7 +1151,8 @@ int pitx_run( const float ppmpll, const char NoUsePwmFrequency, ssize_t (*readWrapper)(void *buffer, size_t count), - void (*reset)(void) + void (*reset)(void), + int* skipSignals ) { int i; //char pagemap_fn[64]; @@ -1213,7 +1214,7 @@ int pitx_run( pitx_SetTuneFrequency(SetFrequency*1000.0); - pitx_init(SampleRate,GlobalTuningFrequency); + pitx_init(SampleRate, GlobalTuningFrequency, skipSignals); diff --git a/src/RpiTx.h b/src/RpiTx.h index 0671da6..0e1e4f8 100644 --- a/src/RpiTx.h +++ b/src/RpiTx.h @@ -2,7 +2,7 @@ #define RPITX_H #include -int pitx_init(int SampleRate,double TuningFrequency); +int pitx_init(int SampleRate, double TuningFrequency, int* skipSignals); int pitx_SetTuneFrequencyu(uint32_t Frequency); #define MODE_IQ 0 @@ -20,7 +20,8 @@ int pitx_run( // Wrapper around read to read wav file bytes ssize_t (*readWrapper)(void *buffer, size_t count), // Wrapper to reset file for looping - void (*reset)(void) + void (*reset)(void), + int* skipSignals ); diff --git a/src/python/_rpitxmodule.c b/src/python/_rpitxmodule.c index fa65fb6..09b0561 100644 --- a/src/python/_rpitxmodule.c +++ b/src/python/_rpitxmodule.c @@ -135,7 +135,14 @@ _rpitx_broadcast_fm(PyObject* self, PyObject* args) { } bitRate = sfInfo.samplerate; - pitx_run(MODE_RF, bitRate, frequency * 1000.0, 0.0, 0, formatRfWrapper, reset); + int skipSignals[] = { + SIGALRM, + SIGVTALRM, + SIGCHLD, // We fork whenever calling broadcast_fm + SIGWINCH, // Window resized + 0 + }; + pitx_run(MODE_RF, bitRate, frequency * 1000.0, 0.0, 0, formatRfWrapper, reset, skipSignals); sf_close(sndFile); Py_RETURN_NONE;