diff -r a64f74eb0d5a -r 6b8977951300 src/base/pollevent.cc --- a/src/base/pollevent.cc Mon Oct 07 16:06:21 2013 +0200 +++ b/src/base/pollevent.cc Mon Oct 07 16:06:44 2013 +0200 @@ -214,4 +214,14 @@ 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; + } } diff -r a64f74eb0d5a -r 6b8977951300 src/sim/async.hh --- a/src/sim/async.hh Mon Oct 07 16:06:21 2013 +0200 +++ b/src/sim/async.hh Mon Oct 07 16:06:44 2013 +0200 @@ -40,14 +40,12 @@ /// @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. //@} diff -r a64f74eb0d5a -r 6b8977951300 src/sim/async.cc --- a/src/sim/async.cc Mon Oct 07 16:06:21 2013 +0200 +++ b/src/sim/async.cc Mon Oct 07 16:06:44 2013 +0200 @@ -33,6 +33,5 @@ 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; diff -r a64f74eb0d5a -r 6b8977951300 src/sim/init.cc --- a/src/sim/init.cc Mon Oct 07 16:06:21 2013 +0200 +++ b/src/sim/init.cc Mon Oct 07 16:06:44 2013 +0200 @@ -104,15 +104,6 @@ async_io = true; } -// Handle SIGALRM -void -alrmHandler(int sigtype) -{ - async_event = true; - async_alarm = true; - alarm(1); -} - static void installSignalHandler(int signal, void (*handler)(int sigtype)) { @@ -156,15 +147,6 @@ // 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 fig the original bug. - installSignalHandler(SIGALRM, alrmHandler); - alarm(1); } // The python library is totally messed up with respect to constness, diff -r a64f74eb0d5a -r 6b8977951300 src/sim/simulate.cc --- a/src/sim/simulate.cc Mon Oct 07 16:06:21 2013 +0200 +++ b/src/sim/simulate.cc Mon Oct 07 16:06:44 2013 +0200 @@ -98,9 +98,8 @@ exitSimLoop("user interrupt received"); } - if (async_io || async_alarm) { + if (async_io) { async_io = false; - async_alarm = false; pollQueue.service(); }