smx_action_t action;
while ((action = xbt_fifo_pop(process->comms))) {
- /* make sure no one will finish the comm after this process is destroyed */
- SIMIX_comm_cancel(action);
+ /* make sure no one will finish the comm after this process is destroyed (unless it's detached) */
+ if (!action->comm.detached || action->comm.src_proc != process)
+ SIMIX_comm_cancel(action);
if (action->comm.src_proc == process) {
XBT_DEBUG("Found an unfinished send comm %p (detached = %d), state %d, src = %p, dst = %p",
if (action->comm.detached) {
if (action->comm.refcount == 0) {
+ XBT_DEBUG("Increase the refcount before destroying it since it's detached");
/* I'm not supposed to destroy a detached comm from the sender side,
* unless there is no receiver matching the rdv */
action->comm.refcount++;
SIMIX_comm_destroy(action);
}
- }
- else {
+ XBT_DEBUG("Don't destroy it since its refcount is %d",action->comm.refcount);
+ } else {
SIMIX_comm_destroy(action);
}
}