Merge pull request #1061 from aria2/fix-win-select

mingw: Fix high CPU usage in BitTorrent downloads
This commit is contained in:
Tatsuhiro Tsujikawa 2017-11-06 23:13:20 +09:00 committed by GitHub
commit 3c6a70c566
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

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);
}
}