Fixed one serious bug, working on another. Still very broken.
[oweals/gnunet.git] / src / util / speedup.c
index 0a005c035c6ca9adb7e0f728f37f2ff2a377b93f..e7a06a1022e9d01428d8ee9724ccf6ce4bb7afda 100644 (file)
@@ -1,10 +1,10 @@
 /*
      This file is part of GNUnet.
 /*
      This file is part of GNUnet.
-     (C) 2001, 2002, 2006, 2009 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2011-2013 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
@@ -14,8 +14,8 @@
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
 */
 
 /**
@@ -24,8 +24,8 @@
  * @brief functions to speedup peer execution by manipulation system time
  */
 #include "platform.h"
  * @brief functions to speedup peer execution by manipulation system time
  */
 #include "platform.h"
-#include "gnunet_time_lib.h"
-#include "gnunet_scheduler_lib.h"
+#include "gnunet_util_lib.h"
+#include "speedup.h"
 
 #define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
 
 
 #define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
 
@@ -34,57 +34,78 @@ static struct GNUNET_TIME_Relative interval;
 
 static struct GNUNET_TIME_Relative delta;
 
 
 static struct GNUNET_TIME_Relative delta;
 
-static GNUNET_SCHEDULER_TaskIdentifier speedup_task;
+static struct GNUNET_SCHEDULER_Task * speedup_task;
 
 
 static void
 
 
 static void
-do_speedup (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+do_speedup (void *cls,
+            const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   static long long current_offset;
 {
   static long long current_offset;
-  speedup_task = GNUNET_SCHEDULER_NO_TASK;
+
+  speedup_task = NULL;
   if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
     return;
   if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
     return;
-  current_offset += delta.rel_value;
+  current_offset += delta.rel_value_us;
   GNUNET_TIME_set_offset (current_offset);
   GNUNET_TIME_set_offset (current_offset);
-  LOG (GNUNET_ERROR_TYPE_DEBUG, 
-       "Speeding up execution time by %llu ms\n", delta.rel_value);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Speeding up execution time by %s\n",
+       GNUNET_STRINGS_relative_time_to_string (delta, GNUNET_NO));
   speedup_task = GNUNET_SCHEDULER_add_delayed (interval, &do_speedup, NULL);
 }
 
 
   speedup_task = GNUNET_SCHEDULER_add_delayed (interval, &do_speedup, NULL);
 }
 
 
+/**
+ * Start task that may speed up our system clock artificially
+ *
+ * @param cfg configuration to use
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR if the speedup was not configured
+ */
 int
 GNUNET_SPEEDUP_start_ (const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
 int
 GNUNET_SPEEDUP_start_ (const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
-  if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_time (cfg, "testing", "SPEEDUP_INTERVAL", &interval))
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_time (cfg, "testing",
+                                           "SPEEDUP_INTERVAL", &interval))
     return GNUNET_SYSERR;
     return GNUNET_SYSERR;
-  if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_time (cfg, "testing", "SPEEDUP_DELTA", &delta))
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_time (cfg, "testing",
+                                           "SPEEDUP_DELTA", &delta))
     return GNUNET_SYSERR;
 
     return GNUNET_SYSERR;
 
-  if ((0 == interval.rel_value) || (0 == delta.rel_value))
+  if ((0 == interval.rel_value_us) || (0 == delta.rel_value_us))
   {
     LOG (GNUNET_ERROR_TYPE_DEBUG,
         "Speed up disabled\n");
     return GNUNET_OK;
   }
   LOG (GNUNET_ERROR_TYPE_DEBUG,
   {
     LOG (GNUNET_ERROR_TYPE_DEBUG,
         "Speed up disabled\n");
     return GNUNET_OK;
   }
   LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Speed up execution time %llu ms every %llu ms\n",
-       delta.rel_value, interval.rel_value);
-  speedup_task = GNUNET_SCHEDULER_add_now_with_lifeness (GNUNET_NO, &do_speedup, NULL);
+       "Speed up execution by %s\n",
+       GNUNET_STRINGS_relative_time_to_string (delta, GNUNET_NO));
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Speed up executed every %s\n",
+       GNUNET_STRINGS_relative_time_to_string (interval, GNUNET_NO));
+  speedup_task = GNUNET_SCHEDULER_add_now_with_lifeness (GNUNET_NO,
+                                                         &do_speedup, NULL);
   return GNUNET_OK;
 }
 
 
   return GNUNET_OK;
 }
 
 
+/**
+ * Stop tasks that modify clock behavior.
+ */
 void
 void
-GNUNET_SPEEDUP_stop_ ( )
+GNUNET_SPEEDUP_stop_ ()
 {
 {
-  if (GNUNET_SCHEDULER_NO_TASK != speedup_task)
+  if (NULL != speedup_task)
   {
     GNUNET_SCHEDULER_cancel (speedup_task);
   {
     GNUNET_SCHEDULER_cancel (speedup_task);
-    speedup_task = GNUNET_SCHEDULER_NO_TASK;
+    speedup_task = NULL;
   }
   }
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Stopped execution speed up\n");
+  if ( (0 != interval.rel_value_us) &&
+       (0 != delta.rel_value_us) )
+    LOG (GNUNET_ERROR_TYPE_DEBUG,
+        "Stopped execution speed up\n");
 }
 
 
 }