X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6a9d0cb70ec8497d66b6e7f95f2a08b5a2cf8da9..825fb3d5095e6cce48885d1d04ab1ec3823dae6c:/src/simix/smx_process.c diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index aa1378ae3a..b47fe453aa 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -206,7 +206,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); @@ -219,6 +219,9 @@ void SIMIX_process_create(smx_process_t *process, XBT_DEBUG("Start context '%s'", (*process)->name); + /* Build the dynars for the on_exit functions */ + (*process)->on_exit_fun = xbt_dynar_new(sizeof(int_f_pvoid_t),NULL); + (*process)->on_exit_args = xbt_dynar_new(sizeof(void*),NULL); /* Now insert it in the global process list and in the process to run list */ xbt_swag_insert(*process, simix_global->process_list); XBT_DEBUG("Inserting %s(%s) in the to_run list", (*process)->name, host->name); @@ -286,13 +289,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 +326,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); @@ -582,7 +585,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: @@ -693,13 +696,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 */ @@ -711,3 +714,20 @@ xbt_dynar_t SIMIX_processes_as_dynar(void) { } return res; } +void SIMIX_process_on_exit(smx_process_t process) { + int length = xbt_dynar_length(process->on_exit_fun); + int cpt; + int_f_pvoid_t fun; + void *data; + for (cpt = 0; cpt < length; cpt++) { + fun = xbt_dynar_get_as(process->on_exit_fun,cpt,int_f_pvoid_t); + data = xbt_dynar_get_as(process->on_exit_args,cpt,void*); + (fun)(data); + } +} +void SIMIX_process_on_exit_add(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 ?"); + xbt_dynar_push_as(process->on_exit_fun,int_f_pvoid_t,fun); + xbt_dynar_push_as(process->on_exit_args,void*,data); +}