+ # For client cleanup
+ self._generation += 1
+
+ assert compat.all((req.error is None and
+ req.success is None and
+ req.resp_status_code is None and
+ req.resp_body is None)
+ for req in requests)
+
+ curl_to_pclient = {}
+ for req in requests:
+ pclient = self._StartRequest(req)
+ curl = pclient.client.GetCurlHandle()
+ curl_to_pclient[curl] = pclient
+ multi.add_handle(curl)
+ assert pclient.client.GetCurrentRequest() == req
+ assert pclient.lastused >= 0
+
+ assert len(curl_to_pclient) == len(requests)
+
+ done_count = 0
+ while True:
+ (ret, _) = multi.perform()
+ assert ret in (pycurl.E_MULTI_OK, pycurl.E_CALL_MULTI_PERFORM)
+
+ if ret == pycurl.E_CALL_MULTI_PERFORM:
+ # cURL wants to be called again
+ continue
+
+ while True:
+ (remaining_messages, successful, failed) = multi.info_read()
+
+ for curl in successful:
+ multi.remove_handle(curl)
+ done_count += 1
+ pclient = curl_to_pclient[curl]
+ req = pclient.client.GetCurrentRequest()
+ pclient.client.Done(None)
+ assert req.success
+ assert not pclient.client.GetCurrentRequest()
+
+ for curl, errnum, errmsg in failed:
+ multi.remove_handle(curl)
+ done_count += 1
+ pclient = curl_to_pclient[curl]
+ req = pclient.client.GetCurrentRequest()
+ pclient.client.Done("Error %s: %s" % (errnum, errmsg))
+ assert req.error
+ assert not pclient.client.GetCurrentRequest()
+
+ if remaining_messages == 0:
+ break
+
+ assert done_count <= len(requests)
+
+ if done_count == len(requests):
+ break