diff options
-rw-r--r-- | src/include/gnunet_time_lib.h | 16 | ||||
-rw-r--r-- | src/util/time.c | 31 |
2 files changed, 47 insertions, 0 deletions
diff --git a/src/include/gnunet_time_lib.h b/src/include/gnunet_time_lib.h index b5da09cd83..e4b9dd9706 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 85d8d0cd6d..6b6be79170 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. * |