/* sg_emul - Emulation support (simulation) */
-/* Copyright (c) 2003-5 Arnaud Legrand, Martin Quinson. All rights reserved.*/
+/* Copyright (c) 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
+ * All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_virtu_emul, gras_virtu,
"Emulation support");
/*** CPU burning */
-void gras_cpu_burn(double flops) {
- smx_action_t act;
- smx_cond_t cond;
- smx_mutex_t mutex;
-
- if (flops>0) {
- cond = SIMIX_cond_init();
- mutex = SIMIX_mutex_init();
-
- SIMIX_mutex_lock(mutex);
- act =
- SIMIX_action_execute(SIMIX_host_self(), "task", flops);
-
- SIMIX_register_action_to_condition(act, cond);
- SIMIX_cond_wait(cond, mutex);
- SIMIX_unregister_action_to_condition(act, cond);
-
- SIMIX_action_destroy(act);
- SIMIX_mutex_unlock(mutex);
+void gras_cpu_burn(double flops)
+{
+ smx_action_t execution;
- SIMIX_cond_destroy(cond);
- SIMIX_mutex_destroy(mutex);
+ if (flops > 0){
+ execution = simcall_host_execute("task", SIMIX_host_self(), flops, 1);
+ simcall_host_execution_wait(execution);
}
}
+
/*** Timing macros ***/
static xbt_os_timer_t timer;
static int benchmarking = 0;
void gras_emul_init(void)
{
if (!benchmark_set) {
- benchmark_set = xbt_dict_new();
+ benchmark_set = xbt_dict_new_homogeneous(xbt_free_f);
timer = xbt_os_timer_new();
}
}
void gras_emul_exit(void)
{
- if (locbuf)
- free(locbuf);
+ free(locbuf);
xbt_dict_free(&benchmark_set);
xbt_os_timer_free(timer);
}
ir = xbt_dict_get_or_null(dict, key);
if (!ir) {
ir = xbt_new0(double, 1);
- xbt_dict_set(dict, key, ir, xbt_free_f);
+ xbt_dict_set(dict, key, ir, NULL);
}
*ir = value;
}
int gras_bench_always_begin(const char *location, int line)
{
- xbt_assert0(!benchmarking, "Already benchmarking");
+ xbt_assert(!benchmarking, "Already benchmarking");
benchmarking = 1;
if (!timer)
return 0;
}
-int gras_bench_always_end(void) {
- xbt_assert0(benchmarking, "Not benchmarking yet");
+int gras_bench_always_end(void)
+{
+ xbt_assert(benchmarking, "Not benchmarking yet");
benchmarking = 0;
xbt_os_timer_stop(timer);
duration = xbt_os_timer_elapsed(timer);
- gras_cpu_burn(duration/reference);
+ gras_cpu_burn(duration / reference);
return 0;
}
int gras_bench_once_begin(const char *location, int line)
{
double *ir = NULL;
- xbt_assert0(!benchmarking, "Already benchmarking");
+ xbt_assert(!benchmarking, "Already benchmarking");
benchmarking = 1;
if (!locbuf || locbufsize < strlen(location) + 64) {
ir = xbt_dict_get_or_null(benchmark_set, locbuf);
if (!ir) {
- DEBUG1("%s", locbuf);
+ XBT_DEBUG("%s", locbuf);
duration = 1;
xbt_os_timer_start(timer);
return 1;
}
}
-int gras_bench_once_end(void) {
- xbt_assert0(benchmarking, "Not benchmarking yet");
+int gras_bench_once_end(void)
+{
+ xbt_assert(benchmarking, "Not benchmarking yet");
benchmarking = 0;
if (duration > 0) {
xbt_os_timer_stop(timer);
} else {
duration = get_from_dict(benchmark_set, locbuf);
}
- DEBUG2("Simulate the run of a task of %f sec for %s", duration, locbuf);
- gras_cpu_burn(duration/reference);
+ XBT_DEBUG("Simulate the run of a task of %f sec for %s", duration, locbuf);
+ gras_cpu_burn(duration / reference);
return 0;
}