From: Michael Tremer Date: Thu, 19 Oct 2023 10:14:33 +0000 (+0000) Subject: downloader: Share connections amonst single transfers X-Git-Tag: 0.9.30~1448 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fcececd1ac2e1179e05e9b07658b8536247e03fa;p=pakfire.git downloader: Share connections amonst single transfers Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/downloader.c b/src/libpakfire/downloader.c index 1002e102d..b1c920931 100644 --- a/src/libpakfire/downloader.c +++ b/src/libpakfire/downloader.c @@ -107,6 +107,9 @@ struct pakfire_downloader { unsigned int parallel; + // cURL share handle + CURLSH* share; + // cURL multi handle CURLM* curl; @@ -126,6 +129,13 @@ static int pakfire_downloader_setup_curl(struct pakfire_downloader* downloader) return r; } + // Create a new share handle + downloader->share = curl_share_init(); + if (!downloader->share) { + CTX_ERROR(downloader->ctx, "Could not setup cURL share handle\n"); + return 1; + } + // Create a new multi handle downloader->curl = curl_multi_init(); if (!downloader->curl) { @@ -133,6 +143,14 @@ static int pakfire_downloader_setup_curl(struct pakfire_downloader* downloader) return 1; } + // Share connections between handles + r = curl_share_setopt(downloader->share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT); + if (r) { + CTX_ERROR(downloader->ctx, "Could not configure the share handle: %s\n", + curl_share_strerror(r)); + return r; + } + // Limit the amount of parallel downloads curl_multi_setopt(downloader->curl, CURLMOPT_MAXCONNECTS, (long)MAX_PARALLEL); @@ -199,6 +217,8 @@ static void pakfire_downloader_free(struct pakfire_downloader* downloader) { pakfire_downloader_transfer_unref(transfer); } + if (downloader->share) + curl_share_cleanup(downloader->share); if (downloader->curl) curl_multi_cleanup(downloader->curl); if (downloader->ctx) @@ -342,6 +362,14 @@ static int pakfire_downloader_transfer_setup( const char* proxy = NULL; int r; + // Configure the share handle + r = curl_easy_setopt(transfer->handle, CURLOPT_SHARE, downloader->share); + if (r) { + CTX_ERROR(downloader->ctx, "Could not configure cURL share handle: %s\n", + curl_easy_strerror(r)); + return r; + } + // Fetch global configuration config = pakfire_ctx_get_config(downloader->ctx);