From 5a67492c323f943cc1b3f970b66aee5c249f24a7 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Mon, 12 Aug 2024 15:02:01 +0000 Subject: [PATCH] buildservice: Allow passing the event loop to the HTTP client Signed-off-by: Michael Tremer --- src/_pakfire/buildservice.c | 2 +- src/cli/lib/client-build.c | 2 +- src/cli/lib/repo_create.c | 2 +- src/cli/lib/repo_delete.c | 2 +- src/cli/lib/repo_list.c | 2 +- src/cli/lib/repo_show.c | 2 +- src/cli/lib/upload_create.c | 2 +- src/cli/lib/upload_delete.c | 2 +- src/cli/lib/upload_list.c | 2 +- src/libpakfire/buildservice.c | 15 ++++++++---- src/libpakfire/daemon.c | 2 +- src/libpakfire/dist.c | 2 +- src/libpakfire/httpclient.c | 23 ++++++++++++------- src/libpakfire/include/pakfire/buildservice.h | 9 +++++++- src/libpakfire/include/pakfire/httpclient.h | 5 +++- src/libpakfire/repo.c | 8 +++---- src/libpakfire/transaction.c | 2 +- tests/libpakfire/httpclient.c | 2 +- tests/testsuite.c | 2 +- 19 files changed, 56 insertions(+), 32 deletions(-) diff --git a/src/_pakfire/buildservice.c b/src/_pakfire/buildservice.c index 7772df460..a6099f638 100644 --- a/src/_pakfire/buildservice.c +++ b/src/_pakfire/buildservice.c @@ -41,7 +41,7 @@ static int BuildService_init(BuildServiceObject* self, PyObject* args, PyObject* if (!PyArg_ParseTuple(args, "O!", &CtxType, &ctx)) return -1; - r = pakfire_buildservice_create(&self->service, ctx->ctx); + r = pakfire_buildservice_create(&self->service, ctx->ctx, NULL); if (r) { errno = -r; diff --git a/src/cli/lib/client-build.c b/src/cli/lib/client-build.c index e76b72075..32989feae 100644 --- a/src/cli/lib/client-build.c +++ b/src/cli/lib/client-build.c @@ -111,7 +111,7 @@ int cli_client_build(void* data, int argc, char* argv[]) { goto ERROR; // Connect to the build service - r = pakfire_buildservice_create(&service, cli_config->ctx); + r = pakfire_buildservice_create(&service, cli_config->ctx, NULL); if (r) goto ERROR; diff --git a/src/cli/lib/repo_create.c b/src/cli/lib/repo_create.c index f825f47bb..cf6ac3773 100644 --- a/src/cli/lib/repo_create.c +++ b/src/cli/lib/repo_create.c @@ -87,7 +87,7 @@ int cli_repo_create(void* data, int argc, char* argv[]) { goto ERROR; // Connect to the build service - r = pakfire_buildservice_create(&service, cli_config->ctx); + r = pakfire_buildservice_create(&service, cli_config->ctx, NULL); if (r) goto ERROR; diff --git a/src/cli/lib/repo_delete.c b/src/cli/lib/repo_delete.c index 84a0ace4c..76b2287f0 100644 --- a/src/cli/lib/repo_delete.c +++ b/src/cli/lib/repo_delete.c @@ -74,7 +74,7 @@ int cli_repo_delete(void* data, int argc, char* argv[]) { goto ERROR; // Connect to the build service - r = pakfire_buildservice_create(&service, cli_config->ctx); + r = pakfire_buildservice_create(&service, cli_config->ctx, NULL); if (r) goto ERROR; diff --git a/src/cli/lib/repo_list.c b/src/cli/lib/repo_list.c index a00c2bb79..3feba67e7 100644 --- a/src/cli/lib/repo_list.c +++ b/src/cli/lib/repo_list.c @@ -66,7 +66,7 @@ int cli_repo_list(void* data, int argc, char* argv[]) { goto ERROR; // Connect to the build service - r = pakfire_buildservice_create(&service, cli_config->ctx); + r = pakfire_buildservice_create(&service, cli_config->ctx, NULL); if (r) goto ERROR; diff --git a/src/cli/lib/repo_show.c b/src/cli/lib/repo_show.c index 9bdc7c794..2cedcfefc 100644 --- a/src/cli/lib/repo_show.c +++ b/src/cli/lib/repo_show.c @@ -72,7 +72,7 @@ int cli_repo_show(void* data, int argc, char* argv[]) { goto ERROR; // Connect to the build service - r = pakfire_buildservice_create(&service, cli_config->ctx); + r = pakfire_buildservice_create(&service, cli_config->ctx, NULL); if (r) goto ERROR; diff --git a/src/cli/lib/upload_create.c b/src/cli/lib/upload_create.c index e0d3b4498..09f49be2f 100644 --- a/src/cli/lib/upload_create.c +++ b/src/cli/lib/upload_create.c @@ -69,7 +69,7 @@ int cli_upload_create(void* data, int argc, char* argv[]) { goto ERROR; // Connect to the build service - r = pakfire_buildservice_create(&service, cli_config->ctx); + r = pakfire_buildservice_create(&service, cli_config->ctx, NULL); if (r) goto ERROR; diff --git a/src/cli/lib/upload_delete.c b/src/cli/lib/upload_delete.c index eeb09191f..daccab6f2 100644 --- a/src/cli/lib/upload_delete.c +++ b/src/cli/lib/upload_delete.c @@ -73,7 +73,7 @@ int cli_upload_delete(void* data, int argc, char* argv[]) { goto ERROR; // Connect to the build service - r = pakfire_buildservice_create(&service, cli_config->ctx); + r = pakfire_buildservice_create(&service, cli_config->ctx, NULL); if (r) goto ERROR; diff --git a/src/cli/lib/upload_list.c b/src/cli/lib/upload_list.c index c8e5697e4..7dc49cb51 100644 --- a/src/cli/lib/upload_list.c +++ b/src/cli/lib/upload_list.c @@ -42,7 +42,7 @@ int cli_upload_list(void* data, int argc, char* argv[]) { goto ERROR; // Connect to the build service - r = pakfire_buildservice_create(&service, cli_config->ctx); + r = pakfire_buildservice_create(&service, cli_config->ctx, NULL); if (r) goto ERROR; diff --git a/src/libpakfire/buildservice.c b/src/libpakfire/buildservice.c index d3bed7e96..9d449a90f 100644 --- a/src/libpakfire/buildservice.c +++ b/src/libpakfire/buildservice.c @@ -76,7 +76,7 @@ ERROR: return r; } -static int pakfire_buildservice_setup(struct pakfire_buildservice* service) { +static int pakfire_buildservice_setup(struct pakfire_buildservice* service, sd_event* loop) { struct pakfire_config* config = NULL; const char* url = NULL; const char* keytab = NULL; @@ -111,7 +111,7 @@ static int pakfire_buildservice_setup(struct pakfire_buildservice* service) { goto ERROR; // Setup the HTTP client - r = pakfire_httpclient_create(&service->httpclient, service->ctx); + r = pakfire_httpclient_create(&service->httpclient, service->ctx, loop); if (r) goto ERROR; @@ -139,7 +139,7 @@ static void pakfire_buildservice_free(struct pakfire_buildservice* service) { } PAKFIRE_EXPORT int pakfire_buildservice_create( - struct pakfire_buildservice** service, struct pakfire_ctx* ctx) { + struct pakfire_buildservice** service, struct pakfire_ctx* ctx, sd_event* loop) { struct pakfire_buildservice* s = NULL; int r; @@ -155,7 +155,7 @@ PAKFIRE_EXPORT int pakfire_buildservice_create( s->nrefs = 1; // Setup everything - r = pakfire_buildservice_setup(s); + r = pakfire_buildservice_setup(s, loop); if (r) goto ERROR; @@ -1015,3 +1015,10 @@ ERROR: return r; } + +/* + Called before the daemon's +*/ +int pakfire_buildservice_daemon(struct pakfire_buildservice* service) { + return 0; +} diff --git a/src/libpakfire/daemon.c b/src/libpakfire/daemon.c index 9fd9cc5af..5b3c79684 100644 --- a/src/libpakfire/daemon.c +++ b/src/libpakfire/daemon.c @@ -117,7 +117,7 @@ int pakfire_daemon_create(struct pakfire_daemon** daemon, struct pakfire_ctx* ct goto ERROR; // Connect to the buildservice - r = pakfire_buildservice_create(&d->service, d->ctx); + r = pakfire_buildservice_create(&d->service, d->ctx, d->loop); if (r) goto ERROR; diff --git a/src/libpakfire/dist.c b/src/libpakfire/dist.c index eff633faf..59b21d241 100644 --- a/src/libpakfire/dist.c +++ b/src/libpakfire/dist.c @@ -361,7 +361,7 @@ static int pakfire_dist_add_sources(struct pakfire* pakfire, struct pakfire_pack struct pakfire_ctx* ctx = pakfire_ctx(pakfire); // Create a HTTP client - r = pakfire_httpclient_create(&httpclient, ctx); + r = pakfire_httpclient_create(&httpclient, ctx, NULL); if (r) goto ERROR; diff --git a/src/libpakfire/httpclient.c b/src/libpakfire/httpclient.c index 557bc789c..ebf7e974b 100644 --- a/src/libpakfire/httpclient.c +++ b/src/libpakfire/httpclient.c @@ -276,15 +276,21 @@ ERROR: return r; } -static int pakfire_httpclient_setup_loop(struct pakfire_httpclient* client) { +static int pakfire_httpclient_setup_loop(struct pakfire_httpclient* client, sd_event* loop) { int r; - // Create a new event loop - r = sd_event_new(&client->loop); - if (r < 0) { - CTX_ERROR(client->ctx, "Could not setup event loop: %s\n", strerror(-r)); + // Use the given loop + if (loop) { + client->loop = sd_event_ref(loop); - return r; + // Otherwise create a new loop + } else { + r = sd_event_new(&client->loop); + if (r < 0) { + CTX_ERROR(client->ctx, "Could not setup event loop: %s\n", strerror(-r)); + + return r; + } } // Create a new timer @@ -409,7 +415,8 @@ static void pakfire_httpclient_free(struct pakfire_httpclient* client) { free(client); } -int pakfire_httpclient_create(struct pakfire_httpclient** client, struct pakfire_ctx* ctx) { +int pakfire_httpclient_create(struct pakfire_httpclient** client, + struct pakfire_ctx* ctx, sd_event* loop) { struct pakfire_httpclient* c = NULL; int r; @@ -434,7 +441,7 @@ int pakfire_httpclient_create(struct pakfire_httpclient** client, struct pakfire c->max_parallel = DEFAULT_MAX_PARALLEL; // Setup event loop - r = pakfire_httpclient_setup_loop(c); + r = pakfire_httpclient_setup_loop(c, loop); if (r) goto ERROR; diff --git a/src/libpakfire/include/pakfire/buildservice.h b/src/libpakfire/include/pakfire/buildservice.h index af11bc6b3..079a613f2 100644 --- a/src/libpakfire/include/pakfire/buildservice.h +++ b/src/libpakfire/include/pakfire/buildservice.h @@ -25,9 +25,12 @@ struct pakfire_buildservice; #include +#include + #include -int pakfire_buildservice_create(struct pakfire_buildservice** service, struct pakfire_ctx* ctx); +int pakfire_buildservice_create(struct pakfire_buildservice** service, + struct pakfire_ctx* ctx, sd_event* loop); struct pakfire_buildservice* pakfire_buildservice_ref(struct pakfire_buildservice* service); struct pakfire_buildservice* pakfire_buildservice_unref(struct pakfire_buildservice* service); @@ -72,4 +75,8 @@ int pakfire_buildservice_submit_stats(struct pakfire_buildservice* service); int pakfire_buildservice_job_finished(struct pakfire_buildservice* service, const char* uuid, int success, const char* logfile, const char** packages); +// Daemon + +int pakfire_buildservice_daemon(struct pakfire_buildservice* service); + #endif /* PAKFIRE_BUILDSERVICE_H */ diff --git a/src/libpakfire/include/pakfire/httpclient.h b/src/libpakfire/include/pakfire/httpclient.h index e937adb3c..4c08a6c1d 100644 --- a/src/libpakfire/include/pakfire/httpclient.h +++ b/src/libpakfire/include/pakfire/httpclient.h @@ -25,12 +25,15 @@ #include +#include + struct pakfire_httpclient; #include #include -int pakfire_httpclient_create(struct pakfire_httpclient** downloader, struct pakfire_ctx* ctx); +int pakfire_httpclient_create(struct pakfire_httpclient** downloader, + struct pakfire_ctx* ctx, sd_event* loop); struct pakfire_httpclient* pakfire_httpclient_ref(struct pakfire_httpclient* downloader); struct pakfire_httpclient* pakfire_httpclient_unref(struct pakfire_httpclient* downloader); diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index 4e1043997..36cd9dd58 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -459,7 +459,7 @@ static int pakfire_repo_download_database(struct pakfire_repo* repo, return r; // Create a HTTP client - r = pakfire_httpclient_create(&httpclient, repo->ctx); + r = pakfire_httpclient_create(&httpclient, repo->ctx, NULL); if (r) goto ERROR; @@ -626,7 +626,7 @@ static int pakfire_repo_refresh_mirrorlist(struct pakfire_repo* repo, const int } // Create a new HTTP client - r = pakfire_httpclient_create(&httpclient, repo->ctx); + r = pakfire_httpclient_create(&httpclient, repo->ctx, NULL); if (r) goto ERROR; @@ -686,7 +686,7 @@ static int pakfire_repo_download_metadata(struct pakfire_repo* repo, const char* } // Create a HTTP client - r = pakfire_httpclient_create(&httpclient, repo->ctx); + r = pakfire_httpclient_create(&httpclient, repo->ctx, NULL); if (r) goto ERROR; @@ -1296,7 +1296,7 @@ static int pakfire_repo_download(struct pakfire_repo* repo, const char* url, } // Create the HTTP client - r = pakfire_httpclient_create(&httpclient, repo->ctx); + r = pakfire_httpclient_create(&httpclient, repo->ctx, NULL); if (r) goto ERROR; diff --git a/src/libpakfire/transaction.c b/src/libpakfire/transaction.c index 31b7e83f1..18b9ccbd8 100644 --- a/src/libpakfire/transaction.c +++ b/src/libpakfire/transaction.c @@ -1903,7 +1903,7 @@ PAKFIRE_EXPORT int pakfire_transaction_download(struct pakfire_transaction* tran int r; // Initialize the HTTP client - r = pakfire_httpclient_create(&httpclient, transaction->ctx); + r = pakfire_httpclient_create(&httpclient, transaction->ctx, NULL); if (r) { ERROR(transaction->pakfire, "Could not initialize HTTP client: %m\n"); return 1; diff --git a/tests/libpakfire/httpclient.c b/tests/libpakfire/httpclient.c index fde51743e..78d7fa947 100644 --- a/tests/libpakfire/httpclient.c +++ b/tests/libpakfire/httpclient.c @@ -31,7 +31,7 @@ static int test_create(const struct test* t) { int r = EXIT_FAILURE; // Create a HTTP client - ASSERT_SUCCESS(pakfire_httpclient_create(&client, t->ctx)); + ASSERT_SUCCESS(pakfire_httpclient_create(&client, t->ctx, NULL)); // Everything passed r = EXIT_SUCCESS; diff --git a/tests/testsuite.c b/tests/testsuite.c index 9a0f55d21..4f82c1700 100644 --- a/tests/testsuite.c +++ b/tests/testsuite.c @@ -95,7 +95,7 @@ static int test_run(int i, struct test* t) { // Create a HTTP client (if requested) if (t->flags & TEST_WANTS_HTTPCLIENT) { - r = pakfire_httpclient_create(&t->httpclient, t->ctx); + r = pakfire_httpclient_create(&t->httpclient, t->ctx, NULL); if (r) { LOG("ERROR: Could not initialize the HTTP client: %s\n", strerror(-r)); goto ERROR; -- 2.47.2