VM eventhandler: Update epoll/kqueue even if the only event is an error

Otherwise, we may try to add an fd to epoll/kqueue when it is already
there.

Also avoid sending multiple notifications on an error.

related #24417

R=fschneider@google.com

Review-Url: https://codereview.chromium.org/2655893002 .
This commit is contained in:
Zachary Anderson 2017-01-25 13:50:00 -08:00
parent e07cc86697
commit 0c3d73967d
4 changed files with 13 additions and 21 deletions

View file

@ -337,13 +337,11 @@ void EventHandlerImplementation::HandleEvents(struct epoll_event* events,
DescriptorInfo* di =
reinterpret_cast<DescriptorInfo*>(events[i].data.ptr);
const intptr_t old_mask = di->Mask();
intptr_t event_mask = GetPollEvents(events[i].events, di);
const intptr_t event_mask = GetPollEvents(events[i].events, di);
if ((event_mask & (1 << kErrorEvent)) != 0) {
di->NotifyAllDartPorts(event_mask);
}
event_mask &= ~(1 << kErrorEvent);
if (event_mask != 0) {
UpdateEpollInstance(old_mask, di);
} else if (event_mask != 0) {
Dart_Port port = di->NextNotifyDartPort(event_mask);
ASSERT(port != 0);
UpdateEpollInstance(old_mask, di);

View file

@ -389,14 +389,12 @@ void EventHandlerImplementation::HandleEvents(struct epoll_event* events,
DescriptorInfo* di =
reinterpret_cast<DescriptorInfo*>(events[i].data.ptr);
const intptr_t old_mask = di->Mask();
intptr_t event_mask = GetPollEvents(events[i].events, di);
const intptr_t event_mask = GetPollEvents(events[i].events, di);
LOG_INFO("HandleEvents: fd=%ld events=%ld\n", di->fd(), event_mask);
if ((event_mask & (1 << kErrorEvent)) != 0) {
di->NotifyAllDartPorts(event_mask);
}
event_mask &= ~(1 << kErrorEvent);
LOG_INFO("HandleEvents: fd=%ld events=%ld\n", di->fd(), event_mask);
if (event_mask != 0) {
UpdateEpollInstance(old_mask, di);
} else if (event_mask != 0) {
Dart_Port port = di->NextNotifyDartPort(event_mask);
ASSERT(port != 0);
UpdateEpollInstance(old_mask, di);

View file

@ -362,13 +362,11 @@ void EventHandlerImplementation::HandleEvents(struct epoll_event* events,
DescriptorInfo* di =
reinterpret_cast<DescriptorInfo*>(events[i].data.ptr);
const intptr_t old_mask = di->Mask();
intptr_t event_mask = GetPollEvents(events[i].events, di);
const intptr_t event_mask = GetPollEvents(events[i].events, di);
if ((event_mask & (1 << kErrorEvent)) != 0) {
di->NotifyAllDartPorts(event_mask);
}
event_mask &= ~(1 << kErrorEvent);
if (event_mask != 0) {
UpdateEpollInstance(old_mask, di);
} else if (event_mask != 0) {
Dart_Port port = di->NextNotifyDartPort(event_mask);
ASSERT(port != 0);
UpdateEpollInstance(old_mask, di);

View file

@ -389,13 +389,11 @@ void EventHandlerImplementation::HandleEvents(struct kevent* events, int size) {
} else {
DescriptorInfo* di = reinterpret_cast<DescriptorInfo*>(events[i].udata);
const intptr_t old_mask = di->Mask();
intptr_t event_mask = GetEvents(events + i, di);
const intptr_t event_mask = GetEvents(events + i, di);
if ((event_mask & (1 << kErrorEvent)) != 0) {
di->NotifyAllDartPorts(event_mask);
}
event_mask &= ~(1 << kErrorEvent);
if (event_mask != 0) {
UpdateKQueueInstance(old_mask, di);
} else if (event_mask != 0) {
Dart_Port port = di->NextNotifyDartPort(event_mask);
ASSERT(port != 0);
UpdateKQueueInstance(old_mask, di);