Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/lib/libalpm/dload.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libalpm/dload.c')
-rw-r--r--lib/libalpm/dload.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
index 944c4f95..a4c42f8d 100644
--- a/lib/libalpm/dload.c
+++ b/lib/libalpm/dload.c
@@ -456,7 +456,7 @@ static int curl_retry_next_server(CURLM *curlm, CURL *curl, struct dload_payload
* Returns -2 if an error happened for an optional file
*/
static int curl_check_finished_download(CURLM *curlm, CURLMsg *msg,
- const char *localpath)
+ const char *localpath, int *active_downloads_num)
{
alpm_handle_t *handle = NULL;
struct dload_payload *payload = NULL;
@@ -499,6 +499,7 @@ static int curl_check_finished_download(CURLM *curlm, CURLMsg *msg,
server_soft_error(handle, payload->fileurl);
}
if(curl_retry_next_server(curlm, curl, payload) == 0) {
+ (*active_downloads_num)++;
return 2;
} else {
goto cleanup;
@@ -525,6 +526,7 @@ static int curl_check_finished_download(CURLM *curlm, CURLMsg *msg,
payload->remote_name, hostname, payload->error_buffer);
server_hard_error(handle, payload->fileurl);
if(curl_retry_next_server(curlm, curl, payload) == 0) {
+ (*active_downloads_num)++;
return 2;
} else {
goto cleanup;
@@ -546,6 +548,7 @@ static int curl_check_finished_download(CURLM *curlm, CURLMsg *msg,
payload->remote_name, hostname, payload->error_buffer);
}
if(curl_retry_next_server(curlm, curl, payload) == 0) {
+ (*active_downloads_num)++;
return 2;
} else {
goto cleanup;
@@ -613,6 +616,7 @@ static int curl_check_finished_download(CURLM *curlm, CURLMsg *msg,
sig->max_size = 16 * 1024;
curl_add_payload(handle, curlm, sig, localpath);
+ (*active_downloads_num)++;
}
/* time condition was met and we didn't download anything. we need to
@@ -789,12 +793,11 @@ static int curl_download_internal(alpm_handle_t *handle,
const char *localpath)
{
int active_downloads_num = 0;
- bool recheck_downloads = false;
int err = 0;
int max_streams = handle->parallel_downloads;
CURLM *curlm = handle->curlm;
- while(active_downloads_num > 0 || payloads || recheck_downloads) {
+ while(active_downloads_num > 0 || payloads) {
CURLMcode mc;
for(; active_downloads_num < max_streams && payloads; active_downloads_num++) {
@@ -828,7 +831,6 @@ static int curl_download_internal(alpm_handle_t *handle,
err = -1;
}
- recheck_downloads = false;
while(true) {
int msgs_left = 0;
CURLMsg *msg = curl_multi_info_read(curlm, &msgs_left);
@@ -836,7 +838,8 @@ static int curl_download_internal(alpm_handle_t *handle,
break;
}
if(msg->msg == CURLMSG_DONE) {
- int ret = curl_check_finished_download(curlm, msg, localpath);
+ int ret = curl_check_finished_download(curlm, msg,
+ localpath, &active_downloads_num);
if(ret == -1) {
/* if current payload failed to download then stop adding new payloads but wait for the
* current ones
@@ -844,11 +847,6 @@ static int curl_download_internal(alpm_handle_t *handle,
payloads = NULL;
err = -1;
}
- /* curl_multi_check_finished_download() might add more payloads e.g. in case of a retry
- * from the next mirror. We need to execute curl_multi_perform() at least one more time
- * to make sure new payload requests are processed.
- */
- recheck_downloads = true;
} else {
_alpm_log(handle, ALPM_LOG_ERROR, _("curl transfer error: %d\n"), msg->msg);
}