- case SIMIX_DONE:
- DEBUG1("Communication %p complete!", action);
- SIMIX_comm_copy_data(action);
- break;
-
- case SIMIX_SRC_TIMEOUT:
- TRY {
- THROW0(timeout_error, 0, "Communication timeouted because of sender");
- }
- CATCH(req->issuer->running_ctx->exception) {
- req->issuer->doexception = 1;
- }
- break;
-
- case SIMIX_DST_TIMEOUT:
- TRY {
- THROW0(timeout_error, 0, "Communication timeouted because of receiver");
- }
- CATCH(req->issuer->running_ctx->exception) {
- req->issuer->doexception = 1;
- }
- break;
-
- case SIMIX_SRC_HOST_FAILURE:
- TRY {
- if (req->issuer == action->comm.src_proc)
- THROW0(host_error, 0, "Host failed");
- else
- THROW0(network_error, 0, "Remote peer failed");
- }
- CATCH(req->issuer->running_ctx->exception) {
- req->issuer->doexception = 1;
- }
- break;
-
- case SIMIX_DST_HOST_FAILURE:
- TRY {
- if (req->issuer == action->comm.dst_proc)
- THROW0(host_error, 0, "Host failed");
- else
- THROW0(network_error, 0, "Remote peer failed");
- }
- CATCH(req->issuer->running_ctx->exception) {
- req->issuer->doexception = 1;
- }
- break;
-
- case SIMIX_LINK_FAILURE:
- TRY {
- DEBUG5("Link failure in action %p between '%s' and '%s': posting an exception to the issuer: %s (%p)",
- action, action->comm.src_proc->smx_host->name, action->comm.dst_proc->smx_host->name,
- req->issuer->name, req->issuer);
- THROW0(network_error, 0, "Link failure");
- }
- CATCH(req->issuer->running_ctx->exception) {
- req->issuer->doexception = 1;
- }
- break;
-
- default:
- THROW_IMPOSSIBLE;
+ case SIMIX_DONE:
+ XBT_DEBUG("Communication %p complete!", action);
+ SIMIX_comm_copy_data(action);
+ break;
+
+ case SIMIX_SRC_TIMEOUT:
+ SMX_EXCEPTION(simcall->issuer, timeout_error, 0,
+ "Communication timeouted because of sender");
+ break;
+
+ case SIMIX_DST_TIMEOUT:
+ SMX_EXCEPTION(simcall->issuer, timeout_error, 0,
+ "Communication timeouted because of receiver");
+ break;
+
+ case SIMIX_SRC_HOST_FAILURE:
+ if (simcall->issuer == action->comm.src_proc)
+ simcall->issuer->context->iwannadie = 1;
+// SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed");
+ else
+ SMX_EXCEPTION(simcall->issuer, network_error, 0, "Remote peer failed");
+ break;
+
+ case SIMIX_DST_HOST_FAILURE:
+ if (simcall->issuer == action->comm.dst_proc)
+ simcall->issuer->context->iwannadie = 1;
+// SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed");
+ else
+ SMX_EXCEPTION(simcall->issuer, network_error, 0, "Remote peer failed");
+ break;
+
+ case SIMIX_LINK_FAILURE:
+ XBT_DEBUG("Link failure in action %p between '%s' and '%s': posting an exception to the issuer: %s (%p) detached:%d",
+ action,
+ action->comm.src_proc ? action->comm.src_proc->smx_host->name : NULL,
+ action->comm.dst_proc ? action->comm.dst_proc->smx_host->name : NULL,
+ simcall->issuer->name, simcall->issuer, action->comm.detached);
+ if (action->comm.src_proc == simcall->issuer) {
+ XBT_DEBUG("I'm source");
+ } else if (action->comm.dst_proc == simcall->issuer) {
+ XBT_DEBUG("I'm dest");
+ } else {
+ XBT_DEBUG("I'm neither source nor dest");
+ }
+ SMX_EXCEPTION(simcall->issuer, network_error, 0, "Link failure");
+ break;
+
+ case SIMIX_CANCELED:
+ if (simcall->issuer == action->comm.dst_proc)
+ SMX_EXCEPTION(simcall->issuer, cancel_error, 0,
+ "Communication canceled by the sender");
+ else
+ SMX_EXCEPTION(simcall->issuer, cancel_error, 0,
+ "Communication canceled by the receiver");
+ break;
+
+ default:
+ xbt_die("Unexpected action state in SIMIX_comm_finish: %d", (int)action->state);
+ }
+
+ /* if there is an exception during a waitany or a testany, indicate the position of the failed communication */
+ if (simcall->issuer->doexception) {
+ if (simcall->call == SIMCALL_COMM_WAITANY) {
+ simcall->issuer->running_ctx->exception.value = xbt_dynar_search(simcall->comm_waitany.comms, &action);
+ }
+ else if (simcall->call == SIMCALL_COMM_TESTANY) {
+ simcall->issuer->running_ctx->exception.value = xbt_dynar_search(simcall->comm_testany.comms, &action);
+ }
+ }
+
+ if (surf_workstation_model->extension.
+ workstation.get_state(simcall->issuer->smx_host->host) != SURF_RESOURCE_ON) {
+ simcall->issuer->context->iwannadie = 1;