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.
This commit is contained in:
Andreas Sandberg 2014-04-09 16:01:43 +02:00
parent d805e42b81
commit 221f4f232a
3 changed files with 15 additions and 0 deletions

View file

@ -174,6 +174,11 @@ VncServer::listen(int port)
void
VncServer::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(eventQueue());
if (!listener.islistening())
panic("%s: cannot accept a connection if not listening!", name());

View file

@ -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!");

View file

@ -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)