summaryrefslogtreecommitdiff
path: root/src/base
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas@sandberg.pp.se>2013-11-29 14:35:36 +0100
committerAndreas Sandberg <andreas@sandberg.pp.se>2013-11-29 14:35:36 +0100
commit9c57d5b5a66df60f77d1209f6660e4986da4bf8e (patch)
treeb081dd2ebd6bccb433701f9ae62c5defd1314881 /src/base
parent2823982a3cbd60a1b21db1a73b78440468df158a (diff)
downloadgem5-9c57d5b5a66df60f77d1209f6660e4986da4bf8e.tar.xz
base: Clean up signal handling
The PollEvent class dynamically installs a SIGIO and SIGALRM handler when a file handler is registered. Most signal handlers currently get registered in the initSignals() function. This changeset moves the SIGIO/SIGALRM handlers to initSignals() to live with the other signal handlers. The original code installs SIGIO and SIGALRM with the SA_RESTART option to prevent syscalls from returning EINTR. This changeset consistently uses this flag for all signal handlers to ensure that other signals that trigger asynchronous behavior (e.g., statistics dumping) do not cause undesirable EINTR returns.
Diffstat (limited to 'src/base')
-rw-r--r--src/base/pollevent.cc62
-rw-r--r--src/base/pollevent.hh9
2 files changed, 0 insertions, 71 deletions
diff --git a/src/base/pollevent.cc b/src/base/pollevent.cc
index cb44d8728..67e97f98f 100644
--- a/src/base/pollevent.cc
+++ b/src/base/pollevent.cc
@@ -109,7 +109,6 @@ PollQueue::PollQueue()
PollQueue::~PollQueue()
{
- removeHandler();
for (int i = 0; i < num_fds; i++)
setupAsyncIO(poll_fds[0].fd, false);
@@ -170,7 +169,6 @@ PollQueue::schedule(PollEvent *event)
max_size *= 2;
} else {
max_size = 16;
- setupHandler();
}
poll_fds = new pollfd[max_size];
@@ -197,10 +195,6 @@ PollQueue::service()
}
}
-struct sigaction PollQueue::oldio;
-struct sigaction PollQueue::oldalrm;
-bool PollQueue::handler = false;
-
void
PollQueue::setupAsyncIO(int fd, bool set)
{
@@ -221,59 +215,3 @@ PollQueue::setupAsyncIO(int fd, bool set)
if (fcntl(fd, F_SETFL, flags) == -1)
panic("Could not set up async IO");
}
-
-void
-PollQueue::setupHandler()
-{
- struct sigaction act;
-
- act.sa_handler = handleIO;
- sigemptyset(&act.sa_mask);
- act.sa_flags = SA_RESTART;
-
- if (sigaction(SIGIO, &act, &oldio) == -1)
- panic("could not do sigaction");
-
- act.sa_handler = handleALRM;
- sigemptyset(&act.sa_mask);
- act.sa_flags = SA_RESTART;
-
- if (sigaction(SIGALRM, &act, &oldalrm) == -1)
- panic("could not do sigaction");
-
- alarm(1);
-
- handler = true;
-}
-
-void
-PollQueue::removeHandler()
-{
- if (sigaction(SIGIO, &oldio, NULL) == -1)
- panic("could not remove handler");
-
- if (sigaction(SIGIO, &oldalrm, NULL) == -1)
- panic("could not remove handler");
-}
-
-void
-PollQueue::handleIO(int sig)
-{
- if (sig != SIGIO)
- panic("Wrong Handler");
-
- async_event = true;
- async_io = true;
-}
-
-void
-PollQueue::handleALRM(int sig)
-{
- if (sig != SIGALRM)
- panic("Wrong Handler");
-
- async_event = true;
- async_alarm = true;
- alarm(1);
-}
-
diff --git a/src/base/pollevent.hh b/src/base/pollevent.hh
index b9c833c8a..5e0faa729 100644
--- a/src/base/pollevent.hh
+++ b/src/base/pollevent.hh
@@ -83,17 +83,8 @@ class PollQueue
void schedule(PollEvent *event);
void service();
- protected:
- static bool handler;
- static struct sigaction oldio;
- static struct sigaction oldalrm;
-
public:
static void setupAsyncIO(int fd, bool set);
- static void handleIO(int);
- static void handleALRM(int);
- static void removeHandler();
- static void setupHandler();
};
extern PollQueue pollQueue;