Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
SMPI: before terminating a process, wait for its asynchronous comms
[simgrid.git] / src / simix / smx_process.c
index f45d326..bd34137 100644 (file)
@@ -30,7 +30,16 @@ XBT_INLINE smx_process_t SIMIX_process_self(void)
 }
 
 /**
- * \brief Move a process to the list of processes to destroy.
+ * \brief Returns whether a process has pending asynchronous communications.
+ * \return true if there are asynchronous communications in this process
+ */
+int SIMIX_process_has_pending_comms(smx_process_t process) {
+
+  return xbt_fifo_size(process->comms) > 0;
+}
+
+/**
+ * \brief Moves a process to the list of processes to destroy.
  */
 void SIMIX_process_cleanup(smx_process_t process)
 {
@@ -41,9 +50,9 @@ void SIMIX_process_cleanup(smx_process_t process)
   smx_action_t action;
   while ((action = xbt_fifo_pop(process->comms))) {
 
-    /* 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);
+    /* make sure no one will finish the comm after this process is destroyed,
+     * because src_proc or dst_proc would be an invalid pointer */
+    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",
@@ -58,7 +67,9 @@ void SIMIX_process_cleanup(smx_process_t process)
            action->comm.refcount++;
            SIMIX_comm_destroy(action);
          }
-         XBT_DEBUG("Don't destroy it since its refcount is %d",action->comm.refcount);
+         else {
+           XBT_DEBUG("Don't destroy it since its refcount is %d", action->comm.refcount);
+         }
       } else {
         SIMIX_comm_destroy(action);
       }