From fcececd1ac2e1179e05e9b07658b8536247e03fa Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 19 Oct 2023 10:14:33 +0000 Subject: [PATCH] downloader: Share connections amonst single transfers Signed-off-by: Michael Tremer --- src/libpakfire/downloader.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) 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); -- 2.47.3