#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)
{
trans->type = mc_isend;
trans->process = SIMIX_process_self();
trans->isend.rdv = rdv;
- trans->name = bprintf("[%s][%s] iSend (%p)", trans->process->smx_host->name,
- trans->process->name, trans);
+ trans->name =
+ bprintf("[%s]\t iSend (%p)", trans->process->smx_host->name, trans);
return trans;
}
trans->type = mc_irecv;
trans->process = SIMIX_process_self();
trans->irecv.rdv = rdv;
- trans->name = bprintf("[%s][%s] iRecv (%p)", trans->process->smx_host->name,
- trans->process->name, trans);
+ trans->name =
+ bprintf("[%s]\t iRecv (%p)", trans->process->smx_host->name, trans);
return trans;
}
trans->type = mc_wait;
trans->process = SIMIX_process_self();
trans->wait.comm = comm;
- trans->name = bprintf("[%s][%s] Wait (%p)", trans->process->smx_host->name,
- trans->process->name, trans);
+ trans->name =
+ bprintf("[%s]\t Wait (%p)", trans->process->smx_host->name, trans);
return trans;
}
trans->type = mc_test;
trans->process = SIMIX_process_self();
trans->test.comm = comm;
- trans->name = bprintf("[%s][%s] Test (%p)", trans->process->smx_host->name,
- trans->process->name, trans);
+ trans->name =
+ bprintf("[%s]\t Test (%p)", trans->process->smx_host->name, trans);
return trans;
}
trans->type = mc_waitany;
trans->process = SIMIX_process_self();
trans->waitany.comms = comms;
- trans->name = bprintf("[%s][%s] WaitAny (%p)", trans->process->smx_host->name,
- trans->process->name, trans);
+ trans->name =
+ bprintf("[%s]\t WaitAny (%p)", trans->process->smx_host->name,
+ trans);
return trans;
}
/* 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]\t Random %d (%p)", trans->process->smx_host->name,
+ value, trans);
+
return trans;
}
*/
void MC_trans_intercept_isend(smx_rdv_t rdv)
{
- mc_transition_t trans=NULL;
+ mc_transition_t trans = NULL;
mc_state_t current_state = NULL;
- if(!mc_replay_mode){
+ if (!mc_replay_mode) {
MC_SET_RAW_MEM;
trans = MC_trans_isend_new(rdv);
- current_state = (mc_state_t)
- xbt_fifo_get_item_content(xbt_fifo_get_first_item(mc_stack));
+ 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);
MC_UNSET_RAW_MEM;
}
- SIMIX_process_yield();
+ SIMIX_process_yield();
}
/**
*/
void MC_trans_intercept_irecv(smx_rdv_t rdv)
{
- mc_transition_t trans=NULL;
+ mc_transition_t trans = NULL;
mc_state_t current_state = NULL;
- if(!mc_replay_mode){
+ if (!mc_replay_mode) {
MC_SET_RAW_MEM;
trans = MC_trans_irecv_new(rdv);
- current_state = (mc_state_t)
- xbt_fifo_get_item_content(xbt_fifo_get_first_item(mc_stack));
+ 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);
MC_UNSET_RAW_MEM;
*/
void MC_trans_intercept_wait(smx_comm_t comm)
{
- mc_transition_t trans=NULL;
+ mc_transition_t trans = NULL;
mc_state_t current_state = NULL;
- if(!mc_replay_mode){
+ if (!mc_replay_mode) {
MC_SET_RAW_MEM;
trans = MC_trans_wait_new(comm);
- current_state = (mc_state_t)
- xbt_fifo_get_item_content(xbt_fifo_get_first_item(mc_stack));
+ 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);
MC_UNSET_RAW_MEM;
*/
void MC_trans_intercept_test(smx_comm_t comm)
{
- mc_transition_t trans=NULL;
+ mc_transition_t trans = NULL;
mc_state_t current_state = NULL;
- if(!mc_replay_mode){
+ if (!mc_replay_mode) {
MC_SET_RAW_MEM;
trans = MC_trans_test_new(comm);
- current_state = (mc_state_t)
- xbt_fifo_get_item_content(xbt_fifo_get_first_item(mc_stack));
+ 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);
MC_UNSET_RAW_MEM;
*/
void MC_trans_intercept_waitany(xbt_dynar_t comms)
{
- mc_transition_t trans=NULL;
+ unsigned int index = 0;
+ smx_comm_t comm = NULL;
+ mc_transition_t trans = NULL;
mc_state_t current_state = NULL;
- if(!mc_replay_mode){
+ if (!mc_replay_mode) {
MC_SET_RAW_MEM;
- trans = MC_trans_waitany_new(comms);
- 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));
+ xbt_dynar_foreach(comms, index, comm) {
+ trans = MC_trans_wait_new(comm);
+ xbt_setset_set_insert(current_state->created_transitions, trans);
+ xbt_setset_set_insert(current_state->transitions, trans);
+ }
MC_UNSET_RAW_MEM;
}
SIMIX_process_yield();
*/
void MC_trans_intercept_random(int min, int max)
{
- mc_transition_t trans=NULL;
+ int i;
+ mc_transition_t trans = NULL;
mc_state_t current_state = NULL;
- if(!mc_replay_mode){
+ 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();
}
/* Compute the subset of enabled transitions of the transition set */
-void MC_trans_compute_enabled(xbt_setset_set_t enabled, xbt_setset_set_t transitions)
+void MC_trans_compute_enabled(xbt_setset_set_t enabled,
+ xbt_setset_set_t transitions)
{
unsigned int index = 0;
smx_comm_t comm = NULL;
mc_transition_t trans = NULL;
xbt_setset_cursor_t cursor = NULL;
- xbt_setset_foreach(transitions, cursor, trans){
- switch(trans->type){
+ xbt_setset_foreach(transitions, cursor, trans) {
+ switch (trans->type) {
/* 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)
- xbt_setset_set_insert(enabled, trans);
- break;
+ case mc_wait:
+ 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
a sender and a receiver */
- case mc_waitany:
- xbt_dynar_foreach(trans->waitany.comms, index, comm){
- if(comm->src_proc && comm->dst_proc){
- xbt_setset_set_insert(enabled, trans);
- break;
- }
+ case mc_waitany:
+ 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;
}
- break;
+ }
+ break;
/* The rest of the transitions cannot be disabled */
- default:
- xbt_setset_set_insert(enabled, trans);
- break;
- }
+ default:
+ xbt_setset_set_insert(enabled, trans);
+ DEBUG1("Transition %p is enabled for next state", trans);
+ break;
+ }
}
}
*/
int MC_transition_depend(mc_transition_t t1, mc_transition_t t2)
{
- if(t1->process == t2->process)
+ if (t1->process == t2->process)
+ return FALSE;
+
+ if (t1->type != t2->type)
+ return FALSE;
+
+/* if(t1->type == mc_isend && t2->type == mc_irecv)
return FALSE;
- if(t1->type != t2->type)
+ if(t1->type == mc_irecv && t2->type == mc_isend)
+ 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)
+
+ if (t1->type == mc_isend && t2->type == mc_isend
+ && t1->isend.rdv != t2->isend.rdv)
return FALSE;
- if(t1->type == mc_irecv && t2->type == mc_irecv && t1->irecv.rdv != t2->irecv.rdv)
+ if (t1->type == mc_irecv && t2->type == mc_irecv
+ && t1->irecv.rdv != t2->irecv.rdv)
return FALSE;
- if(t1->type == mc_wait && t2->type == mc_wait && t1->wait.comm == t2->wait.comm)
+ if (t1->type == mc_wait && t2->type == mc_wait
+ && t1->wait.comm == t2->wait.comm)
return FALSE;
-
- if(t1->type == mc_wait && t2->type == mc_wait
- && t1->wait.comm->src_buff != NULL
- && t1->wait.comm->dst_buff != NULL
- && t2->wait.comm->src_buff != NULL
- && t2->wait.comm->dst_buff != NULL
- && t1->wait.comm->dst_buff != t2->wait.comm->src_buff
- && t1->wait.comm->dst_buff != t2->wait.comm->dst_buff
- && t2->wait.comm->dst_buff != t1->wait.comm->src_buff)
+
+ if (t1->type == mc_wait && t2->type == mc_wait
+ && t1->wait.comm->src_buff != NULL
+ && t1->wait.comm->dst_buff != NULL
+ && t2->wait.comm->src_buff != NULL
+ && t2->wait.comm->dst_buff != NULL
+ && t1->wait.comm->dst_buff != t2->wait.comm->src_buff
+ && t1->wait.comm->dst_buff != t2->wait.comm->dst_buff
+ && t2->wait.comm->dst_buff != t1->wait.comm->src_buff)
return FALSE;
-
+
+
return TRUE;
-}
\ No newline at end of file
+}