]> git.ipfire.org Git - pakfire.git/commitdiff
downloader: Share connections amonst single transfers
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 19 Oct 2023 10:14:33 +0000 (10:14 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 19 Oct 2023 10:14:33 +0000 (10:14 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/downloader.c

index 1002e102dd3d6d54a1a361581656705f98b3cd64..b1c9209310f479e52ad42b450bb1e52e62129581 100644 (file)
@@ -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);