else {
*process = xbt_new0(s_smx_process_t, 1);
- xbt_assert0(((code != NULL) && (host != NULL)), "Invalid parameters");
+ xbt_assert(((code != NULL) && (host != NULL)), "Invalid parameters");
/* Process data */
(*process)->pid = simix_process_maxpid++;
}
}
+/**
+ * \brief Executes the processes from simix_global->process_to_run.
+ *
+ * The processes of simix_global->process_to_run are run (in parallel if
+ * possible). On exit, simix_global->process_to_run is empty, and
+ * simix_global->process_that_ran contains the list of processes that just ran.
+ * The two lists are swapped so, be careful when using them before and after a
+ * call to this function.
+ */
+void SIMIX_process_runall(void)
+{
+ SIMIX_context_runall(simix_global->process_to_run);
+ xbt_dynar_t tmp = simix_global->process_that_ran;
+ simix_global->process_that_ran = simix_global->process_to_run;
+ simix_global->process_to_run = tmp;
+ xbt_dynar_reset(simix_global->process_to_run);
+}
+
/**
* \brief Internal function to kill a SIMIX process.
*
}
void SIMIX_process_change_host(smx_process_t process,
- const char *source, const char *dest)
+ smx_host_t dest)
+{
+ xbt_assert((process != NULL), "Invalid parameters");
+ xbt_swag_remove(process, process->smx_host->process_list);
+ process->smx_host = dest;
+ xbt_swag_insert(process, dest->process_list);
+}
+
+void SIMIX_pre_process_change_host(smx_process_t process, smx_host_t dest)
{
- smx_host_t h1 = NULL;
- smx_host_t h2 = NULL;
- xbt_assert0((process != NULL), "Invalid parameters");
- h1 = SIMIX_host_get_by_name(source);
- h2 = SIMIX_host_get_by_name(dest);
- process->smx_host = h2;
- xbt_swag_remove(process, h1->process_list);
- xbt_swag_insert(process, h2->process_list);
+ process->new_host = dest;
}
void SIMIX_pre_process_suspend(smx_req_t req)
void SIMIX_process_resume(smx_process_t process, smx_process_t issuer)
{
- xbt_assert0((process != NULL), "Invalid parameters");
+ xbt_assert((process != NULL), "Invalid parameters");
process->suspended = 0;
/* check if the host is active */
if (surf_workstation_model->extension.
workstation.get_state(host->host) != SURF_RESOURCE_ON) {
- THROW1(host_error, 0, "Host %s failed, you cannot call this function",
+ THROWF(host_error, 0, "Host %s failed, you cannot call this function",
host->name);
}
self->doexception = 0;
RETHROW;
}
+
+ if (self->new_host) {
+ SIMIX_process_change_host(self, self->new_host);
+ self->new_host = NULL;
+ }
}
/* callback: context fetching */