mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 15:57:17 +00:00
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:
parent
e07cc86697
commit
0c3d73967d
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue