Ignore certain signals

This commit is contained in:
Brandon Skari 2016-02-24 21:48:00 -07:00
parent 58b5585dc2
commit fadb0acbc4
5 changed files with 55 additions and 15 deletions

View File

@ -3,7 +3,21 @@
#include <signal.h>
#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;

View File

@ -16,7 +16,7 @@
#include <sys/mman.h>
#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);

View File

@ -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);

View File

@ -2,7 +2,7 @@
#define RPITX_H
#include <ctype.h>
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
);

View File

@ -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;