curl_multi_wait: avoid second loop if nothing to do
authorDaniel Stenberg <daniel@haxx.se>
Sat, 9 Mar 2013 21:26:07 +0000 (22:26 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Sat, 9 Mar 2013 21:27:15 +0000 (22:27 +0100)
... hopefully this will also make clang-analyzer stop warning on
potentional NULL dereferences (which were false positives anyway).

lib/multi.c

index 825f777..a369d03 100644 (file)
@@ -802,7 +802,8 @@ CURLMcode curl_multi_wait(CURLM *multi_handle,
   curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
   int bitmap;
   unsigned int i;
-  unsigned int nfds = extra_nfds;
+  unsigned int nfds = 0;
+  unsigned int curlfds;
   struct pollfd *ufds = NULL;
 
   if(!GOOD_MULTI_HANDLE(multi))
@@ -832,6 +833,9 @@ CURLMcode curl_multi_wait(CURLM *multi_handle,
     easy = easy->next; /* check next handle */
   }
 
+  curlfds = nfds; /* number of internal file descriptors */
+  nfds += extra_nfds; /* add the externally provided ones */
+
   if(nfds) {
     ufds = malloc(nfds * sizeof(struct pollfd));
     if(!ufds)
@@ -839,32 +843,37 @@ CURLMcode curl_multi_wait(CURLM *multi_handle,
   }
   nfds = 0;
 
-  /* Add the curl handles to our pollfds first */
-  easy=multi->easy.next;
-  while(easy != &multi->easy) {
-    bitmap = multi_getsock(easy, sockbunch, MAX_SOCKSPEREASYHANDLE);
+  /* only do the second loop if we found descriptors in the first stage run
+     above */
 
-    for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++) {
-      curl_socket_t s = CURL_SOCKET_BAD;
+  if(curlfds) {
+    /* Add the curl handles to our pollfds first */
+    easy=multi->easy.next;
+    while(easy != &multi->easy) {
+      bitmap = multi_getsock(easy, sockbunch, MAX_SOCKSPEREASYHANDLE);
 
-      if(bitmap & GETSOCK_READSOCK(i)) {
-        ufds[nfds].fd = sockbunch[i];
-        ufds[nfds].events = POLLIN;
-        ++nfds;
-        s = sockbunch[i];
-      }
-      if(bitmap & GETSOCK_WRITESOCK(i)) {
-        ufds[nfds].fd = sockbunch[i];
-        ufds[nfds].events = POLLOUT;
-        ++nfds;
-        s = sockbunch[i];
-      }
-      if(s == CURL_SOCKET_BAD) {
-        break;
+      for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++) {
+        curl_socket_t s = CURL_SOCKET_BAD;
+
+        if(bitmap & GETSOCK_READSOCK(i)) {
+          ufds[nfds].fd = sockbunch[i];
+          ufds[nfds].events = POLLIN;
+          ++nfds;
+          s = sockbunch[i];
+        }
+        if(bitmap & GETSOCK_WRITESOCK(i)) {
+          ufds[nfds].fd = sockbunch[i];
+          ufds[nfds].events = POLLOUT;
+          ++nfds;
+          s = sockbunch[i];
+        }
+        if(s == CURL_SOCKET_BAD) {
+          break;
+        }
       }
-    }
 
-    easy = easy->next; /* check next handle */
+      easy = easy->next; /* check next handle */
+    }
   }
 
   /* Add external file descriptions from poll-like struct curl_waitfd */