From: Michael Tremer Date: Wed, 22 Jan 2025 11:57:20 +0000 (+0000) Subject: httpclient: Split dequeue and removing the handle X-Git-Tag: 0.9.30~397 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8bbc022f8e1db71798e9d2c1bf5b16bc708b4717;p=pakfire.git httpclient: Split dequeue and removing the handle This helps us to simplify the reference counting for queued xfers, but at the same time we can hold a reference to connected websockets. Signed-off-by: Michael Tremer --- diff --git a/src/pakfire/httpclient.c b/src/pakfire/httpclient.c index d2e85ec1..a853c9b9 100644 --- a/src/pakfire/httpclient.c +++ b/src/pakfire/httpclient.c @@ -570,13 +570,14 @@ ERROR: return r; } -int pakfire_httpclient_remove_xfer(struct pakfire_httpclient* client, +int pakfire_httpclient_dequeue_xfer(struct pakfire_httpclient* client, struct pakfire_xfer* xfer) { struct pakfire_httpclient_xfer* e = NULL; - int r; // Find reference e = pakfire_httpclient_xfer_find(client, xfer); + if (!e) + return 0; // Decrement the xfers counter client->total_xfers--; @@ -584,21 +585,24 @@ int pakfire_httpclient_remove_xfer(struct pakfire_httpclient* client, // Reduce the total download size client->total_downloadsize -= pakfire_xfer_get_size(xfer); + TAILQ_REMOVE(&client->xfers, e, nodes); + pakfire_httpclient_xfer_free(e); + + return 0; +} + +int pakfire_httpclient_remove_xfer(struct pakfire_httpclient* client, + struct pakfire_xfer* xfer) { + int r; + // Remove the handle r = curl_multi_remove_handle(client->curl, pakfire_xfer_handle(xfer)); if (r) { ERROR(client->ctx, "Could not remove the handle: %s\n", curl_multi_strerror(r)); - goto ERROR; + return -ENOTSUP; } - if (e) - TAILQ_REMOVE(&client->xfers, e, nodes); - -ERROR: - if (e) - pakfire_httpclient_xfer_free(e); - - return r; + return 0; } int pakfire_httpclient_run(struct pakfire_httpclient* client, const char* title) { diff --git a/src/pakfire/httpclient.h b/src/pakfire/httpclient.h index 334ddda6..de5ebec6 100644 --- a/src/pakfire/httpclient.h +++ b/src/pakfire/httpclient.h @@ -39,6 +39,8 @@ sd_event* pakfire_httpclient_loop(struct pakfire_httpclient* client); int pakfire_httpclient_enqueue_xfer( struct pakfire_httpclient* client, struct pakfire_xfer* xfer); +int pakfire_httpclient_dequeue_xfer( + struct pakfire_httpclient* client, struct pakfire_xfer* xfer); int pakfire_httpclient_remove_xfer( struct pakfire_httpclient* client, struct pakfire_xfer* xfer); diff --git a/src/pakfire/xfer.c b/src/pakfire/xfer.c index e7371ba1..7205fb8a 100644 --- a/src/pakfire/xfer.c +++ b/src/pakfire/xfer.c @@ -142,6 +142,10 @@ static void pakfire_xfer_free(struct pakfire_xfer* xfer) { if (xfer->evp) EVP_MD_CTX_free(xfer->evp); + // Remove the cURL handle + if (xfer->client) + pakfire_httpclient_remove_xfer(xfer->client, xfer); + // systemd if (xfer->event) sd_event_source_unref(xfer->event); @@ -1323,9 +1327,9 @@ pakfire_xfer_error_code_t pakfire_xfer_done(struct pakfire_xfer* xfer, int code) } ERROR: - // Remove the handle + // Remove the xfer from the queue if (xfer->client) - pakfire_httpclient_remove_xfer(xfer->client, xfer); + pakfire_httpclient_dequeue_xfer(xfer->client, xfer); return r; }