diff options
author | Andreas Sandberg <andreas@sandberg.pp.se> | 2014-04-09 16:01:43 +0200 |
---|---|---|
committer | Andreas Sandberg <andreas@sandberg.pp.se> | 2014-04-09 16:01:43 +0200 |
commit | 221f4f232ae79b8123e7ce28d26a873e1ba9f9dc (patch) | |
tree | 0d1f889216a233ee9bf44209d77dd321cf7e0be9 /src/dev | |
parent | d805e42b81de580342a615ea99491401943a14d4 (diff) | |
download | gem5-221f4f232ae79b8123e7ce28d26a873e1ba9f9dc.tar.xz |
dev: Protect PollEvent processing when running in parallel mode
The calling thread is undefined when the PollQueue services events.
This implies that PollEvents need to handle the case where they are
processed from a different thread than the thread that created the
event. This changeset adds temporary event queue migrations to the VNC
server, the ethernet tap device, and the terminal to protect them from
inter-thread calls.
Diffstat (limited to 'src/dev')
-rw-r--r-- | src/dev/ethertap.cc | 5 | ||||
-rw-r--r-- | src/dev/terminal.cc | 5 |
2 files changed, 10 insertions, 0 deletions
diff --git a/src/dev/ethertap.cc b/src/dev/ethertap.cc index 94e381a8e..e14fd90c2 100644 --- a/src/dev/ethertap.cc +++ b/src/dev/ethertap.cc @@ -106,6 +106,11 @@ TapListener::listen() void TapListener::accept() { + // As a consequence of being called from the PollQueue, we might + // have been called from a different thread. Migrate to "our" + // thread. + EventQueue::ScopedMigration migrate(tap->eventQueue()); + if (!listener.islistening()) panic("TapListener(accept): cannot accept if we're not listening!"); diff --git a/src/dev/terminal.cc b/src/dev/terminal.cc index a11d45554..e70a8775f 100644 --- a/src/dev/terminal.cc +++ b/src/dev/terminal.cc @@ -84,6 +84,11 @@ Terminal::DataEvent::DataEvent(Terminal *t, int fd, int e) void Terminal::DataEvent::process(int revent) { + // As a consequence of being called from the PollQueue, we might + // have been called from a different thread. Migrate to "our" + // thread. + EventQueue::ScopedMigration migrate(term->eventQueue()); + if (revent & POLLIN) term->data(); else if (revent & POLLNVAL) |