diff options
Diffstat (limited to 'src/sim')
-rw-r--r-- | src/sim/init.cc | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/src/sim/init.cc b/src/sim/init.cc index 0cebc417d..660fab62b 100644 --- a/src/sim/init.cc +++ b/src/sim/init.cc @@ -96,6 +96,37 @@ abortHandler(int sigtype) ccprintf(cerr, "Program aborted at cycle %d\n", curTick()); } +// Handle SIGIO +static void +ioHandler(int sigtype) +{ + async_event = true; + async_io = true; +} + +// Handle SIGALRM +static void +alrmHandler(int sigtype) +{ + async_event = true; + async_alarm = true; + alarm(1); +} + +static void +installSignalHandler(int signal, void (*handler)(int sigtype)) +{ + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_handler = handler; + sa.sa_flags = SA_RESTART; + + if (sigaction(signal, &sa, NULL) == -1) + panic("Failed to setup handler for signal %i\n", signal); +} + /* * M5 can do several special things when various signals are sent. * None are mandatory. @@ -111,16 +142,29 @@ initSignals() signal(SIGTRAP, SIG_IGN); // Dump intermediate stats - signal(SIGUSR1, dumpStatsHandler); + installSignalHandler(SIGUSR1, dumpStatsHandler); // Dump intermediate stats and reset them - signal(SIGUSR2, dumprstStatsHandler); + installSignalHandler(SIGUSR2, dumprstStatsHandler); // Exit cleanly on Interrupt (Ctrl-C) - signal(SIGINT, exitNowHandler); + installSignalHandler(SIGINT, exitNowHandler); // Print out cycle number on abort - signal(SIGABRT, abortHandler); + installSignalHandler(SIGABRT, abortHandler); + + // Install a SIGIO handler to handle asynchronous file IO. See the + // PollQueue class. + installSignalHandler(SIGIO, ioHandler); + + // Setup an alarm handler that triggers every second. This + // triggers a PollQueue service just like a SIGIO. It is + // /probably/ used to work around a bug in the poll queue (likely + // a race between setting up a asynchronous IO and data becoming + // available), but its use isn't documented anywhere. + // TODO: Find out why this is needed and fix the original bug. + installSignalHandler(SIGALRM, alrmHandler); + alarm(1); } // The python library is totally messed up with respect to constness, |