Procházet zdrojové kódy

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.
Tatsuhiro Tsujikawa před 8 roky
rodič
revize
5b677fa7f2
1 změnil soubory, kde provedl 14 přidání a 5 odebrání
  1. 14 5
      src/SelectEventPoll.cc

+ 14 - 5
src/SelectEventPoll.cc

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