if (fcntl(fd, F_SETFL, flags) == -1)
panic("Could not set up async IO");
+
+ // The file descriptor might already have events pending. We won't
+ // see them if they occurred before we set the FASYNC
+ // flag. Simulate a SIGIO to ensure that the FD will be polled in
+ // next iteration of the simulation loop. We could just poll it,
+ // but this is much simpler.
+ if (set) {
+ async_event = true;
+ async_io = true;
+ }
}
volatile bool async_statreset = false;
volatile bool async_exit = false;
volatile bool async_io = false;
-volatile bool async_alarm = false;
volatile bool async_exception = false;
/// @name Asynchronous event flags.
/// To avoid races, signal handlers simply set these flags, which are
/// then checked in the main event loop. Defined in main.cc.
-/// @note See the PollQueue object (in pollevent.hh) for the use of async_io and async_alarm.
//@{
extern volatile bool async_event; ///< Some asynchronous event has happened.
extern volatile bool async_statdump; ///< Async request to dump stats.
extern volatile bool async_statreset; ///< Async request to reset stats.
extern volatile bool async_exit; ///< Async request to exit simulator.
extern volatile bool async_io; ///< Async I/O request (SIGIO).
-extern volatile bool async_alarm; ///< Async alarm event (SIGALRM).
extern volatile bool async_exception; ///< Python exception.
//@}
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))
{
// 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,
exitSimLoop("user interrupt received");
}
- if (async_io || async_alarm) {
+ if (async_io) {
async_io = false;
- async_alarm = false;
pollQueue.service();
}