From 61b1c378568bbf7ca7cb1a51d2f1920d5d36fd26 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 29 Aug 2009 20:26:36 +0000 Subject: [PATCH] eta --- src/include/gnunet_time_lib.h | 16 ++++++++++++++++ src/util/time.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/include/gnunet_time_lib.h b/src/include/gnunet_time_lib.h index b5da09cd8..e4b9dd970 100644 --- a/src/include/gnunet_time_lib.h +++ b/src/include/gnunet_time_lib.h @@ -163,6 +163,22 @@ struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_remaining (struct GNUNET_TIME_Absolute future); + +/** + * Calculate the estimate time of arrival/completion + * for an operation. + * + * @param start when did the operation start? + * @param finished how much has been done? + * @param total how much must be done overall (same unit as for "finished") + * @return remaining duration for the operation, + * assuming it continues at the same speed + */ +struct GNUNET_TIME_Relative GNUNET_TIME_calculate_eta (struct GNUNET_TIME_Absolute start, + uint64_t finished, + uint64_t total); + + /** * Compute the time difference between the given start and end times. * Use this function instead of actual subtraction to ensure that diff --git a/src/util/time.c b/src/util/time.c index 85d8d0cd6..6b6be7917 100644 --- a/src/util/time.c +++ b/src/util/time.c @@ -238,6 +238,37 @@ GNUNET_TIME_relative_multiply (struct GNUNET_TIME_Relative rel, return ret; } + +/** + * Calculate the estimate time of arrival/completion + * for an operation. + * + * @param start when did the operation start? + * @param finished how much has been done? + * @param total how much must be done overall (same unit as for "finished") + * @return remaining duration for the operation, + * assuming it continues at the same speed + */ +struct GNUNET_TIME_Relative GNUNET_TIME_calculate_eta (struct GNUNET_TIME_Absolute start, + uint64_t finished, + uint64_t total) +{ + struct GNUNET_TIME_Relative dur; + double exp; + struct GNUNET_TIME_Relative ret; + + GNUNET_break (finished > total); + if (finished >= total) + return GNUNET_TIME_UNIT_ZERO; + if (finished == 0) + return GNUNET_TIME_UNIT_FOREVER; + dur = GNUNET_TIME_absolute_get_duration (start); + exp = ((double)dur.value) * ((double) total) / ((double)finished); + ret.value = ((uint64_t) exp) - dur.value; + return ret; +} + + /** * Add relative times together. * -- 2.25.1