+
+
+void SIMIX_display_process_status(void)
+{
+ if (simix_global->process_list == NULL) {
+ return;
+ }
+
+ smx_process_t process = NULL;
+ int nbprocess = xbt_swag_size(simix_global->process_list);
+
+ XBT_INFO("%d processes are still running, waiting for something.", nbprocess);
+ /* List the process and their state */
+ XBT_INFO
+ ("Legend of the following listing: \"<process>(<pid>) on <host>: <status>.\"");
+ xbt_swag_foreach(process, simix_global->process_list) {
+
+ if (process->waiting_action) {
+
+ const char* action_description = "unknown";
+ switch (process->waiting_action->type) {
+
+ case SIMIX_ACTION_EXECUTE:
+ action_description = "execution";
+ break;
+
+ case SIMIX_ACTION_PARALLEL_EXECUTE:
+ action_description = "parallel execution";
+ break;
+
+ case SIMIX_ACTION_COMMUNICATE:
+ action_description = "communication";
+ break;
+
+ case SIMIX_ACTION_SLEEP:
+ action_description = "sleeping";
+ break;
+
+ case SIMIX_ACTION_SYNCHRO:
+ action_description = "synchronization";
+ break;
+
+ case SIMIX_ACTION_IO:
+ action_description = "I/O";
+ break;
+ }
+ XBT_INFO("Process %ld (%s@%s): waiting for %s action %p (%s) in state %d to finish",
+ process->pid, process->name, process->smx_host->name,
+ action_description, process->waiting_action,
+ process->waiting_action->name, process->waiting_action->state);
+ }
+ else {
+ XBT_INFO("Process %ld (%s@%s)", process->pid, process->name, process->smx_host->name);
+ }
+ }
+}
+
+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;
+}