Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Transform random transitions into multiple // transitions one for each value in the...
[simgrid.git] / src / mc / mc_transition.c
index d1882ab..99cf291 100644 (file)
@@ -1,5 +1,8 @@
 #include "private.h"
 
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_trans, mc,
+                               "Logging specific to MC transitions");
+
 /* Creates a new iSend transition */
 mc_transition_t MC_trans_isend_new(smx_rdv_t rdv)
 {
@@ -66,17 +69,16 @@ mc_transition_t MC_trans_waitany_new(xbt_dynar_t comms)
 }
 
 /* Creates a new Random transition */
-mc_transition_t MC_trans_random_new(int min, int max)
+mc_transition_t MC_trans_random_new(int value)
 {
   mc_transition_t trans = xbt_new0(s_mc_transition_t, 1);
 
   trans->type = mc_random;
   trans->process = SIMIX_process_self();
-  trans->random.min = min;
-  trans->random.max = max;
-  trans->random.current_value = min;
-  trans->name = bprintf("[%s][%s] Random (%p)", trans->process->smx_host->name, 
-                        trans->process->name, trans);
+  trans->random.value = value;
+  trans->name = bprintf("[%s][%s] Random %d (%p)", trans->process->smx_host->name, 
+                        trans->process->name, value, trans);
+
   return trans;
 }
 
@@ -208,15 +210,18 @@ void MC_trans_intercept_waitany(xbt_dynar_t comms)
  */
 void MC_trans_intercept_random(int min, int max)
 {
+  int i;
   mc_transition_t trans=NULL;
   mc_state_t current_state = NULL;
   if(!mc_replay_mode){
     MC_SET_RAW_MEM;
-    trans = MC_trans_random_new(min, max);
-    current_state = (mc_state_t) 
-      xbt_fifo_get_item_content(xbt_fifo_get_first_item(mc_stack));
-    xbt_setset_set_insert(current_state->created_transitions, trans);
-    xbt_setset_set_insert(current_state->transitions, trans);
+    current_state = (mc_state_t)
+        xbt_fifo_get_item_content(xbt_fifo_get_first_item(mc_stack));
+    for(i=min; i <= max; i++){    
+      trans = MC_trans_random_new(i);
+      xbt_setset_set_insert(current_state->created_transitions, trans);
+      xbt_setset_set_insert(current_state->transitions, trans);
+    }
     MC_UNSET_RAW_MEM;
   }
   SIMIX_process_yield();
@@ -234,8 +239,10 @@ void MC_trans_compute_enabled(xbt_setset_set_t enabled, xbt_setset_set_t transit
       /* Wait transitions are enabled only if the communication has both a
          sender and receiver */
       case mc_wait:
-        if(trans->wait.comm->src_proc && trans->wait.comm->dst_proc)
+        if(trans->wait.comm->src_proc && trans->wait.comm->dst_proc){
           xbt_setset_set_insert(enabled, trans);
+          DEBUG1("Transition %p is enabled for next state", trans);
+        }
         break;
 
       /* WaitAny transitions are enabled if any of it's communications has both
@@ -244,6 +251,7 @@ void MC_trans_compute_enabled(xbt_setset_set_t enabled, xbt_setset_set_t transit
         xbt_dynar_foreach(trans->waitany.comms, index, comm){
           if(comm->src_proc && comm->dst_proc){
             xbt_setset_set_insert(enabled, trans);
+            DEBUG1("Transition %p is enabled for next state", trans);
             break;
           }
         }
@@ -252,6 +260,7 @@ void MC_trans_compute_enabled(xbt_setset_set_t enabled, xbt_setset_set_t transit
       /* The rest of the transitions cannot be disabled */
       default:
         xbt_setset_set_insert(enabled, trans);
+        DEBUG1("Transition %p is enabled for next state", trans);
         break;
     } 
   }
@@ -270,6 +279,9 @@ int MC_transition_depend(mc_transition_t t1, mc_transition_t t2)
 
   if(t1->type != t2->type)
     return FALSE;
+
+  if(t1->type == mc_random || t2->type == mc_random)
+    return FALSE;
   
   if(t1->type == mc_isend && t2->type == mc_isend && t1->isend.rdv != t2->isend.rdv)
     return FALSE;