mingw: Fix high CPU usage in BitTorrent downloads

This commit fixes high CPU usage in BitTorrent downloads.  Only mingw
build is affected by this bug.

Thank you kwkam for identifying the cause of the issue, and helping
debugging this patch.
This commit is contained in:
Tatsuhiro Tsujikawa 2017-11-05 20:52:42 +09:00
parent 8f5eaa4bbb
commit 3aed9cb533

View File

@ -174,6 +174,12 @@ void SelectEventPoll::poll(const struct timeval& tv)
memcpy(&rfds, &rfdset_, sizeof(fd_set));
memcpy(&wfds, &wfdset_, sizeof(fd_set));
#ifdef __MINGW32__
fd_set efds;
memcpy(&efds, &wfdset_, sizeof(fd_set));
#endif // __MINGW32__
#ifdef ENABLE_ASYNC_DNS
for (auto& i : nameResolverEntries_) {
@ -190,11 +196,9 @@ void SelectEventPoll::poll(const struct timeval& tv)
do {
struct timeval ttv = tv;
#ifdef __MINGW32__
// winsock will report non-blocking connect() errors in exceptfds, unlike
// posix, which will mark such sockets as writable.
// So just pass in our write socket set to exceptfds, too, to get connect()
// error notifications on Windows.
retval = select(fdmax_ + 1, &rfds, &wfds, &wfds, &ttv);
// winsock will report non-blocking connect() errors in efds,
// unlike posix, which will mark such sockets as writable.
retval = select(fdmax_ + 1, &rfds, &wfds, &efds, &ttv);
#else // !__MINGW32__
retval = select(fdmax_ + 1, &rfds, &wfds, nullptr, &ttv);
#endif // !__MINGW32__
@ -209,6 +213,11 @@ void SelectEventPoll::poll(const struct timeval& tv)
if (FD_ISSET(e.getSocket(), &wfds)) {
events |= EventPoll::EVENT_WRITE;
}
#ifdef __MINGW32__
if (FD_ISSET(e.getSocket(), &efds)) {
events |= EventPoll::EVENT_ERROR;
}
#endif // __MINGW32__
e.processEvents(events);
}
}