aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/gnunet_time_lib.h16
-rw-r--r--src/util/time.c31
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.
*