Skip to content

Commit

Permalink
mingw: Fix high CPU usage in BitTorrent downloads
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
tatsuhiro-t committed Nov 6, 2017
1 parent 8f5eaa4 commit 3aed9cb
Showing 1 changed file with 14 additions and 5 deletions.
19 changes: 14 additions & 5 deletions src/SelectEventPoll.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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_) {
Expand All @@ -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__
Expand All @@ -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);
}
}
Expand Down

0 comments on commit 3aed9cb

Please sign in to comment.