#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->create_process_function = NULL;
simix_global->kill_process_function = NULL;
simix_global->cleanup_process_function = SIMIX_process_cleanup;
+ 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();
surf_exit();
+ xbt_mallocator_free(simix_global->action_mallocator);
xbt_free(simix_global);
simix_global = NULL;
*/
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 {
- DEBUG1("New Schedule Round; size(queue)=%lu",
- xbt_dynar_length(simix_global->process_to_run));
+ 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_dynar_length(simix_global->process_to_run));
}
}
}
+
+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;
+}