From: Michael Tremer Date: Mon, 2 Oct 2023 10:14:00 +0000 (+0000) Subject: progress: Implement child progress X-Git-Tag: 0.9.30~1573 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=15d744568e280766594b1659cfabcb508cfc4cff;p=pakfire.git progress: Implement child progress This can be used if we need to propagate progress to an upstream progress indicator. Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/compress.c b/src/libpakfire/compress.c index da197aab3..f850f7294 100644 --- a/src/libpakfire/compress.c +++ b/src/libpakfire/compress.c @@ -818,7 +818,7 @@ int pakfire_extract(struct pakfire* pakfire, struct archive* archive, progress_flags |= PAKFIRE_PROGRESS_SHOW_TRANSFER_SPEED; // Create the progress indicator - r = pakfire_progress_create(&data.progress, pakfire, progress_flags); + r = pakfire_progress_create(&data.progress, pakfire, progress_flags, NULL); if (r) goto ERROR; @@ -1026,7 +1026,7 @@ int pakfire_compress(struct pakfire* pakfire, struct archive* archive, const size_t size = pakfire_filelist_total_size(filelist); // Create the progress indicator - r = pakfire_progress_create(&data.progress, pakfire, progress_flags); + r = pakfire_progress_create(&data.progress, pakfire, progress_flags, NULL); if (r) goto ERROR; diff --git a/src/libpakfire/filelist.c b/src/libpakfire/filelist.c index 2cb42869f..08738a656 100644 --- a/src/libpakfire/filelist.c +++ b/src/libpakfire/filelist.c @@ -426,7 +426,7 @@ int pakfire_filelist_walk(struct pakfire_filelist* list, // Show progress when iterating over the filelist if (flags & PAKFIRE_FILELIST_SHOW_PROGRESS) { r = pakfire_progress_create(&progress, list->pakfire, - PAKFIRE_PROGRESS_SHOW_PERCENTAGE|PAKFIRE_PROGRESS_SHOW_ETA); + PAKFIRE_PROGRESS_SHOW_PERCENTAGE|PAKFIRE_PROGRESS_SHOW_ETA, NULL); if (r) goto ERROR; @@ -502,7 +502,7 @@ int pakfire_filelist_verify(struct pakfire_filelist* list, struct pakfire_fileli // Setup progress r = pakfire_progress_create(&progress, list->pakfire, - PAKFIRE_PROGRESS_SHOW_PERCENTAGE|PAKFIRE_PROGRESS_SHOW_ETA); + PAKFIRE_PROGRESS_SHOW_PERCENTAGE|PAKFIRE_PROGRESS_SHOW_ETA, NULL); if (r) goto ERROR; diff --git a/src/libpakfire/include/pakfire/progress.h b/src/libpakfire/include/pakfire/progress.h index 3d2224287..d62e2d2a2 100644 --- a/src/libpakfire/include/pakfire/progress.h +++ b/src/libpakfire/include/pakfire/progress.h @@ -60,6 +60,7 @@ void pakfire_progress_set_update_callback( void pakfire_progress_set_free_callback( struct pakfire_progress* p, pakfire_progress_free_callback callback); +struct pakfire_progress* pakfire_progress_get_parent(struct pakfire_progress* p); unsigned long int pakfire_progress_get_value(struct pakfire_progress* p); unsigned long int pakfire_progress_get_max_value(struct pakfire_progress* p); const char* pakfire_progress_get_title(struct pakfire_progress* p); @@ -73,7 +74,7 @@ double pakfire_progress_get_transfer_speed(struct pakfire_progress* p); #include int pakfire_progress_create(struct pakfire_progress** progress, - struct pakfire* pakfire, int flags); + struct pakfire* pakfire, int flags, struct pakfire_progress* parent); struct pakfire_progress* pakfire_progress_ref(struct pakfire_progress* p); struct pakfire_progress* pakfire_progress_unref(struct pakfire_progress* p); diff --git a/src/libpakfire/progress.c b/src/libpakfire/progress.c index a3c6b64b5..312826cb7 100644 --- a/src/libpakfire/progress.c +++ b/src/libpakfire/progress.c @@ -37,6 +37,9 @@ struct pakfire_progress { // Flags what to show int flags; + // Parent + struct pakfire_progress* parent; + // Status enum pakfire_progress_status { PAKFIRE_PROGRESS_INIT = 0, @@ -71,6 +74,8 @@ static void pakfire_progress_free(struct pakfire_progress* p) { if (p->callbacks.free) p->callbacks.free(p->pakfire, p, p->callbacks.data); + if (p->parent) + pakfire_progress_unref(p->parent); if (p->title) free(p->title); pakfire_unref(p->pakfire); @@ -90,7 +95,7 @@ static int pakfire_progress_default_start_callback(struct pakfire* pakfire, } int pakfire_progress_create(struct pakfire_progress** progress, - struct pakfire* pakfire, int flags) { + struct pakfire* pakfire, int flags, struct pakfire_progress* parent) { struct pakfire_progress* p = NULL; int r; @@ -111,6 +116,10 @@ int pakfire_progress_create(struct pakfire_progress** progress, // Initialize status p->status = PAKFIRE_PROGRESS_INIT; + // Store a reference to the parent + if (parent) + p->parent = pakfire_progress_ref(parent); + // Configure some default callbacks p->callbacks.start = pakfire_progress_default_start_callback; @@ -240,6 +249,13 @@ int pakfire_progress_finish(struct pakfire_progress* p) { int pakfire_progress_update(struct pakfire_progress* p, unsigned long int value) { int r; + // Report the change to the parent progress + if (p->parent) { + r = pakfire_progress_increment(p->parent, value - p->value); + if (r) + return r; + } + // Store the new value p->value = value; @@ -281,11 +297,23 @@ int pakfire_progress_reset(struct pakfire_progress* p) { } // Reset values - p->value = p->max_value = 0; + r = pakfire_progress_update(p, 0); + if (r) + return r; + + // Reset max value + pakfire_progress_set_max_value(p, 0); return 0; } +PAKFIRE_EXPORT struct pakfire_progress* pakfire_progress_get_parent(struct pakfire_progress* p) { + if (p->parent) + return pakfire_progress_ref(p->parent); + + return NULL; +} + PAKFIRE_EXPORT unsigned long int pakfire_progress_get_value(struct pakfire_progress* p) { return p->value; } diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index 2c89269d6..ab70091aa 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -1370,7 +1370,7 @@ PAKFIRE_EXPORT int pakfire_repo_scan(struct pakfire_repo* repo, int flags) { // Create progress indicator r = pakfire_progress_create(&progress, repo->pakfire, - PAKFIRE_PROGRESS_SHOW_COUNTER|PAKFIRE_PROGRESS_SHOW_ELAPSED_TIME); + PAKFIRE_PROGRESS_SHOW_COUNTER|PAKFIRE_PROGRESS_SHOW_ELAPSED_TIME, NULL); if (r) goto ERROR;