MinGW
[oweals/gnunet.git] / src / util / time.c
index c8f40884190b6a885d95e03a71709fcf14eaeecb..ce2f9517f7ba362d8d6641b689574ef0cdf0dfd0 100644 (file)
@@ -40,7 +40,9 @@ GNUNET_TIME_absolute_get ()
   struct timeval tv;
 
   GETTIMEOFDAY (&tv, NULL);
-  ret.value = tv.tv_sec * 1000 + tv.tv_usec / 1000;
+  ret.value =
+    (uint64_t) (((uint64_t) tv.tv_sec * 1000LL) +
+                ((uint64_t) tv.tv_usec / 1000LL));
   return ret;
 }
 
@@ -55,6 +57,17 @@ GNUNET_TIME_relative_get_zero ()
   return zero;
 }
 
+
+/**
+ * Return absolute time of 0ms.
+ */
+struct GNUNET_TIME_Absolute
+GNUNET_TIME_absolute_get_zero ()
+{
+  static struct GNUNET_TIME_Absolute zero;
+  return zero;
+}
+
 /**
  * Return relative time of 1ms.
  */
@@ -107,6 +120,72 @@ GNUNET_TIME_relative_to_absolute (struct GNUNET_TIME_Relative rel)
   return ret;
 }
 
+
+/**
+ * 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)
+{
+  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?
@@ -203,7 +282,7 @@ GNUNET_TIME_relative_multiply (struct GNUNET_TIME_Relative rel,
   struct GNUNET_TIME_Relative ret;
   if (factor == 0)
     return GNUNET_TIME_relative_get_zero ();
-  ret.value = rel.value * factor;
+  ret.value = rel.value * (unsigned long long) factor;
   if (ret.value / factor != rel.value)
     {
       GNUNET_break (0);
@@ -212,6 +291,57 @@ GNUNET_TIME_relative_multiply (struct GNUNET_TIME_Relative rel,
   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.
  *
@@ -242,7 +372,7 @@ struct GNUNET_TIME_RelativeNBO
 GNUNET_TIME_relative_hton (struct GNUNET_TIME_Relative a)
 {
   struct GNUNET_TIME_RelativeNBO ret;
-  ret.value = GNUNET_htonll (a.value);
+  ret.value__ = GNUNET_htonll (a.value);
   return ret;
 }
 
@@ -253,7 +383,7 @@ struct GNUNET_TIME_Relative
 GNUNET_TIME_relative_ntoh (struct GNUNET_TIME_RelativeNBO a)
 {
   struct GNUNET_TIME_Relative ret;
-  ret.value = GNUNET_ntohll (a.value);
+  ret.value = GNUNET_ntohll (a.value__);
   return ret;
 
 }
@@ -265,7 +395,7 @@ struct GNUNET_TIME_AbsoluteNBO
 GNUNET_TIME_absolute_hton (struct GNUNET_TIME_Absolute a)
 {
   struct GNUNET_TIME_AbsoluteNBO ret;
-  ret.value = GNUNET_htonll (a.value);
+  ret.value__ = GNUNET_htonll (a.value);
   return ret;
 }
 
@@ -276,7 +406,7 @@ struct GNUNET_TIME_Absolute
 GNUNET_TIME_absolute_ntoh (struct GNUNET_TIME_AbsoluteNBO a)
 {
   struct GNUNET_TIME_Absolute ret;
-  ret.value = GNUNET_ntohll (a.value);
+  ret.value = GNUNET_ntohll (a.value__);
   return ret;
 
 }