summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/base/pollevent.cc10
-rw-r--r--src/sim/async.cc1
-rw-r--r--src/sim/async.hh2
-rw-r--r--src/sim/init.cc18
-rw-r--r--src/sim/simulate.cc3
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();
}