/* set communication */
act->comm.type = type;
act->comm.refcount = 1;
+ act->comm.src_data=NULL;
+ act->comm.dst_data=NULL;
+
#ifdef HAVE_LATENCY_BOUND_TRACKING
//initialize with unknown value
}
action->comm.refcount--;
if (action->comm.refcount > 0)
- return;
+ return;
XBT_DEBUG("Really free communication %p; refcount is now %d", action,
action->comm.refcount);
action->comm.src_buff = NULL;
}
+ if(action->comm.rdv)
+ SIMIX_rdv_remove(action->comm.rdv, action);
+
xbt_mallocator_release(simix_global->action_mallocator, action);
}
}/*else{
XBT_DEBUG("Not yet finished, we have to wait %d\n", xbt_fifo_size(rdv->comm_fifo));
}*/
- // other_action->comm.refcount--;
+ other_action->comm.refcount--;
SIMIX_comm_destroy(this_action);
--smx_total_comms; // this creation was a pure waste
}
--smx_total_comms; // this creation was a pure waste
other_action->state = SIMIX_READY;
other_action->comm.type = SIMIX_COMM_READY;
- // other_action->comm.refcount--;
+ //other_action->comm.refcount--;
}
xbt_fifo_push(dst_proc->comms, other_action);
}
if (action->state != SIMIX_WAITING && action->state != SIMIX_RUNNING) {
SIMIX_comm_finish(action);
} else { /* if (timeout >= 0) { we need a surf sleep action even when there is no timeout, otherwise surf won't tell us when the host fails */
- sleep = surf_workstation_model->extension.workstation.sleep(simcall->issuer->smx_host->host, timeout);
+ sleep = surf_workstation_model->extension.workstation.sleep(simcall->issuer->smx_host, timeout);
surf_workstation_model->action_data_set(sleep, action);
if (simcall->issuer == action->comm.src_proc)
void SIMIX_pre_comm_test(smx_simcall_t simcall, smx_action_t action)
{
if(MC_is_active()){
- simcall->comm_test.result = action->comm.src_proc && action->comm.dst_proc;
- if(simcall->comm_test.result){
+ simcall_comm_test__set__result(simcall, action->comm.src_proc && action->comm.dst_proc);
+ if(simcall_comm_test__get__result(simcall)){
action->state = SIMIX_DONE;
xbt_fifo_push(action->simcalls, simcall);
SIMIX_comm_finish(action);
return;
}
- simcall->comm_test.result = (action->state != SIMIX_WAITING && action->state != SIMIX_RUNNING);
- if (simcall->comm_test.result) {
+ simcall_comm_test__set__result(simcall, (action->state != SIMIX_WAITING && action->state != SIMIX_RUNNING));
+ if (simcall_comm_test__get__result(simcall)) {
xbt_fifo_push(action->simcalls, simcall);
SIMIX_comm_finish(action);
} else {
int idx = simcall->mc_value;
unsigned int cursor;
smx_action_t action;
- simcall->comm_testany.result = -1;
+ simcall_comm_testany__set__result(simcall, -1);
if (MC_is_active()){
if(idx == -1){
SIMIX_simcall_answer(simcall);
}else{
action = xbt_dynar_get_as(actions, idx, smx_action_t);
- simcall->comm_testany.result = idx;
+ simcall_comm_testany__set__result(simcall, idx);
xbt_fifo_push(action->simcalls, simcall);
action->state = SIMIX_DONE;
SIMIX_comm_finish(action);
return;
}
- xbt_dynar_foreach(simcall->comm_testany.comms,cursor,action) {
+ xbt_dynar_foreach(simcall_comm_testany__get__comms(simcall), cursor,action) {
if (action->state != SIMIX_WAITING && action->state != SIMIX_RUNNING) {
- simcall->comm_testany.result = cursor;
+ simcall_comm_testany__set__result(simcall, cursor);
xbt_fifo_push(action->simcalls, simcall);
SIMIX_comm_finish(action);
return;
if (MC_is_active()){
action = xbt_dynar_get_as(actions, idx, smx_action_t);
xbt_fifo_push(action->simcalls, simcall);
- simcall->comm_waitany.result = idx;
+ simcall_comm_waitany__set__result(simcall, idx);
action->state = SIMIX_DONE;
SIMIX_comm_finish(action);
return;
{
smx_action_t action;
unsigned int cursor = 0;
- xbt_dynar_t actions = simcall->comm_waitany.comms;
+ xbt_dynar_t actions = simcall_comm_waitany__get__comms(simcall);
xbt_dynar_foreach(actions, cursor, action) {
xbt_fifo_remove(action->simcalls, simcall);
SIMIX_host_get_name(sender), SIMIX_host_get_name(receiver));
action->comm.surf_comm = surf_workstation_model->extension.workstation.
- communicate(sender->host, receiver->host, action->comm.task_size, action->comm.rate);
+ communicate(sender, receiver, action->comm.task_size, action->comm.rate);
surf_workstation_model->action_data_set(action->comm.surf_comm, action);
if (simcall->call == SIMCALL_COMM_WAITANY) {
SIMIX_waitany_remove_simcall_from_actions(simcall);
if (!MC_is_active())
- simcall->comm_waitany.result = xbt_dynar_search(simcall->comm_waitany.comms, &action);
+ simcall_comm_waitany__set__result(simcall, xbt_dynar_search(simcall_comm_waitany__get__comms(simcall), &action));
}
/* If the action is still in a rendez-vous point then remove from it */
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,
+ action->comm.src_proc ? sg_host_name(action->comm.src_proc->smx_host) : NULL,
+ action->comm.dst_proc ? sg_host_name(action->comm.dst_proc->smx_host) : NULL,
simcall->issuer->name, simcall->issuer, action->comm.detached);
if (action->comm.src_proc == simcall->issuer) {
XBT_DEBUG("I'm source");
/* 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);
+ simcall->issuer->running_ctx->exception.value = xbt_dynar_search(simcall_comm_waitany__get__comms(simcall), &action);
}
else if (simcall->call == SIMCALL_COMM_TESTANY) {
- simcall->issuer->running_ctx->exception.value = xbt_dynar_search(simcall->comm_testany.comms, &action);
+ simcall->issuer->running_ctx->exception.value = xbt_dynar_search(simcall_comm_testany__get__comms(simcall), &action);
}
}
if (surf_workstation_model->extension.
- workstation.get_state(simcall->issuer->smx_host->host) != SURF_RESOURCE_ON) {
+ workstation.get_state(simcall->issuer->smx_host) != SURF_RESOURCE_ON) {
simcall->issuer->context->iwannadie = 1;
}
simcall->issuer->waiting_action = NULL;
xbt_fifo_remove(simcall->issuer->comms, action);
+ if(action->comm.detached){
+ if(simcall->issuer == action->comm.src_proc){
+ if(action->comm.dst_proc)
+ xbt_fifo_remove(action->comm.dst_proc->comms, action);
+ }
+ if(simcall->issuer == action->comm.dst_proc){
+ if(action->comm.src_proc)
+ xbt_fifo_remove(action->comm.src_proc->comms, action);
+ }
+ }
SIMIX_simcall_answer(simcall);
destroy_count++;
}
XBT_DEBUG("Copying comm %p data from %s (%p) -> %s (%p) (%zu bytes)",
comm,
- comm->comm.src_proc ? comm->comm.src_proc->smx_host->name : "a finished process",
+ comm->comm.src_proc ? sg_host_name(comm->comm.src_proc->smx_host) : "a finished process",
comm->comm.src_buff,
- comm->comm.dst_proc ? comm->comm.dst_proc->smx_host->name : "a finished process",
+ comm->comm.dst_proc ? sg_host_name(comm->comm.dst_proc->smx_host) : "a finished process",
comm->comm.dst_buff, buff_size);
/* Copy at most dst_buff_size bytes of the message to receiver's buffer */