- xbt_swag_remove(arg, simix_global->process_to_run);
- xbt_swag_remove(arg, simix_global->process_list);
- xbt_swag_remove(arg, ((smx_process_t) arg)->smx_host->process_list);
- xbt_swag_insert(arg, simix_global->process_to_destroy);
+ XBT_DEBUG("Cleanup process %s (%p), waiting action %p",
+ process->name, process, process->waiting_action);
+
+ /* cancel non-blocking communications */
+ 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);
+
+ if (action->comm.src_proc == process) {
+ XBT_DEBUG("Found an unfinished send comm %p (detached = %d), state %d",
+ action, action->comm.detached, action->state);
+ action->comm.src_proc = NULL;
+
+ if (action->comm.detached) {
+ /* the receiver was supposed to destroy the comm after completion,
+ * but the comm will actually never finish */
+ action->comm.refcount++;
+ }
+ }
+ else if (action->comm.dst_proc == process){
+ XBT_DEBUG("Found an unfinished recv comm %p, state %d", action, action->state);
+ action->comm.dst_proc = NULL;
+ }
+ else {
+ THROW_IMPOSSIBLE;
+ }
+
+ SIMIX_comm_destroy(action);
+ }
+
+ /*xbt_swag_remove(process, simix_global->process_to_run);*/
+ xbt_swag_remove(process, simix_global->process_list);
+ xbt_swag_remove(process, process->smx_host->process_list);
+ xbt_swag_insert(process, simix_global->process_to_destroy);