From: Matthias Wachs Date: Wed, 30 May 2012 14:47:45 +0000 (+0000) Subject: speedup mechanism to manipulate gnunet time X-Git-Tag: initial-import-from-subversion-38251~13349 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=8f654f30c3c4987c9ca1b564d6e6f2d75ae24862;p=oweals%2Fgnunet.git speedup mechanism to manipulate gnunet time --- diff --git a/src/util/Makefile.am b/src/util/Makefile.am index 9e670d950..ad918baef 100644 --- a/src/util/Makefile.am +++ b/src/util/Makefile.am @@ -99,7 +99,8 @@ libgnunetutil_la_SOURCES = \ service.c \ signal.c \ strings.c \ - time.c + time.c \ + speedup.c libgnunetutil_la_LIBADD = \ @@ -203,6 +204,7 @@ check_PROGRAMS = \ test_service \ test_strings \ test_time \ + test_speedup \ $(BENCHMARKS) \ test_os_start_process \ test_common_logging_runtime_loglevels @@ -444,6 +446,11 @@ test_time_SOURCES = \ test_time_LDADD = \ $(top_builddir)/src/util/libgnunetutil.la +test_speedup_SOURCES = \ + test_speedup.c +test_speedup_LDADD = \ + $(top_builddir)/src/util/libgnunetutil.la + perf_crypto_hash_SOURCES = \ perf_crypto_hash.c perf_crypto_hash_LDADD = \ @@ -455,4 +462,5 @@ EXTRA_DIST = \ test_program_data.conf \ test_pseudonym_data.conf \ test_resolver_api_data.conf \ - test_service_data.conf + test_service_data.conf \ + test_speedup_data.conf diff --git a/src/util/program.c b/src/util/program.c index b6d0c78c6..9e1a83d0b 100644 --- a/src/util/program.c +++ b/src/util/program.c @@ -72,6 +72,11 @@ struct CommandContext }; +int +GNUNET_SPEEDUP_start_ (const struct GNUNET_CONFIGURATION_Handle *cfg); + +int +GNUNET_SPEEDUP_stop_ (void); /** * Initial task called by the scheduler for each @@ -81,6 +86,7 @@ static void program_main (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { struct CommandContext *cc = cls; + GNUNET_SPEEDUP_start_(cc->cfg); GNUNET_RESOLVER_connect (cc->cfg); cc->task (cc->task_cls, cc->args, cc->cfgfile, cc->cfg); @@ -260,6 +266,7 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName, cc.task (cc.task_cls, cc.args, cc.cfgfile, cc.cfg); } /* clean up */ + GNUNET_SPEEDUP_stop_ (); GNUNET_CONFIGURATION_destroy (cfg); GNUNET_free_non_null (cc.cfgfile); GNUNET_free_non_null (loglev); diff --git a/src/util/service.c b/src/util/service.c index 92c125df1..6a6fb6cc9 100644 --- a/src/util/service.c +++ b/src/util/service.c @@ -78,6 +78,13 @@ struct IPv6NetworkSet }; +int +GNUNET_SPEEDUP_start_ (const struct GNUNET_CONFIGURATION_Handle *cfg); + +int +GNUNET_SPEEDUP_stop_ (void); + + /** * Parse a network specification. The argument specifies * a list of networks. The format is @@ -1771,7 +1778,7 @@ GNUNET_SERVICE_run (int argc, char *const *argv, const char *service_name, /* actually run service */ err = 0; GNUNET_SCHEDULER_run (&service_task, &sctx); - + GNUNET_SPEEDUP_start_ (cfg); /* shutdown */ if ((1 == do_daemonize) && (NULL != sctx.server)) pid_file_delete (&sctx); @@ -1785,6 +1792,7 @@ shutdown: GNUNET_break (0 == CLOSE (sctx.ready_confirm_fd)); } + GNUNET_SPEEDUP_stop_ (); GNUNET_CONFIGURATION_destroy (cfg); i = 0; if (NULL != sctx.addrs) diff --git a/src/util/speedup.c b/src/util/speedup.c new file mode 100644 index 000000000..6a17f3132 --- /dev/null +++ b/src/util/speedup.c @@ -0,0 +1,94 @@ +/* + This file is part of GNUnet. + (C) 2001, 2002, 2006, 2009 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 + option) any later version. + + GNUnet is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + 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. +*/ + +/** + * @file util/speedup.c + * @author Matthias Wachs + * @brief functions to speedup peer execution by manipulation system time + */ +#include "platform.h" +#include "gnunet_time_lib.h" +#include "gnunet_scheduler_lib.h" + +#define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__) + +static long long current_offset; +static struct GNUNET_TIME_Relative interval; +static struct GNUNET_TIME_Relative delta; + +static GNUNET_SCHEDULER_TaskIdentifier speedup_task; + +static void +do_speedup (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + speedup_task = GNUNET_SCHEDULER_NO_TASK; + + if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason)) + return; + + current_offset += delta.rel_value; + GNUNET_TIME_set_offset (current_offset); + + LOG (GNUNET_ERROR_TYPE_DEBUG, "Speed up execution time by %llu ms\n", delta.rel_value); + + speedup_task = GNUNET_SCHEDULER_add_delayed (interval, &do_speedup, NULL); +} + + +int +GNUNET_SPEEDUP_start_ (const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_time (cfg, "testing", "SPEEDUP_INTERVAL", &interval)) + return GNUNET_SYSERR; + if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_time (cfg, "testing", "SPEEDUP_DELTA", &delta)) + return GNUNET_SYSERR; + + if ((interval.rel_value == 0) || (delta.rel_value == 0)) + { + 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); + return GNUNET_OK; +} + +void +GNUNET_SPEEDUP_stop_ ( ) +{ + if (GNUNET_SCHEDULER_NO_TASK != speedup_task) + { + GNUNET_SCHEDULER_cancel (speedup_task); + speedup_task = GNUNET_SCHEDULER_NO_TASK; + + } + + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Stopped execution speed up\n"); +} + + + +/* end of speedup.c */ diff --git a/src/util/test_speedup.c b/src/util/test_speedup.c new file mode 100644 index 000000000..849505c24 --- /dev/null +++ b/src/util/test_speedup.c @@ -0,0 +1,101 @@ +/* + This file is part of GNUnet. + (C) 2001, 2002, 2003, 2004, 2006, 2009 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 3, or (at your + option) any later version. + + GNUnet is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + 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. +*/ +/** + * @file util/test_speedup.c + * @brief testcase for speedup.c + */ +#include "platform.h" +#include "gnunet_common.h" +#include "gnunet_program_lib.h" +#include "gnunet_time_lib.h" +#include "gnunet_strings_lib.h" + + +#define VERBOSE GNUNET_NO + +static struct GNUNET_TIME_Absolute start; +static struct GNUNET_TIME_Absolute end; +static int cycles; + +static void +run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + + cycles ++; + printf ("..%u", cycles); + fflush(stdout); + if (cycles <= 5) + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &run, NULL); + else + { + end = GNUNET_TIME_absolute_get(); + printf ("\n"); + fflush(stdout); + } +} + +void check (void *cls, char *const *args, + const char *cfgfile, + const struct GNUNET_CONFIGURATION_Handle * + cfg) +{ + printf ("0"); + fflush(stdout); + GNUNET_SCHEDULER_add_now(&run, NULL); +} + + +int +main (int argc, char *argv[]) +{ + time_t start_real; + time_t end_real; + struct GNUNET_TIME_Relative delta; + + static char *const argvn[] = { "test-speedup", + "-c", + "test_speedup_data.conf", +#if VERBOSE + "-L", "DEBUG", +#endif + NULL + }; + start_real = time (NULL); + start = GNUNET_TIME_absolute_get(); + static struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_OPTION_END + }; + + GNUNET_PROGRAM_run ((sizeof (argvn) / sizeof (char *)) - 1, argvn, "test-speedup", + "nohelp", options, &check, NULL); + + end_real = time (NULL); + delta = GNUNET_TIME_absolute_get_difference(start, end); + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Execution time in GNUnet time: %llu ms\n", delta.rel_value); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Execution time in system time: %llu ms\n", (end_real - start_real) * 1000); + + if (delta.rel_value > ((end_real - start_real) * 1500)) + return 0; + else + return 1; +} + +/* end of test_speedup.c */ diff --git a/src/util/test_speedup_data.conf b/src/util/test_speedup_data.conf new file mode 100644 index 000000000..262b2f01e --- /dev/null +++ b/src/util/test_speedup_data.conf @@ -0,0 +1,3 @@ +[testing] +SPEEDUP_INTERVAL = 1 ms +SPEEDUP_DELTA = 1 ms diff --git a/src/util/util.conf b/src/util/util.conf index ba9dfec70..f3d301e48 100644 --- a/src/util/util.conf +++ b/src/util/util.conf @@ -14,3 +14,5 @@ HOME = $SERVICEHOME [TESTING] WEAKRANDOM = NO +SPEEDUP_INTERVAL = 0 ms +SPEEDUP_DELTA = 0 ms