factor/native/unix/signal.c

51 lines
1.2 KiB
C
Raw Normal View History

2004-12-10 22:47:03 -05:00
#include "../factor.h"
2005-10-23 20:50:29 -04:00
#include "mach_signal.h"
void signal_handler(int signal, siginfo_t* siginfo, void* uap)
{
2005-05-12 03:52:56 -04:00
if(nursery.here > nursery.limit)
{
2005-12-24 23:01:49 -05:00
fprintf(stderr,"Nursery space exhausted\n");
factorbug();
}
else if(compiling.here + sizeof(CELL) > compiling.limit)
{
fprintf(stderr,"Code space exhausted\n");
2005-05-12 01:02:39 -04:00
factorbug();
}
else
2004-11-09 12:29:25 -05:00
signal_error(signal);
}
static void sigaction_safe(int signum, const struct sigaction *act, struct sigaction *oldact)
{
int ret;
do
{
ret = sigaction(signum, act, oldact);
} while(ret == -1 && errno == EINTR);
}
void init_signals(void)
{
struct sigaction custom_sigaction;
struct sigaction ign_sigaction;
2005-11-15 12:58:44 -05:00
2005-05-12 01:02:39 -04:00
sigemptyset(&custom_sigaction.sa_mask);
custom_sigaction.sa_sigaction = signal_handler;
custom_sigaction.sa_flags = SA_SIGINFO;
sigaction_safe(SIGABRT,&custom_sigaction,NULL);
sigaction_safe(SIGFPE,&custom_sigaction,NULL);
sigaction_safe(SIGBUS,&custom_sigaction,NULL);
sigaction_safe(SIGQUIT,&custom_sigaction,NULL);
sigaction_safe(SIGSEGV,&custom_sigaction,NULL);
2005-11-15 12:58:44 -05:00
sigemptyset(&ign_sigaction.sa_mask);
ign_sigaction.sa_handler = SIG_IGN;
sigaction_safe(SIGPIPE,&ign_sigaction,NULL);
2005-10-23 20:50:29 -04:00
#ifdef __APPLE__
mach_initialize();
#endif
}