+ process->suspended = 0;
+
+ /* If we are resuming another process, resume the action it was waiting for
+ if any. Otherwise add it to the list of process to run in the next round. */
+ if (process != issuer) {
+
+ if (process->waiting_action) {
+
+ switch (process->waiting_action->type) {
+
+ case SIMIX_ACTION_EXECUTE:
+ case SIMIX_ACTION_PARALLEL_EXECUTE:
+ SIMIX_host_execution_resume(process->waiting_action);
+ break;
+
+ case SIMIX_ACTION_COMMUNICATE:
+ SIMIX_comm_resume(process->waiting_action);
+ break;
+
+ case SIMIX_ACTION_SLEEP:
+ SIMIX_process_sleep_resume(process->waiting_action);
+ break;
+
+ default:
+ THROW_IMPOSSIBLE;
+ }
+ }
+ else {
+ xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, process);
+ }
+ }
+}
+
+int SIMIX_process_get_maxpid(void) {
+ return simix_process_maxpid;
+}
+int SIMIX_process_count(void)
+{
+ return xbt_swag_size(simix_global->process_list);
+}
+
+void* SIMIX_process_self_get_data(void)
+{
+ smx_process_t me = SIMIX_process_self();
+ if (!me) {
+ return NULL;
+ }
+ return SIMIX_process_get_data(me);
+}
+
+void SIMIX_process_self_set_data(void *data)
+{
+ SIMIX_process_set_data(SIMIX_process_self(), data);
+}
+
+void* SIMIX_process_get_data(smx_process_t process)
+{
+ return process->data;
+}
+
+void SIMIX_process_set_data(smx_process_t process, void *data)
+{