/*
This file is part of GNUnet.
- (C) 2001, 2002, 2003, 2004, 2006 Christian Grothoff (and other contributing authors)
+ (C) 2001-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
- 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
/**
* @file util/test_scheduler_delay.c
* @brief testcase for delay of scheduler, measures how
- * precise the timers are. Expect values between 10 and 20 ms on
+ * precise the timers are. Expect values between 0.2 and 2 ms on
* modern machines.
*/
#include "platform.h"
-#include "gnunet_common.h"
-#include "gnunet_scheduler_lib.h"
-#include "gnunet_time_lib.h"
-
-#define VERBOSE GNUNET_NO
+#include "gnunet_util_lib.h"
static struct GNUNET_TIME_Absolute target;
#define INCR 47
-#define MAXV 1500
+#define MAXV 5000
+
/**
* Signature of the main function of a task.
* @param tc context
*/
static void
-test_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+test_task (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext *tc)
{
struct GNUNET_TIME_Absolute now;
now = GNUNET_TIME_absolute_get ();
- if (now.value > target.value)
- cumDelta += (now.value - target.value);
+ if (now.abs_value_us > target.abs_value_us)
+ cumDelta += (now.abs_value_us - target.abs_value_us);
else
- cumDelta += (target.value - now.value);
+ cumDelta += (target.abs_value_us - now.abs_value_us);
target =
- GNUNET_TIME_relative_to_absolute (GNUNET_TIME_relative_multiply
- (GNUNET_TIME_UNIT_MILLISECONDS, i));
- fprintf (stderr, ".");
+ GNUNET_TIME_relative_to_absolute (GNUNET_TIME_relative_multiply
+ (GNUNET_TIME_UNIT_MICROSECONDS, i));
+ FPRINTF (stderr, "%s", ".");
if (i > MAXV)
- {
- fprintf (stderr, "\n");
- return;
- }
- GNUNET_SCHEDULER_add_delayed (tc->sched,
- GNUNET_NO,
- GNUNET_SCHEDULER_PRIORITY_DEFAULT,
- GNUNET_SCHEDULER_NO_PREREQUISITE_TASK,
- GNUNET_TIME_relative_multiply
- (GNUNET_TIME_UNIT_MILLISECONDS, i),
- &test_task, NULL);
+ {
+ FPRINTF (stderr, "%s", "\n");
+ return;
+ }
+ GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
+ (GNUNET_TIME_UNIT_MICROSECONDS, i), &test_task,
+ NULL);
i += INCR;
}
-static int
-check ()
+
+int
+main (int argc, char *argv[])
{
+ GNUNET_log_setup ("test-scheduler-delay", "WARNING", NULL);
target = GNUNET_TIME_absolute_get ();
GNUNET_SCHEDULER_run (&test_task, NULL);
FPRINTF (stdout,
- "Sleep precision: %llu ms. ", cumDelta / 1000 / (MAXV / INCR));
- if (cumDelta <= 10 * MAXV / INCR)
- fprintf (stdout, "Timer precision is excellent.\n");
- else if (cumDelta <= 50 * MAXV / INCR) /* 50 ms average deviation */
- fprintf (stdout, "Timer precision is good.\n");
- else if (cumDelta > 250 * MAXV / INCR)
- fprintf (stdout, "Timer precision is awful.\n");
+ "Sleep precision: %llu microseconds (average delta). ",
+ cumDelta / (MAXV / INCR));
+ if (cumDelta <= 500 * MAXV / INCR)
+ FPRINTF (stdout, "%s", "Timer precision is excellent.\n");
+ else if (cumDelta <= 5000 * MAXV / INCR) /* 5 ms average deviation */
+ FPRINTF (stdout, "%s", "Timer precision is good.\n");
+ else if (cumDelta > 25000 * MAXV / INCR)
+ FPRINTF (stdout, "%s", "Timer precision is awful.\n");
else
- fprintf (stdout, "Timer precision is acceptable.\n");
+ FPRINTF (stdout, "%s", "Timer precision is acceptable.\n");
return 0;
}
-int
-main (int argc, char *argv[])
-{
- int ret;
-
- GNUNET_log_setup ("test-scheduler-delay", "WARNING", NULL);
- ret = check ();
-
- return ret;
-}
-
/* end of test_scheduler_delay.c */