diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/base/pollevent.cc | 10 | ||||
-rw-r--r-- | src/sim/async.cc | 1 | ||||
-rw-r--r-- | src/sim/async.hh | 2 | ||||
-rw-r--r-- | src/sim/init.cc | 18 | ||||
-rw-r--r-- | src/sim/simulate.cc | 3 |
5 files changed, 11 insertions, 23 deletions
diff --git a/src/base/pollevent.cc b/src/base/pollevent.cc index 67e97f98f..9ed6df4fe 100644 --- a/src/base/pollevent.cc +++ b/src/base/pollevent.cc @@ -214,4 +214,14 @@ PollQueue::setupAsyncIO(int fd, bool set) 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 --git a/src/sim/async.cc b/src/sim/async.cc index 1a8e499f7..8ed00372c 100644 --- a/src/sim/async.cc +++ b/src/sim/async.cc @@ -33,6 +33,5 @@ volatile bool async_statdump = false; 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 --git a/src/sim/async.hh b/src/sim/async.hh index 6dd5b8a0d..67f686a59 100644 --- a/src/sim/async.hh +++ b/src/sim/async.hh @@ -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 --git a/src/sim/init.cc b/src/sim/init.cc index 660fab62b..63af2dd88 100644 --- a/src/sim/init.cc +++ b/src/sim/init.cc @@ -104,15 +104,6 @@ ioHandler(int sigtype) 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)) { @@ -156,15 +147,6 @@ initSignals() // 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, diff --git a/src/sim/simulate.cc b/src/sim/simulate.cc index 78695688a..407e2274e 100644 --- a/src/sim/simulate.cc +++ b/src/sim/simulate.cc @@ -210,9 +210,8 @@ doSimLoop(EventQueue *eventq) exitSimLoop("user interrupt received"); } - if (async_io || async_alarm) { + if (async_io) { async_io = false; - async_alarm = false; pollQueue.service(); } |