From 918c43bfae3926f37efd10368e1e66c166b55818 Mon Sep 17 00:00:00 2001 From: blashyrkh Date: Sun, 12 Feb 2017 01:13:14 +0300 Subject: [PATCH] Fixed hangup in Dispatcher::yield() in Linux It might enter into an infinite loop if epoll_wait begins to return EPOLLERR|EPOLLHUP event mask. --- src/Platform/Linux/System/Dispatcher.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Platform/Linux/System/Dispatcher.cpp b/src/Platform/Linux/System/Dispatcher.cpp index 4269eb7a25..a4d5d3e39a 100755 --- a/src/Platform/Linux/System/Dispatcher.cpp +++ b/src/Platform/Linux/System/Dispatcher.cpp @@ -329,6 +329,8 @@ void Dispatcher::yield() { contextPair->readContext->context->interruptProcedure = nullptr; pushContext(contextPair->readContext->context); contextPair->readContext->events = events[i].events; + } else if ((events[i].events & (EPOLLERR | EPOLLHUP)) != 0) { + throw std::runtime_error("Dispatcher::dispatch, events & (EPOLLERR | EPOLLHUP) != 0"); } else { continue; }