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:
parent
d805e42b81
commit
221f4f232a
3 changed files with 15 additions and 0 deletions
|
@ -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());
|
||||
|
||||
|
|
|
@ -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!");
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue