*process = xbt_new0(s_smx_process_t, 1);
xbt_assert(((code != NULL) && (host != NULL)), "Invalid parameters");
-
/* Process data */
(*process)->pid = simix_process_maxpid++;
(*process)->name = xbt_strdup(name);
* or directly for SIMIX internal purposes.
*
* \param process poor victim
+ * \param issuer the process which has sent the PROCESS_KILL. Important to not schedule twice the same process.
*/
-void SIMIX_process_kill(smx_process_t process) {
+void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) {
XBT_DEBUG("Killing process %s on %s", process->name, process->smx_host->name);
case SIMIX_ACTION_COMMUNICATE:
xbt_fifo_remove(process->comms, process->waiting_action);
- SIMIX_comm_destroy(process->waiting_action);
+ SIMIX_comm_cancel(process->waiting_action);
break;
case SIMIX_ACTION_SLEEP:
case SIMIX_ACTION_IO:
SIMIX_io_destroy(process->waiting_action);
break;
+
+ /* **************************************/
+ /* TUTORIAL: New API */
+ case SIMIX_ACTION_NEW_API:
+ SIMIX_new_api_destroy(process->waiting_action);
+ break;
+ /* **************************************/
+
}
}
- if(!xbt_dynar_member(simix_global->process_to_run, &(process)))
+ if(!xbt_dynar_member(simix_global->process_to_run, &(process)) && process != issuer) {
xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, process);
+ }
+
}
/**
while ((p = xbt_swag_extract(simix_global->process_list))) {
if (p != issuer) {
- SIMIX_process_kill(p);
+ SIMIX_process_kill(p,issuer);
}
}
void SIMIX_pre_process_sleep(smx_simcall_t simcall)
{
- if (MC_IS_ENABLED) {
+ if (MC_is_active()) {
MC_process_clock_add(simcall->issuer, simcall->process_sleep.duration);
simcall->process_sleep.result = SIMIX_DONE;
SIMIX_simcall_answer(simcall);
self->doexception = 0;
SMX_THROW();
}
+
+ /* Ignore some local variables from xbt/ex.c for stacks comparison */
+ if(MC_is_active()){
+ MC_ignore_stack("ctx", "SIMIX_process_yield");
+ MC_ignore_stack("_throw_ctx", "SIMIX_process_yield");
+ MC_ignore_stack("_log_ev", "SIMIX_process_yield");
+ }
}
/* callback: context fetching */
void SIMIX_process_exception_terminate(xbt_ex_t * e)
{
xbt_ex_display(e);
- abort();
+ xbt_abort();
}
smx_context_t SIMIX_process_get_context(smx_process_t p) {
void SIMIX_process_auto_restart_set(smx_process_t process, int auto_restart) {
process->auto_restart = auto_restart;
}
+/**
+ * \brief Restart a process.
+ * Restart a process, starting it again from the beginning.
+ */
+smx_process_t SIMIX_process_restart(smx_process_t process, smx_process_t issuer) {
+ XBT_DEBUG("Restarting process %s on %s", process->name, process->smx_host->name);
+ //retrieve the arguments of the old process
+ //FIXME: Factorise this with SIMIX_host_add_auto_restart_process ?
+ s_smx_process_arg_t arg;
+ arg.code = process->code;
+ arg.hostname = process->smx_host->name;
+ arg.kill_time = process->kill_time;
+ arg.argc = process->argc;
+ arg.data = process->data;
+ int i;
+ arg.argv = xbt_new(char*,process->argc + 1);
+ for (i = 0; i < arg.argc; i++) {
+ arg.argv[i] = xbt_strdup(process->argv[i]);
+ }
+ arg.argv[process->argc] = NULL;
+ arg.properties = NULL;
+ arg.auto_restart = process->auto_restart;
+ //kill the old process
+ SIMIX_process_kill(process,issuer);
+ //start the new process
+ smx_process_t new_process;
+ if (simix_global->create_process_function) {
+ simix_global->create_process_function(&new_process,
+ arg.argv[0],
+ arg.code,
+ arg.data,
+ arg.hostname,
+ arg.kill_time,
+ arg.argc,
+ arg.argv,
+ arg.properties,
+ arg.auto_restart);
+ }
+ else {
+ simcall_process_create(&new_process,
+ arg.argv[0],
+ arg.code,
+ arg.data,
+ arg.hostname,
+ arg.kill_time,
+ arg.argc,
+ arg.argv,
+ arg.properties,
+ arg.auto_restart);
+
+ }
+ return new_process;
+}