X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d33549c36f69381b71365cad0b4d450c6e4c815e..75b61335a13287f7a038935382966855d3a7098e:/src/simix/smx_process.c diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index 31d822a8c4..0020a7ac6d 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -118,6 +118,8 @@ void SIMIX_process_empty_trash(void) xbt_fifo_free(process->comms); + xbt_dynar_free(&process->on_exit); + free(process->name); free(process); } @@ -169,7 +171,7 @@ smx_process_t SIMIX_process_create_from_wrapper(smx_process_arg_t args) { * * This function actually creates the process. * It may be called when a SIMCALL_PROCESS_CREATE simcall occurs, - * or directly for SIMIX internal purposes. + * or directly for SIMIX internal purposes. The sure thing is that it's called from maestro context. * * \return the process created */ @@ -206,7 +208,7 @@ void SIMIX_process_create(smx_process_t *process, XBT_VERB("Create context %s", (*process)->name); (*process)->context = SIMIX_context_new(code, argc, argv, - simix_global->cleanup_process_function, *process); + simix_global->cleanup_process_function, *process); (*process)->running_ctx = xbt_new(xbt_running_ctx_t, 1); XBT_RUNNING_CTX_INITIALIZE((*process)->running_ctx); @@ -286,13 +288,13 @@ void SIMIX_process_kill(smx_process_t process) { break; case SIMIX_ACTION_SLEEP: - SIMIX_process_sleep_destroy(process->waiting_action); - break; + SIMIX_process_sleep_destroy(process->waiting_action); + break; case SIMIX_ACTION_SYNCHRO: - SIMIX_synchro_stop_waiting(process, &process->simcall); - SIMIX_synchro_destroy(process->waiting_action); - break; + SIMIX_synchro_stop_waiting(process, &process->simcall); + SIMIX_synchro_destroy(process->waiting_action); + break; case SIMIX_ACTION_IO: SIMIX_io_destroy(process->waiting_action); @@ -323,7 +325,7 @@ void SIMIX_process_killall(smx_process_t issuer) } void SIMIX_process_change_host(smx_process_t process, - smx_host_t dest) + smx_host_t dest) { xbt_assert((process != NULL), "Invalid parameters"); xbt_swag_remove(process, process->smx_host->process_list); @@ -408,8 +410,10 @@ void SIMIX_process_resume(smx_process_t process, smx_process_t issuer) XBT_IN("process = %p, issuer = %p", process, issuer); - if(process->context->iwannadie) + if(process->context->iwannadie) { + XBT_VERB("Ignoring request to suspend a process that is currently dying."); return; + } if(!process->suspended) return; process->suspended = 0; @@ -580,7 +584,7 @@ void SIMIX_post_process_sleep(smx_action_t action) switch(surf_workstation_model->action_state_get(action->sleep.surf_sleep)){ case SURF_ACTION_FAILED: - state = SIMIX_SRC_HOST_FAILURE; + SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed"); break; case SURF_ACTION_DONE: @@ -634,6 +638,11 @@ void SIMIX_process_yield(smx_process_t self) /* Ok, maestro returned control to us */ XBT_DEBUG("Control returned to me: '%s'", self->name); + if (self->new_host) { + SIMIX_process_change_host(self, self->new_host); + self->new_host = NULL; + } + if (self->context->iwannadie){ XBT_DEBUG("I wanna die!"); SIMIX_context_stop(self->context); @@ -650,11 +659,6 @@ void SIMIX_process_yield(smx_process_t self) self->doexception = 0; SMX_THROW(); } - - if (self->new_host) { - SIMIX_process_change_host(self, self->new_host); - self->new_host = NULL; - } } /* callback: context fetching */ @@ -691,13 +695,13 @@ xbt_dynar_t SIMIX_process_get_runnable(void) */ smx_process_t SIMIX_process_from_PID(int PID) { - smx_process_t proc; - xbt_swag_foreach(proc, simix_global->process_list) - { - if(proc->pid == PID) - return proc; - } - return NULL; + smx_process_t proc; + xbt_swag_foreach(proc, simix_global->process_list) + { + if(proc->pid == PID) + return proc; + } + return NULL; } /** @brief returns a dynar containg all currently existing processes */ @@ -709,3 +713,23 @@ xbt_dynar_t SIMIX_processes_as_dynar(void) { } return res; } +void SIMIX_process_on_exit_runall(smx_process_t process) { + s_smx_process_exit_fun_t exit_fun; + + while (!xbt_dynar_is_empty(process->on_exit)) { + exit_fun = xbt_dynar_pop_as(process->on_exit,s_smx_process_exit_fun_t); + (exit_fun.fun)(exit_fun.arg); + } +} +void SIMIX_process_on_exit(int_f_pvoid_t fun, void *data) { + smx_process_t process = SIMIX_process_self(); + xbt_assert(process, "current process not found: are you in maestro context ?"); + + if (!process->on_exit) { + process->on_exit = xbt_dynar_new(sizeof(s_smx_process_exit_fun_t), NULL); + } + + s_smx_process_exit_fun_t exit_fun = {fun, data}; + + xbt_dynar_push_as(process->on_exit,s_smx_process_exit_fun_t,exit_fun); +}