MinGW
[oweals/gnunet.git] / src / util / time.c
index 85d8d0cd6d989eb4768be2d65c0ad91065ad7590..ce2f9517f7ba362d8d6641b689574ef0cdf0dfd0 100644 (file)
@@ -40,7 +40,9 @@ GNUNET_TIME_absolute_get ()
   struct timeval tv;
 
   GETTIMEOFDAY (&tv, NULL);
-  ret.value = (uint64_t) (((uint64_t) tv.tv_sec * 1000LL) + ((uint64_t) tv.tv_usec / 1000LL));
+  ret.value =
+    (uint64_t) (((uint64_t) tv.tv_sec * 1000LL) +
+                ((uint64_t) tv.tv_usec / 1000LL));
   return ret;
 }
 
@@ -106,7 +108,7 @@ struct GNUNET_TIME_Absolute
 GNUNET_TIME_relative_to_absolute (struct GNUNET_TIME_Relative rel)
 {
   struct GNUNET_TIME_Absolute ret;
-  if (rel.value == (uint64_t) -1LL)
+  if (rel.value == (uint64_t) - 1LL)
     return GNUNET_TIME_absolute_get_forever ();
   struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get ();
   if (rel.value + now.value < rel.value)
@@ -122,17 +124,68 @@ GNUNET_TIME_relative_to_absolute (struct GNUNET_TIME_Relative rel)
 /**
  * Return the minimum of two relative time values.
  *
+ * @param t1 first timestamp
+ * @param t2 other timestamp
  * @return timestamp that is smaller
  */
-struct GNUNET_TIME_Relative GNUNET_TIME_relative_min (struct
-                                                     GNUNET_TIME_Relative
-                                                     t1,
-                                                     struct
-                                                     GNUNET_TIME_Relative t2)
+struct GNUNET_TIME_Relative
+GNUNET_TIME_relative_min (struct
+                          GNUNET_TIME_Relative
+                          t1, struct GNUNET_TIME_Relative t2)
 {
   return (t1.value < t2.value) ? t1 : t2;
 }
 
+
+/**
+ * Return the maximum of two relative time values.
+ *
+ * @param t1 first timestamp
+ * @param t2 other timestamp
+ * @return timestamp that is larger
+ */
+struct GNUNET_TIME_Relative
+GNUNET_TIME_relative_max (struct
+                          GNUNET_TIME_Relative
+                          t1, struct GNUNET_TIME_Relative t2)
+{
+  return (t1.value > t2.value) ? t1 : t2;
+}
+
+
+
+/**
+ * Return the minimum of two relative time values.
+ *
+ * @param t1 first timestamp
+ * @param t2 other timestamp
+ * @return timestamp that is smaller
+ */
+struct GNUNET_TIME_Absolute
+GNUNET_TIME_absolute_min (struct
+                          GNUNET_TIME_Absolute
+                          t1, struct GNUNET_TIME_Absolute t2)
+{
+  return (t1.value < t2.value) ? t1 : t2;
+}
+
+
+/**
+ * Return the maximum of two relative time values.
+ *
+ * @param t1 first timestamp
+ * @param t2 other timestamp
+ * @return timestamp that is smaller
+ */
+struct GNUNET_TIME_Absolute
+GNUNET_TIME_absolute_max (struct
+                          GNUNET_TIME_Absolute
+                          t1, struct GNUNET_TIME_Absolute t2)
+{
+  return (t1.value > t2.value) ? t1 : t2;
+}
+
+
 /**
  * Given a timestamp in the future, how much time
  * remains until then?
@@ -234,10 +287,61 @@ GNUNET_TIME_relative_multiply (struct GNUNET_TIME_Relative rel,
     {
       GNUNET_break (0);
       return GNUNET_TIME_relative_get_forever ();
-    }  
+    }
   return ret;
 }
 
+
+/**
+ * Divide relative time by a given factor.
+ *
+ * @param rel some duration
+ * @param factor integer to divide by
+ * @return FOREVER if rel=FOREVER or factor==0; otherwise rel/factor
+ */
+struct GNUNET_TIME_Relative
+GNUNET_TIME_relative_divide (struct GNUNET_TIME_Relative rel,
+                            unsigned int factor)
+{
+  struct GNUNET_TIME_Relative ret;
+  if ( (factor == 0) ||
+       (rel.value == GNUNET_TIME_UNIT_FOREVER_REL.value) )
+    return GNUNET_TIME_UNIT_FOREVER_REL;
+  ret.value = rel.value / (unsigned long long) factor;
+  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_REL;
+  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.
  *