X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c5ad8ca1a68bbaa9152471c8d0eeb99d762f0d86..7e9b6e88f6c2daa87a9f5370596e5acc7f73fc6a:/src/simix/smx_host.c diff --git a/src/simix/smx_host.c b/src/simix/smx_host.c index e87041bc51..815d947a5d 100644 --- a/src/simix/smx_host.c +++ b/src/simix/smx_host.c @@ -90,7 +90,7 @@ xbt_dict_t SIMIX_host_get_dict(void) void **host = NULL; xbt_lib_foreach(host_lib, cursor, name, host){ - if(host[SIMIX_HOST_LEVEL]) + if(host[SIMIX_HOST_LEVEL]) xbt_dict_set(host_dict,name,host[SIMIX_HOST_LEVEL], NULL); } return host_dict; @@ -204,7 +204,7 @@ smx_action_t SIMIX_host_execute(const char *name, smx_host_t host, if (!MC_IS_ENABLED) { action->execution.surf_exec = surf_workstation_model->extension.workstation.execute(host->host, - computation_amount); + computation_amount); surf_workstation_model->action_data_set(action->execution.surf_exec, action); surf_workstation_model->set_priority(action->execution.surf_exec, priority); } @@ -243,7 +243,7 @@ smx_action_t SIMIX_host_parallel_execute( const char *name, action->execution.surf_exec = surf_workstation_model->extension.workstation. execute_parallel_task(host_nb, workstation_list, computation_amount, - communication_amount, amount, rate); + communication_amount, rate); surf_workstation_model->action_data_set(action->execution.surf_exec, action); } @@ -254,16 +254,19 @@ smx_action_t SIMIX_host_parallel_execute( const char *name, void SIMIX_host_execution_destroy(smx_action_t action) { + int destroyed=0; XBT_DEBUG("Destroy action %p", action); - xbt_free(action->name); if (action->execution.surf_exec) { - surf_workstation_model->action_unref(action->execution.surf_exec); + destroyed = surf_workstation_model->action_unref(action->execution.surf_exec); action->execution.surf_exec = NULL; } - xbt_mallocator_release(simix_global->action_mallocator, action); + if (destroyed) { + xbt_free(action->name); + xbt_mallocator_release(simix_global->action_mallocator, action); + } } void SIMIX_host_execution_cancel(smx_action_t action) @@ -299,7 +302,7 @@ void SIMIX_pre_host_execution_wait(smx_simcall_t simcall) { smx_action_t action = simcall->host_execution_wait.execution; - XBT_DEBUG("Wait for execution of action %p, state %d", action, action->state); + XBT_DEBUG("Wait for execution of action %p, state %d", action, (int)action->state); /* Associate this simcall to the action */ xbt_fifo_push(action->simcalls, simcall); @@ -326,12 +329,12 @@ void SIMIX_host_execution_suspend(smx_action_t action) void SIMIX_host_execution_resume(smx_action_t action) { if(action->execution.surf_exec) - surf_workstation_model->suspend(action->execution.surf_exec); + surf_workstation_model->resume(action->execution.surf_exec); } void SIMIX_execution_finish(smx_action_t action) { - volatile xbt_fifo_item_t item; + xbt_fifo_item_t item; smx_simcall_t simcall; xbt_fifo_foreach(action->simcalls, item, simcall, smx_simcall_t) { @@ -340,32 +343,22 @@ void SIMIX_execution_finish(smx_action_t action) case SIMIX_DONE: /* do nothing, action done */ - XBT_DEBUG("SIMIX_execution_finished: execution successful"); + XBT_DEBUG("SIMIX_execution_finished: execution successful"); break; case SIMIX_FAILED: XBT_DEBUG("SIMIX_execution_finished: host '%s' failed", simcall->issuer->smx_host->name); - TRY { - THROWF(host_error, 0, "Host failed"); - } - CATCH(simcall->issuer->running_ctx->exception) { - simcall->issuer->doexception = 1; - } - break; + SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed"); + break; case SIMIX_CANCELED: XBT_DEBUG("SIMIX_execution_finished: execution canceled"); - TRY { - THROWF(cancel_error, 0, "Canceled"); - } - CATCH(simcall->issuer->running_ctx->exception) { - simcall->issuer->doexception = 1; - } - break; + SMX_EXCEPTION(simcall->issuer, cancel_error, 0, "Canceled"); + break; default: xbt_die("Internal error in SIMIX_execution_finish: unexpected action state %d", - action->state); + (int)action->state); } simcall->issuer->waiting_action = NULL; simcall->host_execution_wait.result = action->state; @@ -378,14 +371,15 @@ void SIMIX_execution_finish(smx_action_t action) void SIMIX_post_host_execute(smx_action_t action) { - /* FIXME: check if the host running the action failed or not*/ - /*if(surf_workstation_model->extension.workstation.get_state(action->host->host))*/ - - /* If the host running the action didn't fail, then the action was canceled */ - if (surf_workstation_model->action_state_get(action->execution.surf_exec) == SURF_ACTION_FAILED) + if (surf_workstation_model->extension.workstation.get_state(action->execution.host->host)==SURF_RESOURCE_OFF) { + /* if the host running the action failed, notice it so that the asking process can be killed if it runs on that host itself */ + action->state = SIMIX_FAILED; + } else if (surf_workstation_model->action_state_get(action->execution.surf_exec) == SURF_ACTION_FAILED) { + /* If the host running the action didn't fail, then the action was canceled */ action->state = SIMIX_CANCELED; - else + } else { action->state = SIMIX_DONE; + } if (action->execution.surf_exec) { surf_workstation_model->action_unref(action->execution.surf_exec);