-do not leave PPT timeout tasks behind
[oweals/gnunet.git] / src / transport / gnunet-transport-profiler.c
index 8c41ea2b53a0b601e5e8a05c06d28c3e9f91bc3f..af52a7377f3a92b6cb206d7b6c7877efd5c9355d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  This file is part of GNUnet.
- (C) 2011-2014 Christian Grothoff (and other contributing authors)
Copyright (C) 2011-2014 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
@@ -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
- 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.
  */
 
 /**
@@ -41,6 +41,9 @@ struct Iteration
 
   struct GNUNET_TIME_Relative dur;
 
+  /* Transmission rate for this iteration in KB/s */
+  float rate;
+
   unsigned int msgs_sent;
 };
 
@@ -139,7 +142,7 @@ static struct GNUNET_PeerIdentity pid;
 /**
  * Task scheduled for cleanup / termination of the process.
  */
-static GNUNET_SCHEDULER_TaskIdentifier end;
+static struct GNUNET_SCHEDULER_Task * end;
 
 /**
  * Selected level of verbosity.
@@ -160,6 +163,13 @@ shutdown_task (void *cls,
   struct Iteration *icur;
   struct Iteration *inext;
 
+  unsigned int iterations;
+
+  unsigned long long avg_duration;
+  float avg_rate;
+  float stddev_rate;
+  float stddev_duration;
+
   if (NULL != tc_handle)
   {
     GNUNET_TRANSPORT_try_connect_cancel (tc_handle);
@@ -183,27 +193,75 @@ shutdown_task (void *cls,
     handle = NULL;
   }
 
+  if (verbosity > 0)
+    FPRINTF (stdout, "\n");
+
+  /* Output format:
+   * All time values in ms
+   * Rate in KB/s
+   * #messages;#messagesize;#avg_dur;#avg_rate;#duration_i0;#duration_i0;... */
+
   if (benchmark_send)
   {
+    /* First iteration to calculcate avg and stddev */
+    iterations = 0;
+    avg_duration = 0;
+    avg_rate = 0.0;
+
     inext = ihead;
     while (NULL != (icur = inext))
     {
       inext = icur->next;
+      icur->rate = ((benchmark_count * benchmark_size) / 1024) /
+          ((float) icur->dur.rel_value_us / (1000 * 1000));
       if (verbosity > 0)
         FPRINTF (stdout, _("%llu B in %llu ms == %.2f KB/s!\n"),
             ((long long unsigned int) benchmark_count * benchmark_size),
-            ((long long unsigned int) itail->dur.rel_value_us / 1000),
-            (float) ((benchmark_count * benchmark_size) / 1024)/ ((float) itail->dur.rel_value_us / (1000 * 1000)));
+            ((long long unsigned int) icur->dur.rel_value_us / 1000),
+            (float) icur->rate);
+
+      avg_duration += icur->dur.rel_value_us / (1000);
+      avg_rate  += icur->rate;
+      iterations ++;
     }
-    FPRINTF (stdout, _("%u;%u"),benchmark_count, benchmark_size);
+
+    /* Calculate average rate */
+    avg_rate /= iterations;
+    /* Calculate average duration */
+    avg_duration /= iterations;
+
+    stddev_rate = 0;
+    stddev_duration = 0;
+    inext = ihead;
+    while (NULL != (icur = inext))
+    {
+      inext = icur->next;
+      stddev_rate += ((icur->rate-avg_rate) *
+          (icur->rate-avg_rate));
+      stddev_duration += (((icur->dur.rel_value_us / 1000) - avg_duration) *
+          ((icur->dur.rel_value_us / 1000) - avg_duration));
+
+    }
+    /* Calculate standard deviation rate */
+    stddev_rate = stddev_rate / iterations;
+    stddev_rate = sqrtf(stddev_rate);
+
+    /* Calculate standard deviation duration */
+    stddev_duration = stddev_duration / iterations;
+    stddev_duration = sqrtf(stddev_duration);
+
+    /* Output */
+    FPRINTF (stdout, _("%u;%u;%llu;%llu;%.2f;%.2f"),benchmark_count, benchmark_size,
+        avg_duration, (unsigned long long) stddev_duration, avg_rate, stddev_rate);
+
     inext = ihead;
     while (NULL != (icur = inext))
     {
       inext = icur->next;
       GNUNET_CONTAINER_DLL_remove (ihead, itail, icur);
 
-      FPRINTF (stdout, _(";%llu"),
-      (long long unsigned int) icur->dur.rel_value_us);
+      FPRINTF (stdout, _(";%llu;%.2f"),
+          (long long unsigned int) (icur->dur.rel_value_us / 1000), icur->rate);
 
       GNUNET_free (icur);
     }
@@ -312,7 +370,7 @@ iteration_done ()
   if (it_count == benchmark_iterations)
   {
     benchmark_running = GNUNET_NO;
-    if (GNUNET_SCHEDULER_NO_TASK != end)
+    if (NULL != end)
       GNUNET_SCHEDULER_cancel (end);
     end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL);
     return;
@@ -432,7 +490,7 @@ try_connect_cb (void *cls,
     FPRINTF (stderr,
              "%s",
              _("Failed to send connect request to transport service\n"));
-    if (GNUNET_SCHEDULER_NO_TASK != end)
+    if (NULL != end)
       GNUNET_SCHEDULER_cancel (end);
     end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL);
     ret = 1;