Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[simix] DeXFTification of Synchro: use std::list<> instead of xbt_fifo_t
[simgrid.git] / src / simix / smx_network.cpp
index c4e1464..7856a90 100644 (file)
@@ -3,6 +3,8 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
+#include <boost/range/algorithm.hpp>
+
 #include "src/surf/surf_interface.hpp"
 #include "src/simix/smx_private.h"
 #include "xbt/log.h"
@@ -84,7 +86,7 @@ void SIMIX_mbox_set_receiver(smx_mailbox_t mbox, smx_process_t process)
 /**
  *  \brief Pushes a communication synchro into a rendez-vous point
  *  \param mbox The mailbox
- *  \param comm The communication synchro
+ *  \param synchro The communication synchro
  */
 static inline void SIMIX_mbox_push(smx_mailbox_t mbox, smx_synchro_t synchro)
 {
@@ -97,7 +99,7 @@ static inline void SIMIX_mbox_push(smx_mailbox_t mbox, smx_synchro_t synchro)
 /**
  *  \brief Removes a communication synchro from a rendez-vous point
  *  \param mbox The rendez-vous point
- *  \param comm The communication synchro
+ *  \param synchro The communication synchro
  */
 void SIMIX_mbox_remove(smx_mailbox_t mbox, smx_synchro_t synchro)
 {
@@ -384,7 +386,7 @@ void simcall_HANDLER_comm_wait(smx_simcall_t simcall, smx_synchro_t synchro, dou
   /* Associate this simcall to the wait synchro */
   XBT_DEBUG("simcall_HANDLER_comm_wait, %p", synchro);
 
-  xbt_fifo_push(synchro->simcalls, simcall);
+  synchro->simcalls.push_back(simcall);
   simcall->issuer->waiting_synchro = synchro;
 
   if (MC_is_active() || MC_record_replay_is_active()) {
@@ -432,7 +434,7 @@ void simcall_HANDLER_comm_test(smx_simcall_t simcall, smx_synchro_t synchro)
     simcall_comm_test__set__result(simcall, comm->src_proc && comm->dst_proc);
     if (simcall_comm_test__get__result(simcall)){
       synchro->state = SIMIX_DONE;
-      xbt_fifo_push(synchro->simcalls, simcall);
+      synchro->simcalls.push_back(simcall);
       SIMIX_comm_finish(synchro);
     } else {
       SIMIX_simcall_answer(simcall);
@@ -442,7 +444,7 @@ void simcall_HANDLER_comm_test(smx_simcall_t simcall, smx_synchro_t synchro)
 
   simcall_comm_test__set__result(simcall, (synchro->state != SIMIX_WAITING && synchro->state != SIMIX_RUNNING));
   if (simcall_comm_test__get__result(simcall)) {
-    xbt_fifo_push(synchro->simcalls, simcall);
+    synchro->simcalls.push_back(simcall);
     SIMIX_comm_finish(synchro);
   } else {
     SIMIX_simcall_answer(simcall);
@@ -462,7 +464,7 @@ void simcall_HANDLER_comm_testany(smx_simcall_t simcall, xbt_dynar_t synchros)
     }else{
       synchro = xbt_dynar_get_as(synchros, idx, smx_synchro_t);
       simcall_comm_testany__set__result(simcall, idx);
-      xbt_fifo_push(synchro->simcalls, simcall);
+      synchro->simcalls.push_back(simcall);
       synchro->state = SIMIX_DONE;
       SIMIX_comm_finish(synchro);
     }
@@ -472,7 +474,7 @@ void simcall_HANDLER_comm_testany(smx_simcall_t simcall, xbt_dynar_t synchros)
   xbt_dynar_foreach(simcall_comm_testany__get__comms(simcall), cursor,synchro) {
     if (synchro->state != SIMIX_WAITING && synchro->state != SIMIX_RUNNING) {
       simcall_comm_testany__set__result(simcall, cursor);
-      xbt_fifo_push(synchro->simcalls, simcall);
+      synchro->simcalls.push_back(simcall);
       SIMIX_comm_finish(synchro);
       return;
     }
@@ -488,7 +490,7 @@ void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, xbt_dynar_t synchros)
   if (MC_is_active() || MC_record_replay_is_active()){
     int idx = SIMCALL_GET_MC_VALUE(simcall);
     synchro = xbt_dynar_get_as(synchros, idx, smx_synchro_t);
-    xbt_fifo_push(synchro->simcalls, simcall);
+    synchro->simcalls.push_back(simcall);
     simcall_comm_waitany__set__result(simcall, idx);
     synchro->state = SIMIX_DONE;
     SIMIX_comm_finish(synchro);
@@ -497,7 +499,7 @@ void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, xbt_dynar_t synchros)
 
   xbt_dynar_foreach(synchros, cursor, synchro){
     /* associate this simcall to the the synchro */
-    xbt_fifo_push(synchro->simcalls, simcall);
+    synchro->simcalls.push_back(simcall);
 
     /* see if the synchro is already finished */
     if (synchro->state != SIMIX_WAITING && synchro->state != SIMIX_RUNNING){
@@ -513,8 +515,12 @@ void SIMIX_waitany_remove_simcall_from_actions(smx_simcall_t simcall)
   unsigned int cursor = 0;
   xbt_dynar_t synchros = simcall_comm_waitany__get__comms(simcall);
 
-  xbt_dynar_foreach(synchros, cursor, synchro)
-    xbt_fifo_remove(synchro->simcalls, simcall);
+  xbt_dynar_foreach(synchros, cursor, synchro) {
+    // Remove the first occurence of simcall:
+    auto i = boost::range::find(synchro->simcalls, simcall);
+    if (i !=  synchro->simcalls.end())
+      synchro->simcalls.erase(i);
+  }
 }
 
 /**
@@ -550,10 +556,10 @@ static inline void SIMIX_comm_start(smx_synchro_t synchro)
     if (SIMIX_process_is_suspended(comm->src_proc) || SIMIX_process_is_suspended(comm->dst_proc)) {
       if (SIMIX_process_is_suspended(comm->src_proc))
         XBT_DEBUG("The communication is suspended on startup because src (%s@%s) was suspended since it initiated the communication",
-            comm->src_proc->name, sg_host_get_name(comm->src_proc->host));
+            comm->src_proc->name.c_str(), sg_host_get_name(comm->src_proc->host));
       else
         XBT_DEBUG("The communication is suspended on startup because dst (%s@%s) was suspended since it initiated the communication",
-            comm->dst_proc->name, sg_host_get_name(comm->dst_proc->host));
+            comm->dst_proc->name.c_str(), sg_host_get_name(comm->dst_proc->host));
 
       comm->surf_comm->suspend();
     }
@@ -568,9 +574,10 @@ void SIMIX_comm_finish(smx_synchro_t synchro)
 {
   simgrid::simix::Comm *comm = static_cast<simgrid::simix::Comm*>(synchro);
   unsigned int destroy_count = 0;
-  smx_simcall_t simcall;
 
-  while ((simcall = (smx_simcall_t) xbt_fifo_shift(synchro->simcalls))) {
+  while (!synchro->simcalls.empty()) {
+    smx_simcall_t simcall = synchro->simcalls.front();
+    synchro->simcalls.pop_front();
 
     /* If a waitany simcall is waiting for this synchro to finish, then remove
        it from the other synchros in the waitany list. Afterwards, get the
@@ -635,7 +642,7 @@ void SIMIX_comm_finish(smx_synchro_t synchro)
                 synchro,
                 comm->src_proc ? sg_host_get_name(comm->src_proc->host) : NULL,
                 comm->dst_proc ? sg_host_get_name(comm->dst_proc->host) : NULL,
-                simcall->issuer->name, simcall->issuer, comm->detached);
+                simcall->issuer->name.c_str(), simcall->issuer, comm->detached);
       if (comm->src_proc == simcall->issuer) {
         XBT_DEBUG("I'm source");
       } else if (comm->dst_proc == simcall->issuer) {