3 /* sg_emul - Emulation support (simulation) */
5 /* Copyright (c) 2003-5 Arnaud Legrand, Martin Quinson. All rights reserved.*/
7 /* This program is free software; you can redistribute it and/or modify it
8 * under the terms of the license (GNU LGPL) which comes with this package. */
10 #include "gras/emul.h"
11 #include "gras/Virtu/virtu_sg.h"
12 #include "gras_modinter.h"
14 #include "xbt/xbt_portability.h" /* timers */
18 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(emul,gras,"Emulation support");
20 /*** Timing macros ***/
21 static xbt_os_timer_t timer;
22 static int benchmarking = 0;
23 static xbt_dict_t benchmark_set = NULL;
24 static double reference = .00523066250047108838; /* FIXME: we should benchmark host machine to set this */
25 static double duration = 0.0;
27 static char* locbuf = NULL;
28 static int locbufsize;
30 void gras_emul_init(void)
33 benchmark_set = xbt_dict_new();
34 timer = xbt_os_timer_new();
38 void gras_emul_exit(void) {
39 if (locbuf) free(locbuf);
40 xbt_dict_free(&benchmark_set);
41 xbt_os_timer_free(timer);
45 static void store_in_dict(xbt_dict_t dict, const char *key, double value)
51 ir = xbt_dict_get(dict, key);
53 if (e.category == mismatch_error) {
61 ir = xbt_new0(double,1);
62 xbt_dict_set(dict, key, ir, free);
67 static double get_from_dict(xbt_dict_t dict, const char *key) {
68 double *ir = xbt_dict_get(dict, key);
73 int gras_bench_always_begin(const char *location,int line)
75 xbt_assert0(!benchmarking,"Already benchmarking");
79 xbt_os_timer_start(timer);
83 int gras_bench_always_end(void)
87 xbt_assert0(benchmarking,"Not benchmarking yet");
89 xbt_os_timer_stop(timer);
90 duration = xbt_os_timer_elapsed(timer);
91 task = MSG_task_create("task", (duration)/reference, 0 , NULL);
92 MSG_task_execute(task);
93 MSG_task_destroy(task);
97 int gras_bench_once_begin(const char *location,int line) {
100 xbt_assert0(!benchmarking,"Already benchmarking");
103 if (!locbuf || locbufsize < strlen(location) + 64) {
104 locbufsize = strlen(location) + 64;
105 locbuf = xbt_realloc(locbuf,locbufsize);
107 sprintf(locbuf,"%s:%d",location, line);
110 ir = xbt_dict_get(benchmark_set, locbuf);
112 if (e.category == mismatch_error) {
122 xbt_os_timer_start(timer);
130 int gras_bench_once_end(void)
132 m_task_t task = NULL;
134 xbt_assert0(benchmarking,"Not benchmarking yet");
137 xbt_os_timer_stop(timer);
138 duration = xbt_os_timer_elapsed(timer);
139 store_in_dict(benchmark_set, locbuf, duration);
141 duration = get_from_dict(benchmark_set,locbuf);
143 DEBUG2("Simulate the run of a task of %f sec for %s",duration,locbuf);
144 task = MSG_task_create("task", (duration)/reference, 0 , NULL);
145 MSG_task_execute(task);
146 MSG_task_destroy(task);
151 /*** Conditional execution support ***/
153 int gras_if_RL(void) {
157 int gras_if_SG(void) {