#include "xbt/log.h"
#include "xbt/str.h"
#include "xbt/ex.h" /* ex_backtrace_display */
+#include "mc/mc.h"
XBT_LOG_EXTERNAL_CATEGORY(simix);
XBT_LOG_EXTERNAL_CATEGORY(simix_action);
smx_global_t simix_global = NULL;
static xbt_heap_t simix_timers = NULL;
+static void* SIMIX_action_mallocator_new_f(void);
+static void SIMIX_action_mallocator_free_f(void* action);
+static void SIMIX_action_mallocator_reset_f(void* action);
+
/* FIXME: Yeah, I'll do it in a portable maner one day [Mt] */
#include <signal.h>
simix_global = xbt_new0(s_smx_global_t, 1);
simix_global->host = xbt_dict_new();
- simix_global->process_to_run =
- xbt_swag_new(xbt_swag_offset(proc, synchro_hookup));
+ simix_global->process_to_run = xbt_dynar_new(sizeof(void *), NULL);
simix_global->process_list =
xbt_swag_new(xbt_swag_offset(proc, process_hookup));
simix_global->process_to_destroy =
simix_global->create_process_function = NULL;
simix_global->kill_process_function = NULL;
simix_global->cleanup_process_function = SIMIX_process_cleanup;
-
-#ifdef HAVE_LATENCY_BOUND_TRACKING
- simix_global->latency_limited_dict = xbt_dict_new();
-#endif
+ simix_global->action_mallocator = xbt_mallocator_new(65536,
+ SIMIX_action_mallocator_new_f, SIMIX_action_mallocator_free_f,
+ SIMIX_action_mallocator_reset_f);
surf_init(argc, argv); /* Initialize SURF structures */
SIMIX_context_mod_init();
xbt_heap_free(simix_timers);
/* Free the remaining data structures */
- xbt_swag_free(simix_global->process_to_run);
+ xbt_dynar_free(&simix_global->process_to_run);
xbt_swag_free(simix_global->process_to_destroy);
xbt_swag_free(simix_global->process_list);
simix_global->process_list = NULL;
xbt_dict_free(&(simix_global->registered_functions));
xbt_dict_free(&(simix_global->host));
-#ifdef HAVE_LATENCY_BOUND_TRACKING
- xbt_dict_free(&(simix_global->latency_limited_dict));
-#endif
-
/* Let's free maestro now */
SIMIX_context_free(simix_global->maestro_process->context);
xbt_free(simix_global->maestro_process->running_ctx);
*/
XBT_INLINE double SIMIX_get_clock(void)
{
- return surf_get_clock();
+ if(MC_IS_ENABLED){
+ return MC_process_clock_get(SIMIX_process_self());
+ }else{
+ return surf_get_clock();
+ }
}
void SIMIX_run(void)
unsigned int iter;
do {
+ DEBUG1("New Schedule Round; size(queue)=%lu",
+ xbt_dynar_length(simix_global->process_to_run));
do {
- DEBUG0("New Schedule Round");
+ DEBUG1("New Sub-Schedule Round; size(queue)=%lu",
+ xbt_dynar_length(simix_global->process_to_run));
SIMIX_context_runall(simix_global->process_to_run);
while ((req = SIMIX_request_pop())) {
DEBUG1("Handling request %p", req);
- SIMIX_request_pre(req);
+ SIMIX_request_pre(req, 0);
}
- } while (xbt_swag_size(simix_global->process_to_run));
+ } while (xbt_dynar_length(simix_global->process_to_run));
time = surf_solve(SIMIX_timer_next());
}
}
}
+
+static void* SIMIX_action_mallocator_new_f(void) {
+ smx_action_t action = xbt_new(s_smx_action_t, 1);
+ action->request_list = xbt_fifo_new();
+ return action;
+}
+
+static void SIMIX_action_mallocator_free_f(void* action) {
+ xbt_fifo_free(((smx_action_t) action)->request_list);
+ xbt_free(action);
+}
+
+static void SIMIX_action_mallocator_reset_f(void* action) {
+
+ // we also recycle the request list
+ xbt_fifo_t fifo = ((smx_action_t) action)->request_list;
+ xbt_fifo_reset(fifo);
+ memset(action, 0, sizeof(s_smx_action_t));
+ ((smx_action_t) action)->request_list = fifo;
+}