]> git.ipfire.org Git - pakfire.git/commitdiff
httpclient: Split dequeue and removing the handle
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 22 Jan 2025 11:57:20 +0000 (11:57 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 22 Jan 2025 11:57:20 +0000 (11:57 +0000)
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 <michael.tremer@ipfire.org>
src/pakfire/httpclient.c
src/pakfire/httpclient.h
src/pakfire/xfer.c

index d2e85ec1d719026cfd75d38bc38ec6881b6c59c5..a853c9b936a9d6daadc8263937d4974a6736d7fe 100644 (file)
@@ -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) {
index 334ddda666012c1dbcb07bb6de659947c0a7c76a..de5ebec6a37519dd4c2a1e4f566e3318bf0a5637 100644 (file)
@@ -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);
 
index e7371ba1e4e98e43f3182f3c5b0273bd89baeac2..7205fb8aa030390db4b57166d33e7ce8754b131c 100644 (file)
@@ -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;
 }