|
From: <xb...@us...> - 2013-10-11 09:27:09
|
Revision: 1864
http://sourceforge.net/p/scstudio/code/1864
Author: xborza
Date: 2013-10-11 09:27:00 +0000 (Fri, 11 Oct 2013)
Log Message:
-----------
/trunk merged with with ondra/conditions branch
Modified Paths:
--------------
trunk/doc/help/CMakeLists.txt
trunk/doc/help/frontend/automatic_drawing.body.htm
trunk/src/check/localchoice/local_choice_checker.cpp
trunk/src/check/localchoice/local_choice_checker.h
trunk/src/check/order/acyclic_checker.cpp
trunk/src/check/order/acyclic_checker.h
trunk/src/check/order/fifo_checker.cpp
trunk/src/check/order/fifo_checker.h
trunk/src/check/pseudocode/causal_closure_initiator.cpp
trunk/src/check/pseudocode/causal_closure_initiator.h
trunk/src/check/pseudocode/communication_graph.cpp
trunk/src/check/pseudocode/communication_graph.h
trunk/src/check/pseudocode/msc_duplicators.cpp
trunk/src/check/pseudocode/msc_duplicators.h
trunk/src/check/pseudocode/utils.h
trunk/src/check/pseudocode/visual_closure_initiator.cpp
trunk/src/check/pseudocode/visual_closure_initiator.h
trunk/src/check/race/footprint.cpp
trunk/src/check/race/footprint.h
trunk/src/check/race/race_checker.cpp
trunk/src/check/race/race_checker.h
trunk/src/check/time/constraint_syntax.cpp
trunk/src/check/time/hmsc_all_paths.cpp
trunk/src/check/time/hmsc_all_paths.h
trunk/src/check/time/module.cpp
trunk/src/check/time/pcap_time.cpp
trunk/src/check/time/tightening.cpp
trunk/src/check/time/tightening.h
trunk/src/check/time/time_consistency.h
trunk/src/check/time/time_pseudocode.cpp
trunk/src/check/time/time_pseudocode.h
trunk/src/check/time/time_trace_race.h
trunk/src/check/time/traverse_erase.cpp
trunk/src/check/time/traverse_erase.h
trunk/src/data/CMakeLists.txt
trunk/src/data/Z120/Context.cpp
trunk/src/data/Z120/Context_Impl.h
trunk/src/data/Z120/z120.h
trunk/src/data/Z120/z120_save.cpp
trunk/src/data/beautify/layout_optimizer.cpp
trunk/src/data/beautify/time_transformer.cpp
trunk/src/data/dfs_area_traverser.cpp
trunk/src/data/dfs_area_traverser.h
trunk/src/data/dfs_events_traverser.cpp
trunk/src/data/dfs_events_traverser.h
trunk/src/data/dfs_instance_events_traverser.cpp
trunk/src/data/dfs_instance_events_traverser.h
trunk/src/data/engmann/engmann.cpp
trunk/src/data/exporttex/exportTex.cpp
trunk/src/data/modelchecking/divine.cpp
trunk/src/data/modelchecking/divine.h
trunk/src/data/msc/BMsc.cpp
trunk/src/data/msc/BMsc.h
trunk/src/data/msc/Condition.h
trunk/src/data/msc/ConditionNode.cpp
trunk/src/data/msc/ConditionNode.h
trunk/src/data/msc/CoregionArea.cpp
trunk/src/data/msc/CoregionArea.h
trunk/src/data/msc/CoregionEventRelation.h
trunk/src/data/msc/Event.cpp
trunk/src/data/msc/Event.h
trunk/src/data/msc/EventArea.cpp
trunk/src/data/msc/EventArea.h
trunk/src/data/msc/EventTmpl.h
trunk/src/data/msc/Instance.cpp
trunk/src/data/msc/Instance.h
trunk/src/data/msc/LocalAction.h
trunk/src/data/msc/MessageEvent.cpp
trunk/src/data/msc/MessageEvent.h
trunk/src/data/msc/MscMessage.h
trunk/src/data/msc/StrictOrderArea.cpp
trunk/src/data/msc/StrictOrderArea.h
trunk/src/data/msc/time/TimeRelationEvent.cpp
trunk/src/data/msc/time/TimeRelationEvent.h
trunk/src/data/msc.h
trunk/src/data/msc_types.h
trunk/src/data/mscgen/MscgenContext.cpp
trunk/src/data/pcap/pcap_handler.cpp
trunk/src/data/pcap/pcap_handler.h
trunk/src/data/time_relevant_ordering/dfs_backward_traverser.cpp
trunk/src/data/time_relevant_ordering/dfs_backward_traverser.h
trunk/src/data/time_relevant_ordering/time_order_optimizer.cpp
trunk/src/data/time_relevant_ordering/time_order_optimizer.h
trunk/src/data/time_relevant_ordering/time_relevant_ordering.cpp
trunk/src/data/time_relevant_ordering/time_relevant_ordering.h
trunk/src/membership/diff_impl.cpp
trunk/src/membership/membership_additional.cpp
trunk/src/membership/membership_additional.h
trunk/src/membership/membership_alg.cpp
trunk/src/membership/membership_base.h
trunk/src/membership/membership_time.cpp
trunk/src/montecarlo/montecarlo.cpp
trunk/src/montecarlo/montecarlo.h
trunk/src/view/visio/addon/extract.cpp
trunk/src/view/visio/addon/extract.h
trunk/src/view/visio/addon/visualize.cpp
trunk/src/view/visio/addon/visualize.h
trunk/tests/acyclic_checker_test.cpp
trunk/tests/bmsc_matrix_converter_test.cpp
trunk/tests/bmsc_tightening_test.cpp
trunk/tests/constrain_check_test.cpp
trunk/tests/exporttex_position_test/exporttex_position_test.cpp
trunk/tests/fifo_checker_test.cpp
trunk/tests/hmsc_all_paths_test.cpp
trunk/tests/local_choice_checker_test.cpp
trunk/tests/max_tightener_test.cpp
trunk/tests/race_checker_test.cpp
trunk/tests/tighten_hmsc_test.cpp
trunk/tests/tighten_msc_test.cpp
trunk/tests/time/time_race/CMakeLists.txt
trunk/tests/universal_boundedness_checker_test.cpp
Added Paths:
-----------
trunk/src/data/msc/Condition.cpp
trunk/src/data/msc/ConditionEvent.h
trunk/src/data/msc/LocalAction.cpp
trunk/src/data/msc/LocalActionEvent.h
trunk/tests/time/time_race/race_cond_neg1.mpr
trunk/tests/time/time_race/race_cond_neg1.mpr.result
trunk/tests/time/time_race/race_cond_neg1.vsd
trunk/tests/time/time_race/race_cond_neg2.mpr
trunk/tests/time/time_race/race_cond_neg2.mpr.result
trunk/tests/time/time_race/race_cond_neg2.vsd
trunk/tests/time/time_race/race_cond_pos1.mpr
trunk/tests/time/time_race/race_cond_pos1.vsd
trunk/tests/time/time_race/race_cond_pos2.mpr
trunk/tests/time/time_race/race_cond_pos2.vsd
trunk/tests/time/time_race/race_cond_pos3.mpr
trunk/tests/time/time_race/race_cond_pos3.vsd
Removed Paths:
-------------
trunk/src/data/msc/MscMessage.cpp
Property Changed:
----------------
trunk/doc/help/frontend/
trunk/src/data/msc/EventArea.cpp
trunk/src/data/msc/MessageEvent.h
trunk/src/data/msc/StrictOrderArea.cpp
Modified: trunk/doc/help/CMakeLists.txt
===================================================================
--- trunk/doc/help/CMakeLists.txt 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/doc/help/CMakeLists.txt 2013-10-11 09:27:00 UTC (rev 1864)
@@ -18,7 +18,6 @@
fifo/fifo.html
frontend/automatic_drawing.html
frontend/flip_message_direction.html
- frontend/message_jumping.html
frontend/message_numbering.html
frontend/settings.html
frontend/shape_selection.html
Index: trunk/doc/help/frontend
===================================================================
--- trunk/doc/help/frontend 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/doc/help/frontend 2013-10-11 09:27:00 UTC (rev 1864)
Property changes on: trunk/doc/help/frontend
___________________________________________________________________
Added: svn:global-ignores
## -0,0 +1 ##
+message_jumping.body.htm
Modified: trunk/doc/help/frontend/automatic_drawing.body.htm
===================================================================
--- trunk/doc/help/frontend/automatic_drawing.body.htm 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/doc/help/frontend/automatic_drawing.body.htm 2013-10-11 09:27:00 UTC (rev 1864)
@@ -75,11 +75,15 @@
</p>
<ul>
<li>
- if there are no instances selected, all instances on the page are taken (there have to be at least 2 instances on the page);
+ if there are no instances selected, all instances on the page are taken;
</li>
<li>
- otherwise, all selected instances (at least 2) are taken into account.
+ if there is exactly one instance selected, then SCStudio waits for
+ another instance to be selected;
</li>
+ <li>
+ otherwise, all selected instances are taken into account.
+ </li>
</ul>
From all of these instances, the leftmost and the rightmost instances are
recognized as the first and last instance in the message sequence. (During
Modified: trunk/src/check/localchoice/local_choice_checker.cpp
===================================================================
--- trunk/src/check/localchoice/local_choice_checker.cpp 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/localchoice/local_choice_checker.cpp 2013-10-11 09:27:00 UTC (rev 1864)
@@ -67,7 +67,7 @@
current_node->set_attribute(LocalChoiceChecker::lc_nip_attribute, nip);
}
-void BMscInitListener::on_white_event_found(MessageEvent *e)
+void BMscInitListener::on_white_event_found(Event *e)
{
if(m_first) //Still looking for a possibly first event in the instance
{
@@ -81,7 +81,8 @@
{
if(e->is_minimal())
{
- if(e->is_send())
+ MessageEvent* me = dynamic_cast<MessageEvent*>(e);
+ if(me != NULL && me->is_send())
m_mep = true;
}
else //the event is not minimal
@@ -95,7 +96,8 @@
m_first = false;
if(m_first_coregion == NULL)
{
- if(e->is_send())
+ MessageEvent* me = dynamic_cast<MessageEvent*>(e);
+ if(me != NULL && me->is_send())
m_mep = true;
}
}
Modified: trunk/src/check/localchoice/local_choice_checker.h
===================================================================
--- trunk/src/check/localchoice/local_choice_checker.h 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/localchoice/local_choice_checker.h 2013-10-11 09:27:00 UTC (rev 1864)
@@ -105,7 +105,7 @@
bool m_mep;
CoregionArea *m_first_coregion;
public:
- void on_white_event_found(MessageEvent *e);
+ void on_white_event_found(Event *e);
BMscInitListener(void)
:m_idle(true),m_first(true),m_mep(false), m_first_coregion(NULL)
{}
Modified: trunk/src/check/order/acyclic_checker.cpp
===================================================================
--- trunk/src/check/order/acyclic_checker.cpp 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/order/acyclic_checker.cpp 2013-10-11 09:27:00 UTC (rev 1864)
@@ -57,8 +57,8 @@
BMscDuplicator duplicator;
for(it = bmsc->get_instances().begin(); it != bmsc->get_instances().end(); it++)
{
- const MessageEventPList min_events = (*it)->get_minimal_events();
- for (MessageEventPList::const_iterator i = min_events.begin(); i != min_events.end(); ++i)
+ const EventPList min_events = (*it)->get_minimal_events();
+ for (EventPList::const_iterator i = min_events.begin(); i != min_events.end(); ++i)
{
ConnectionNode* node = (*i)->get_attribute<ConnectionNode*>("ACC_node", NULL);
start->add_successor(node);
@@ -80,7 +80,7 @@
cono = dynamic_cast<ConnectionNode*>((*eit));
if(cono)
{
- MessageEventP e = cono->get_attribute<MessageEventP>("ACC_event", NULL);
+ EventP e = cono->get_attribute<EventP>("ACC_event", NULL);
duplicator.get_copy(e)->set_marked(MARKED);
}
nore = dynamic_cast<NodeRelation*>((*eit));
Modified: trunk/src/check/order/acyclic_checker.h
===================================================================
--- trunk/src/check/order/acyclic_checker.h 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/order/acyclic_checker.h 2013-10-11 09:27:00 UTC (rev 1864)
@@ -49,7 +49,7 @@
AssignHMscListener(HMsc *hmsc)
:m_hmsc(hmsc)
{}
- void on_white_event_found(MessageEvent *e)
+ void on_white_event_found(Event *e)
{
ConnectionNode *node = new ConnectionNode();
m_hmsc->add_node(node);
@@ -75,7 +75,7 @@
class InstanceSuccessors: public EventSuccessorListener
{
public:
- void on_event_successor(MessageEvent *event, MessageEvent *successor)
+ void on_event_successor(Event *event, Event *successor)
{
ConnectionNode *first, *second;
first = event->get_attribute("ACC_node", second);
@@ -87,7 +87,7 @@
class CleanHMscListener: public WhiteEventFoundListener
{
public:
- void on_white_event_found(MessageEvent *e)
+ void on_white_event_found(Event *e)
{
ConnectionNode *node, *dummy;
NodeRelation* nr;
@@ -98,7 +98,7 @@
nr->remove_attribute<MscMessage*>("ACC_message");
e->remove_attribute<NodeRelation*>("ACC_relation");
}
- node->remove_attribute<MessageEvent*>("ACC_event");
+ node->remove_attribute<Event*>("ACC_event");
e->remove_attribute<ConnectionNode*>("ACC_node");
}
};
Modified: trunk/src/check/order/fifo_checker.cpp
===================================================================
--- trunk/src/check/order/fifo_checker.cpp 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/order/fifo_checker.cpp 2013-10-11 09:27:00 UTC (rev 1864)
@@ -40,6 +40,7 @@
{
//event is surely complete
MessageEvent* copy = duplicator.get_event_copy(events[i]);
+ assert(copy->get_complete_message() != NULL); // better way of saying something is sure
copy->get_complete_message()->set_marked(MARKED);
}
return new_bmsc;
@@ -53,8 +54,7 @@
DFSEventsTraverser traverser;
traverser.add_event_finished_listener(&topology_listener);
traverser.traverse(bmsc);
- MessageEventPVector topology(topology_listener.get_topology().size());
- topology.assign(
+ EventPVector topology(
topology_listener.get_topology().begin(),
topology_listener.get_topology().end()
);
@@ -65,13 +65,16 @@
BoolVector& closure_e = closure_initiator.get_visual_closure(topology[e]);
for(size_t f=0; f<topology.size(); f++)
{
- if(topology[e]->is_receive() && topology[f]->is_receive() &&
- topology[e]->is_matched() && topology[f]->is_matched() &&
- mapper->same_channel(topology[e],topology[f]) && closure_e[f] &&
- !closure_initiator.get_visual_closure(topology[e]->get_matching_event())[
- closure_initiator.get_topology_index(topology[f]->get_matching_event())])
+ MessageEventP me = dynamic_cast<MessageEventP>(topology[e]);
+ MessageEventP mf = dynamic_cast<MessageEventP>(topology[f]);
+
+ if(me != NULL && mf != NULL &&
+ me->is_receive() && mf->is_receive() &&
+ me->is_matched() && mf->is_matched() &&
+ mapper->same_channel(me, mf) && closure_e[f] &&
+ !closure_initiator.get_visual_closure(me->get_matching_event())[closure_initiator.get_topology_index(mf->get_matching_event())])
{
- result.push_back(create_counter_example(bmsc,topology[e],topology[f]));
+ result.push_back(create_counter_example(bmsc, me, mf));
}
}
}
@@ -83,7 +86,7 @@
{
while(!m_modified_events.empty())
{
- MessageEvent* e = m_modified_events.top();
+ Event* e = m_modified_events.top();
m_modified_events.pop();
e->remove_attribute<size_t>(channel_id_attribute);
}
Modified: trunk/src/check/order/fifo_checker.h
===================================================================
--- trunk/src/check/order/fifo_checker.h 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/order/fifo_checker.h 2013-10-11 09:27:00 UTC (rev 1864)
@@ -55,7 +55,7 @@
/**
* Events with modified dynamic attributes
*/
- MessageEventPStack m_modified_events;
+ EventPStack m_modified_events;
BMscPtr create_counter_example(BMscPtr& bmsc, MessageEvent* receive1, MessageEvent* receive2);
@@ -65,7 +65,7 @@
* An e1 is supposed to be before e2. If this holds true is returned, false
* otherwise.
*/
- bool consistent_order(VisualClosureInitiator& initiator, MessageEvent* e1, MessageEvent* e2)
+ bool consistent_order(VisualClosureInitiator& initiator, Event* e1, Event* e2)
{
BoolVector& e1_closure = initiator.get_visual_closure(e1);
size_t e2_index = initiator.get_topology_index(e2);
@@ -130,7 +130,7 @@
/**
* Setter of channel id attribute of message.
*/
- void set_channel_id(MessageEvent* e, size_t id)
+ void set_channel_id(Event* e, size_t id)
{
e->set_attribute<size_t>(channel_id_attribute,id);
}
@@ -138,7 +138,7 @@
/**
* Getter of channel id attribute of m.
*/
- size_t get_channel_id(MessageEvent* e)
+ size_t get_channel_id(Event* e)
{
return e->get_attribute<size_t>(channel_id_attribute,0);
}
@@ -148,9 +148,10 @@
*
* MessageEvent should be checked if it is receive event and has matching event.
*/
- static bool should_be_checked(MessageEvent* e)
+ static bool should_be_checked(Event* e)
{
- return e->is_receive() && e->is_matched();
+ MessageEvent* me = dynamic_cast<MessageEvent*>(e);
+ return (me != NULL && me->is_receive() && me->is_matched());
}
};
Modified: trunk/src/check/pseudocode/causal_closure_initiator.cpp
===================================================================
--- trunk/src/check/pseudocode/causal_closure_initiator.cpp 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/pseudocode/causal_closure_initiator.cpp 2013-10-11 09:27:00 UTC (rev 1864)
@@ -24,23 +24,22 @@
{
while(!m_modified_events.empty())
{
- MessageEvent* e = m_modified_events.top();
+ Event* e = m_modified_events.top();
e->remove_attribute<BoolVector>(m_causal_closure_attribute);
m_modified_events.pop();
}
}
-void CausalClosureInitiator::initialize(const MessageEventPVector& events,
+void CausalClosureInitiator::initialize(const EventPVector& events,
VisualClosureInitiator& visual_closure_init, ChannelMapperPtr mapper)
{
//initialize matrix
size_t events_count = events.size();
- MessageEventPList::const_iterator i;
//closure[x][y]==true <=> x << y
std::vector<BoolVector*> closure(events_count);
for(size_t i=0;i<events_count;i++)
{
- MessageEvent* i_event = events[i];
+ Event* i_event = events[i];
BoolVector& causal_closure = get_causal_closure(i_event);
causal_closure.resize(events_count,false);
closure[i] = &causal_closure;
@@ -48,33 +47,40 @@
//for any event e: e << e
causal_closure[i] = true;
//send event << receive matching event
- if(i_event->is_send() && i_event->is_matched())
- causal_closure[visual_closure_init.get_topology_index(
- i_event->get_matching_event())] = true;
+ MessageEvent* i_msg_event = dynamic_cast<MessageEvent*>(i_event);
+ if(i_msg_event != NULL && i_msg_event->is_send() && i_msg_event->is_matched())
+ {
+ size_t topo_index = visual_closure_init.get_topology_index(i_msg_event->get_matching_event());
+ causal_closure[topo_index] = true;
+ }
}
for(size_t i=0;i<events_count;i++)
{
- MessageEvent* i_event = events[i];
+ Event* i_event = events[i];
BoolVector& i_causal_closure = *closure[i];
BoolVector& i_visual_closure = visual_closure_init.get_visual_closure(i_event);
for(size_t j = 0; j < events_count; j++)
{
- MessageEvent* j_event = events[j];
- //i_event and j_event are from the same instance, j_event is send event and
- //i_event < j_event
+ Event* j_event = events[j];
+ MessageEvent* j_msg_event = dynamic_cast<MessageEvent*>(j_event);
+
if(i_event->get_instance()==j_event->get_instance() &&
- !j_event->is_receive() && i_visual_closure[j])
+ j_msg_event != NULL && !j_msg_event->is_receive() && i_visual_closure[j])
{
+ //i_event and j_event are from the same instance, j_event is send event and
+ //i_event < j_event
i_causal_closure[j] = true;
}
- //i_event and j_event are send events of the same channel and i_event<j_event
- if(i_event->is_send() && i_event->is_matched() &&
- j_event->is_send() && j_event->is_matched() &&
- mapper->same_channel(i_event,j_event) && i_visual_closure[j])
+
+ MessageEvent* i_msg_event = dynamic_cast<MessageEvent*>(i_event);
+ if(i_msg_event != NULL && j_msg_event != NULL &&
+ i_msg_event->is_send() && i_msg_event->is_matched() &&
+ j_msg_event->is_send() && j_msg_event->is_matched() &&
+ mapper->same_channel(i_msg_event,j_msg_event) && i_visual_closure[j])
{
- get_causal_closure(i_event->get_matching_event())[
- visual_closure_init.get_topology_index(j_event->get_matching_event())
- ] = true;
+ //i_event and j_event are send events of the same channel and i_event<j_event
+ size_t topo_index = visual_closure_init.get_topology_index(j_msg_event->get_matching_event());
+ get_causal_closure(i_msg_event->get_matching_event())[topo_index] = true;
}
}
}
Modified: trunk/src/check/pseudocode/causal_closure_initiator.h
===================================================================
--- trunk/src/check/pseudocode/causal_closure_initiator.h 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/pseudocode/causal_closure_initiator.h 2013-10-11 09:27:00 UTC (rev 1864)
@@ -35,7 +35,7 @@
/**
* Used for cleaning up attributes.
*/
- MessageEventPStack m_modified_events;
+ EventPStack m_modified_events;
/**
* Name of causal closure attribute.
@@ -75,7 +75,7 @@
/**
* Getter of causal closure attribute of e.
*/
- BoolVector& get_causal_closure(MessageEvent* e)
+ BoolVector& get_causal_closure(Event* e)
{
static BoolVector empty(1,false);
return e->get_attribute<BoolVector>(m_causal_closure_attribute,empty);
@@ -90,7 +90,7 @@
* @param events - topologically sorted events used for visual_closure_init's initialization
* @param visual_closure_init - initialized VisualClosureInitiator
*/
- void initialize(const MessageEventPVector& events,
+ void initialize(const EventPVector& events,
VisualClosureInitiator& visual_closure_init, ChannelMapperPtr mapper);
/**
Modified: trunk/src/check/pseudocode/communication_graph.cpp
===================================================================
--- trunk/src/check/pseudocode/communication_graph.cpp 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/pseudocode/communication_graph.cpp 2013-10-11 09:27:00 UTC (rev 1864)
@@ -20,17 +20,16 @@
const std::string CommunicationGraph::lexical_order_attribute = "lexical_order";
-void CommunicationGraphListener::on_white_event_found(MessageEvent *e)
+void CommunicationGraphListener::on_white_event_found(Event *e)
{
unsigned from, to;
bool status;
-
- if(e->is_send())
+ MessageEvent* me = dynamic_cast<MessageEvent*>(e);
+
+ if(me != NULL && me->is_send() && me->is_matched())
{
- if(!e->is_matched())
- return;
- from = e->get_instance()->get_attribute(m_index_attribute, 0, status);
- to = e->get_matching_event()->get_instance()->get_attribute(m_index_attribute, 0, status);
+ from = me->get_instance()->get_attribute(m_index_attribute, 0, status);
+ to = me->get_matching_event()->get_instance()->get_attribute(m_index_attribute, 0, status);
m_graph.at(from).at(to) += 1;
}
}
Modified: trunk/src/check/pseudocode/communication_graph.h
===================================================================
--- trunk/src/check/pseudocode/communication_graph.h 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/pseudocode/communication_graph.h 2013-10-11 09:27:00 UTC (rev 1864)
@@ -88,7 +88,7 @@
Graph& m_graph;
std::string m_index_attribute;
public:
- void on_white_event_found(MessageEvent *e);
+ void on_white_event_found(Event *e);
CommunicationGraphListener(Graph& destination, std::string index_attribute)
:m_graph(destination), m_index_attribute(index_attribute)
{}
Modified: trunk/src/check/pseudocode/msc_duplicators.cpp
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.cpp 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/pseudocode/msc_duplicators.cpp 2013-10-11 09:27:00 UTC (rev 1864)
@@ -105,12 +105,6 @@
return new_bmsc;
}
-MessageEvent* BMscDuplicator::get_event_copy(MessageEvent* e)
-{
- MscElement* elem = get_copy(e);
- return dynamic_cast<MessageEvent*>(elem);
-}
-
BMscDuplicator::~BMscDuplicator()
{
}
@@ -369,7 +363,7 @@
}
-void EventsCreatorListener::on_white_event_found(MessageEvent* e)
+void EventsCreatorListener::on_white_event_found(Event* e)
{
if(m_last_instance!=e->get_instance())
{
@@ -395,14 +389,14 @@
m_last_area = e->get_area();
}
- MessageEventPtr new_e = new MessageEvent(e);
+ EventPtr new_e = e->clone();
m_duplicator->set_copy(e,new_e.get());
m_last_new_area->add_event(new_e);
create_successor(e);
}
-MessageEvent* EventsCreatorListener::get_preceding_event()
+Event* EventsCreatorListener::get_preceding_event()
{
const MscElementPList& elements = m_traverser->get_reached_elements();
if(elements.size()>1)
@@ -413,31 +407,31 @@
if(dynamic_cast<CoregionEventRelation*>(*i))
{
i--;
- return dynamic_cast<MessageEvent*>(*i);
+ return dynamic_cast<Event*>(*i);
}
}
return NULL;
}
-void EventsCreatorListener::on_gray_event_found(MessageEvent* e)
+void EventsCreatorListener::on_gray_event_found(Event* e)
{
create_successor(e);
}
-void EventsCreatorListener::on_black_event_found(MessageEvent* e)
+void EventsCreatorListener::on_black_event_found(Event* e)
{
create_successor(e);
}
-void EventsCreatorListener::create_successor(MessageEvent* e)
+void EventsCreatorListener::create_successor(Event* e)
{
- MessageEvent* coreg_new = m_duplicator->get_event_copy(e);
+ Event* coreg_new = m_duplicator->get_event_copy(e);
if(coreg_new->in_coregion_area())
{
- MessageEvent* preceding = get_preceding_event();
+ Event* preceding = get_preceding_event();
if(preceding)
{
- MessageEvent* preceding_new = m_duplicator->get_event_copy(preceding);
+ Event* preceding_new = m_duplicator->get_event_copy(preceding);
CoregionArea* coregion = dynamic_cast<CoregionArea*>(preceding_new->get_area());
coregion->add_successor_rel(preceding_new, coreg_new);
}
@@ -452,25 +446,29 @@
}
-void MessagesCreatorListener::on_white_event_found(MessageEvent* e)
+void MessagesCreatorListener::on_white_event_found(Event* e)
{
- MessageEvent* event_copy = m_duplicator->get_event_copy(e);
- if(e->is_matched())
+ MessageEvent* me = dynamic_cast<MessageEvent*>(e);
+ if (me == NULL)
+ return; // events of other types ignored
+
+ MessageEvent* event_copy = m_duplicator->get_event_copy(me);
+ if(me->is_matched())
{
- if(e->is_send())
+ if(me->is_send())
{
- MessageEvent* matching_copy = m_duplicator->get_event_copy(e->get_matching_event());
- MscMessagePtr complete = new CompleteMessage(event_copy,matching_copy,e->get_complete_message().get());
+ MessageEvent* matching_copy = m_duplicator->get_event_copy(me->get_matching_event());
+ MscMessagePtr complete = new CompleteMessage(event_copy,matching_copy,me->get_complete_message().get());
event_copy->set_message(complete);
matching_copy->set_message(complete);
- m_duplicator->set_copy(e->get_message().get(),complete.get());
+ m_duplicator->set_copy(me->get_message().get(),complete.get());
}
}
else
{
- MscMessagePtr incomplete = new IncompleteMessage(e->get_incomplete_message().get());
+ MscMessagePtr incomplete = new IncompleteMessage(me->get_incomplete_message().get());
event_copy->set_message(incomplete);
- m_duplicator->set_copy(e->get_message().get(),incomplete.get());
+ m_duplicator->set_copy(me->get_message().get(),incomplete.get());
}
}
@@ -482,7 +480,7 @@
}
-void TimeRelationCreatorListener::on_white_event_found(MessageEvent* e)
+void TimeRelationCreatorListener::on_white_event_found(Event* e)
{
TimeRelationEventPtrList relations = e->get_time_relations();
TimeRelationEventPtrList::iterator it;
@@ -491,16 +489,15 @@
if((*it)->get_event_a()!=e)
continue;
- MessageEvent* a_copy = m_duplicator->get_event_copy((*it)->get_event_a());
- MessageEvent* b_copy = m_duplicator->get_event_copy((*it)->get_event_b());
- TimeRelationEventPtr relation = new TimeRelationEvent((*it).get());
+ Event* a_copy = m_duplicator->get_event_copy((*it)->get_event_a());
+ Event* b_copy = m_duplicator->get_event_copy((*it)->get_event_b());
+ TimeRelationEventPtr relation = new TimeRelationEvent(it->get());
relation->glue_events(a_copy, b_copy);
m_duplicator->set_copy((*it).get(),relation.get());
if((it->get())->get_marked() == MARKED)
relation->set_marked();
}
-
}
////////////////////////////////////////////////////////////////////////
Modified: trunk/src/check/pseudocode/msc_duplicators.h
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.h 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/pseudocode/msc_duplicators.h 2013-10-11 09:27:00 UTC (rev 1864)
@@ -42,6 +42,7 @@
virtual ~Duplicator();
+ // TODO: make this (and possibly others) a template method returning the same type it accepts, so that dynamic casts are not necessary
MscElement*& get_copy(MscElement* e);
SuccessorNode* get_copy(SuccessorNode* s)
@@ -118,17 +119,17 @@
DFSAreaTraverser* m_traverser;
- void create_successor(MessageEvent* e);
+ void create_successor(Event* e);
- MessageEvent* get_preceding_event();
+ Event* get_preceding_event();
public:
EventsCreatorListener(BMscDuplicator* duplicator, DFSAreaTraverser* traverser, BMsc* bmsc);
- void on_white_event_found(MessageEvent* e);
- void on_gray_event_found(MessageEvent* e);
- void on_black_event_found(MessageEvent* e);
+ void on_white_event_found(Event* e);
+ void on_gray_event_found(Event* e);
+ void on_black_event_found(Event* e);
};
@@ -142,7 +143,7 @@
MessagesCreatorListener(BMscDuplicator* duplicator);
- void on_white_event_found(MessageEvent* e);
+ void on_white_event_found(Event* e);
};
@@ -157,7 +158,7 @@
TimeRelationCreatorListener(BMscDuplicator* duplicator);
- void on_white_event_found(MessageEvent* e);
+ void on_white_event_found(Event* e);
};
@@ -180,13 +181,19 @@
~BMscDuplicator();
- MessageEvent* get_event_copy(MessageEvent* e);
+ template <typename EventType>
+ EventType* get_event_copy(EventType* e)
+ {
+ MscElement* elem = get_copy(e);
+ EventType* copy = dynamic_cast<EventType*>(elem);
+ assert(copy != NULL);
+ return copy;
+ }
};
/**
* \brief HMscDuplicator creates exact copy of HMsc
*/
-
class SCPSEUDOCODE_EXPORT HMscDuplicator:
public Duplicator
{
@@ -447,12 +454,12 @@
~HMscFlatPathToBMscDuplicator();
BMscPtr duplicate_path(const MscElementPList& path);
+
+ // TODO: make this a template method returning the same type it accepts, so that dynamic casts are not necessary
MscElement* get_copy_with_occurence(MscElement* element, int occurence);
+ // TODO: make this a template method returning the same type it accepts, so that dynamic casts are not necessary
MscElement* get_copy_by_ref_node(MscElement* element, ReferenceNode* ref);
-
-
-
};
Modified: trunk/src/check/pseudocode/utils.h
===================================================================
--- trunk/src/check/pseudocode/utils.h 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/pseudocode/utils.h 2013-10-11 09:27:00 UTC (rev 1864)
@@ -37,16 +37,19 @@
/**
* \brief Returns event's next first successors
* if event is a send one, returns also its match event
- * TODO: move the functionality to MessageEvent
+ * TODO: move the functionality to Event, or MessageEvent, respectivelly (which would override it)
*/
class SCPSEUDOCODE_EXPORT EventFirstSuccessors
{
public:
- static MessageEventPSet get(MessageEvent* e)
+ static EventPSet get(const EventP e)
{
- MessageEventPSet events = e->get_instance()->get_successor_events(e);
- if(e->is_send() && e->get_matching_event())
- events.insert(e->get_matching_event());
+ EventPSet events = e->get_instance()->get_successor_events(e);
+
+ MessageEventP me = dynamic_cast<MessageEventP>(e);
+ if (me != NULL && me->is_send() && me->get_matching_event())
+ events.insert(me->get_matching_event());
+
return events;
}
}; // EventFirstSuccessors
@@ -82,31 +85,21 @@
class TopologyOrderListener:public EventFinishedListener
{
- MessageEventPList* m_topology;
+ EventPList* m_topology;
public:
- TopologyOrderListener(MessageEventPList* topology)
+ TopologyOrderListener(EventPList* topology)
{
m_topology = topology;
}
- void on_event_finished(MessageEvent* e)
+ void on_event_finished(Event* e)
{
m_topology->push_front(e);
}
};
-class EventRecognizer
-{
-public:
-
- static bool is_matched_receive(MessageEvent* e)
- {
- return e->is_matched() && e->is_receive();
- }
-};
-
/**
* \brief Handles visual closure on bmsc
* Init DFSEventsTraverser, TopologicalOrderListener
@@ -117,7 +110,7 @@
{
private:
BMscPtr m_bmsc;
- MessageEventPList m_event_topology;
+ EventPList m_event_topology;
ChannelMapperPtr m_mapper;
VisualClosureInitiator* m_p_visual_closure_initiator;
@@ -132,8 +125,10 @@
traverser.traverse(m_bmsc);
m_event_topology = topology_listener.get_topology();
- MessageEventPVector topology(topology_listener.get_topology().size());
- topology.assign(topology_listener.get_topology().begin(),topology_listener.get_topology().end());
+ EventPVector topology(
+ topology_listener.get_topology().begin(),
+ topology_listener.get_topology().end()
+ );
m_p_visual_closure_initiator = new VisualClosureInitiator();
m_p_visual_closure_initiator->initialize(topology); //here should be topologically sorted elements
@@ -185,7 +180,7 @@
/**
* \return true if a is less then b (a<b) or equal (a=b)
*/
- bool visual_is_leq(MessageEvent* a,MessageEvent *b)
+ bool visual_is_leq(Event* a, Event *b)
{
BoolVector vector = m_p_visual_closure_initiator->get_visual_closure(a);
@@ -195,7 +190,7 @@
/**
* \return true if a is less then b (a<b) or equal (a=b)
*/
- bool causal_is_leq(MessageEvent* a,MessageEvent *b)
+ bool causal_is_leq(Event* a, Event *b)
{
if(!m_p_causal_closure_initiator)
throw std::runtime_error("Causal closure hasnt been initialized!");
@@ -208,11 +203,9 @@
/**
* \return vector of topologically sorted events according to visual order
*/
- const MessageEventPVector get_topology()
+ const EventPVector get_topology()
{
- MessageEventPVector topology(m_event_topology.size());
- topology.assign(m_event_topology.begin(),m_event_topology.end());
- return topology;
+ return EventPVector(m_event_topology.begin(),m_event_topology.end());
}
};
@@ -316,7 +309,7 @@
* pick up all events
* (WhiteNodeFoundListener)
*/
-class AllReachableEventPVector:public std::vector<MessageEventP>, public WhiteEventFoundListener
+class AllReachableEventPVector:public std::vector<EventP>, public WhiteEventFoundListener
{
private:
DFSEventsTraverser m_traverser;
@@ -341,7 +334,7 @@
m_traverser.remove_white_event_found_listeners();
}
- void on_white_event_found(MessageEvent* e)
+ void on_white_event_found(Event* e)
{
this->push_back(e);
}
@@ -352,7 +345,7 @@
* Go through the vector of all events using AllReachableEventPVector
* and using EventTopologyHandler choose minimal events
*/
-class MinimalEventPList: public std::list<MessageEventP>
+class MinimalEventPList: public std::list<EventP>
{
private:
AllReachableEventPVector m_events;
@@ -361,8 +354,8 @@
public:
MinimalEventPList(BMscPtr bmsc):m_events(bmsc),m_event_top(bmsc)
{
- MessageEventPVector::iterator it;
- MessageEventPVector::iterator it_b;
+ EventPVector::iterator it;
+ EventPVector::iterator it_b;
for (it=m_events.begin();it!=m_events.end();it++)
{
bool is_minimal = true;
@@ -385,7 +378,7 @@
* Go through the vector of all events using AllReachableEventPVector
* and using EventTopologyHandler choose maximal events
*/
-class MaximalEventPList: public std::list<MessageEventP>
+class MaximalEventPList: public std::list<EventP>
{
private:
AllReachableEventPVector m_events;
@@ -394,8 +387,8 @@
public:
MaximalEventPList(BMscPtr bmsc):m_events(bmsc),m_event_top(bmsc)
{
- MessageEventPVector::iterator it;
- MessageEventPVector::iterator it_b;
+ EventPVector::iterator it;
+ EventPVector::iterator it_b;
for (it=m_events.begin();it!=m_events.end();it++)
{
bool is_maximal = true;
Modified: trunk/src/check/pseudocode/visual_closure_initiator.cpp
===================================================================
--- trunk/src/check/pseudocode/visual_closure_initiator.cpp 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/pseudocode/visual_closure_initiator.cpp 2013-10-11 09:27:00 UTC (rev 1864)
@@ -39,8 +39,8 @@
return; // nothing to do, there is no non-empty predecessor area
}
- MessageEventPList max_events = pred_area->get_maximal_events();
- for (MessageEventPList::const_iterator it = max_events.begin(); it != max_events.end(); ++it)
+ EventPList max_events = pred_area->get_maximal_events();
+ for (EventPList::const_iterator it = max_events.begin(); it != max_events.end(); ++it)
make_closure(closure_matrix, succ_index, get_topology_index(*it));
}
@@ -51,7 +51,7 @@
void VisualClosureInitiator::cleanup_attributes()
{
- MessageEventPList::iterator e;
+ EventPList::iterator e;
for(e=m_modified_events.begin();e!=m_modified_events.end();e++)
{
(*e)->remove_attribute<size_t>(m_topology_index_attribute);
@@ -60,14 +60,14 @@
m_modified_events.erase(m_modified_events.begin(),m_modified_events.end());
}
-void VisualClosureInitiator::initialize(const MessageEventPVector& event_topology)
+void VisualClosureInitiator::initialize(const EventPVector& event_topology)
{
//initialize vectors of visual closure of events
//closure[x][y]==true <=> x<*y
std::vector<BoolVector*> closure(event_topology.size());
for(size_t i=0;i<event_topology.size();i++)
{
- MessageEvent* event = event_topology[i];
+ Event* event = event_topology[i];
BoolVector& event_closure = get_visual_closure(event);
event_closure.resize(event_topology.size(),false);
set_topology_index(event,i);
@@ -75,25 +75,28 @@
m_modified_events.push_back(event);
}
//compute visual closures of events' ordering
- make_closure(closure,event_topology);
+ make_closure(closure, event_topology);
}
-void VisualClosureInitiator::make_closure(std::vector<BoolVector*>& closure, const MessageEventPVector& event_topology)
+void VisualClosureInitiator::make_closure(std::vector<BoolVector*>& closure_matrix, const EventPVector& event_topology)
{
for(size_t e=0; e<event_topology.size(); e++)
{
- (*closure[e])[e] = true;
- MessageEvent* event_e = event_topology[e];
+ (*closure_matrix[e])[e] = true;
+ Event* event_e = event_topology[e];
+
//send event is predecessor
- if(event_e->is_receive() && event_e->is_matched())
+ MessageEvent* msg_event_e = dynamic_cast<MessageEvent*>(event_e);
+ if(msg_event_e != NULL && msg_event_e->is_receive() && msg_event_e->is_matched())
{
- make_closure(closure,e,get_topology_index(event_e->get_matching_event()));
+ make_closure(closure_matrix,e,get_topology_index(msg_event_e->get_matching_event()));
}
- make_closure(closure,e,event_e);
+
+ make_closure(closure_matrix,e,event_e);
}
}
-void VisualClosureInitiator::make_closure(std::vector<BoolVector*>& closure, size_t e, MessageEvent* event_e)
+void VisualClosureInitiator::make_closure(std::vector<BoolVector*>& closure, size_t e, Event* event_e)
{
if (event_e->is_minimal())
{
@@ -102,18 +105,18 @@
}
else
{
- MessageEventPSet preds = event_e->get_predecessor_events();
- for (MessageEventPSet::const_iterator it = preds.begin(); it != preds.end(); ++it)
+ EventPSet preds = event_e->get_predecessor_events();
+ for (EventPSet::const_iterator it = preds.begin(); it != preds.end(); ++it)
make_closure(closure, e, get_topology_index(*it));
}
}
-size_t VisualClosureInitiator::get_topology_index(MessageEvent* e)
+size_t VisualClosureInitiator::get_topology_index(Event* e)
{
return e->get_attribute<size_t>(m_topology_index_attribute,0);
}
-void VisualClosureInitiator::set_topology_index(MessageEvent* e,size_t i)
+void VisualClosureInitiator::set_topology_index(Event* e,size_t i)
{
e->set_attribute<size_t>(m_topology_index_attribute,i);
}
Modified: trunk/src/check/pseudocode/visual_closure_initiator.h
===================================================================
--- trunk/src/check/pseudocode/visual_closure_initiator.h 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/pseudocode/visual_closure_initiator.h 2013-10-11 09:27:00 UTC (rev 1864)
@@ -37,16 +37,16 @@
protected:
- MessageEventPList m_topology;
+ EventPList m_topology;
public:
- const MessageEventPList& get_topology()
+ const EventPList& get_topology()
{
return m_topology;
}
- virtual void on_event_finished(MessageEvent* event)
+ virtual void on_event_finished(Event* event)
{
m_topology.push_front(event);
}
@@ -61,7 +61,7 @@
/**
* Events with modified attributes
*/
- MessageEventPList m_modified_events;
+ EventPList m_modified_events;
/**
* Name of topology attribute.
@@ -86,12 +86,12 @@
/**
* Completes closure_matrix for topologicaly sorted event - event_topology
*/
- void make_closure(std::vector<BoolVector*>& closure_matrix, const MessageEventPVector& event_topology);
+ void make_closure(std::vector<BoolVector*>& closure_matrix, const EventPVector& event_topology);
/**
* Completes closure_matrix for event_e with index e
*/
- void make_closure(std::vector<BoolVector*>& closure_matrix, size_t e, MessageEvent* event_e);
+ void make_closure(std::vector<BoolVector*>& closure_matrix, size_t e, Event* event_e);
public:
@@ -118,12 +118,12 @@
* @param event_topology - topologically sorted events of BMsc
* (i<j <=> (event_topology[i]<event_topology[j] or event_topology[i]||event_topology[j]).
*/
- void initialize(const MessageEventPVector& event_topology);
+ void initialize(const EventPVector& event_topology);
/**
* Getter of visual closure attribute of e.
*/
- BoolVector& get_visual_closure(MessageEvent* e)
+ BoolVector& get_visual_closure(Event* e)
{
static BoolVector empty(1,false);
return e->get_attribute<BoolVector>(m_visual_closure_attribute,empty);
@@ -132,12 +132,12 @@
/**
* Getter of topology index attribute of e.
*/
- size_t get_topology_index(MessageEvent* e);
+ size_t get_topology_index(Event* e);
/**
* Setter of topology index attribute of e.
*/
- void set_topology_index(MessageEvent* e,size_t i);
+ void set_topology_index(Event* e,size_t i);
/**
* Cleans up set attributes.
Modified: trunk/src/check/race/footprint.cpp
===================================================================
--- trunk/src/check/race/footprint.cpp 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/race/footprint.cpp 2013-10-11 09:27:00 UTC (rev 1864)
@@ -28,7 +28,7 @@
return a->operator <(*b.get());
}
-EventDependentInstances::EventDependentInstances(MessageEvent* event,size_t instances_count)
+EventDependentInstances::EventDependentInstances(Event* event,size_t instances_count)
{
m_event = event;
m_instances = BoolVector(instances_count,false);
@@ -63,7 +63,7 @@
return m_instances;
}
-MessageEvent* EventDependentInstances::get_event()
+Event* EventDependentInstances::get_event()
{
return m_event;
}
Modified: trunk/src/check/race/footprint.h
===================================================================
--- trunk/src/check/race/footprint.h 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/race/footprint.h 2013-10-11 09:27:00 UTC (rev 1864)
@@ -54,7 +54,7 @@
/**
* Represents dependent Instances -- contain lesser/greater (depends on chosen semantic)
- * MessageEvent then the MessageEvent with specified m_event in this class.
+ * Event then the Event with specified m_event in this class.
*/
class EventDependentInstances
{
@@ -62,14 +62,14 @@
private:
/**
- * This instance of DependetInstances represents dependet instances of an MessageEvent
+ * This instance of DependetInstances represents dependent instances of an Event
* of this attribute
*/
- MessageEvent* m_event;
+ Event* m_event;
/**
* Each Instance i must have its own number. For this vector m_instances holds:
- * m_instances[i]==true iff i contains any greater/lesser MessageEvent than the MessageEvent
+ * m_instances[i]==true iff i contains any greater/lesser Event than the Event
* m_event.
*/
BoolVector m_instances;
@@ -79,7 +79,7 @@
/**
*
*/
- EventDependentInstances(MessageEvent* event,size_t instances_count);
+ EventDependentInstances(Event* event,size_t instances_count);
/**
* Used in std::set as comparision method
@@ -97,7 +97,7 @@
const BoolVector& get_instances();
- MessageEvent* get_event();
+ Event* get_event();
};
@@ -107,7 +107,7 @@
protected:
/**
- * Holds greater/lesser Instances of Events accessible under id of MessageEvent's
+ * Holds greater/lesser Instances of Events accessible under id of Event's
* Instance.
*/
EDInstancesPtrSetVector m_events_instances;
Modified: trunk/src/check/race/race_checker.cpp
===================================================================
--- trunk/src/check/race/race_checker.cpp 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/race/race_checker.cpp 2013-10-11 09:27:00 UTC (rev 1864)
@@ -47,7 +47,7 @@
bmsc->add_instance(i);
StrictOrderAreaPtr a(new StrictOrderArea());
i->add_area(a);
- MessageEventPtr e = a->add_event();
+ MessageEventPtr e = a->add_event(new MessageEvent());
IncompleteMessagePtr m(new IncompleteMessage(LOST));
m->glue_event(e);
}
@@ -72,15 +72,15 @@
BMscPtr b = node->get_bmsc();
const InstancePtrList& instances = b->get_instances();
//compute minimal Events of Instances
- MessageEventPList minimal_events;
+ EventPList minimal_events;
InstancePtrList::const_iterator i;
for(i=instances.begin();i!=instances.end();i++)
{
- MessageEventPListPtr events = DFSInstanceEventsTraverser::topology_order((*i).get());
- MessageEventPList::const_iterator e1;
+ EventPListPtr events = DFSInstanceEventsTraverser::topology_order(i->get());
+ EventPList::const_iterator e1;
for(e1 = events->begin();e1!=events->end();e1++)
{
- MessageEventPList::const_iterator e2;
+ EventPList::const_iterator e2;
for(e2 = events->begin();e2!=events->end();e2++)
{
if(e1!=e2)
@@ -91,27 +91,26 @@
if(e2_causal[e1_index]) break;
}
}
- //'while loop' hasn't found any MessageEvent e2 to be less than e1
+ //'while loop' hasn't found any Event e2 to be less than e1
if(e2==events->end())
minimal_events.push_back(*e1);
}
}
/*
- For each MessageEvent e1 from minimal_events find Instances containing less Events
- than MessageEvent e1 in minimal_events.
- Note that if there exists any MessageEvent e2<e1 at Instance i, e2 must be grater
- or equal to some MessageEvent e3 in minimal_events, therefore we will use only
+ For each Event e1 from minimal_events find Instances containing less Events
+ than Event e1 in minimal_events.
+ Note that if there exists any Event e2<e1 at Instance i, e2 must be grater
+ or equal to some Event e3 in minimal_events, therefore we will use only
minimal_events to seek.
*/
- MessageEventPList::const_iterator e;
+ EventPList::const_iterator e;
ExtremeEvents& extreme_events = get_events(b.get());
m_modified_bmscs.push_back(b.get());
for(e=minimal_events.begin();e!=minimal_events.end();e++)
{
- EDInstancesPtr e_instances(
- new EventDependentInstances(*e,m_instance_marker->get_count()));
+ EDInstancesPtr e_instances(new EventDependentInstances(*e,m_instance_marker->get_count()));
size_t e_index = m_vis_initiator->get_topology_index(*e);
- MessageEventPList::const_iterator f;
+ EventPList::const_iterator f;
for(f=minimal_events.begin();f!=minimal_events.end();f++)
{
//if f is less than e (not equal) then Instance of f must be inserted
@@ -156,16 +155,16 @@
BMscPtr b = node->get_bmsc();
const InstancePtrList& instances = b->get_instances();
//compute maximal Events of Instances
- MessageEventPList maximal_events;
+ EventPList maximal_events;
InstancePtrList::const_iterator i;
for(i=instances.begin();i!=instances.end();i++)
{
- MessageEventPListPtr events = DFSInstanceEventsTraverser::topology_order((*i).get());
- MessageEventPList::const_iterator e1 = events->begin();
+ EventPListPtr events = DFSInstanceEventsTraverser::topology_order((*i).get());
+ EventPList::const_iterator e1 = events->begin();
while(e1!=events->end())
{
BoolVector& e1_causal = m_caus_initiator->get_causal_closure(*e1);
- MessageEventPList::const_iterator e2 = events->begin();
+ EventPList::const_iterator e2 = events->begin();
while(e2!=events->end())
{
//we are looking only for different events to be greater
@@ -177,30 +176,28 @@
}
e2++;
}
- //'while loop' hasn't found any MessageEvent e2 to be greater than e1
+ //'while loop' hasn't found any Event e2 to be greater than e1
if(e2==events->end())
maximal_events.push_back(*e1);
e1++;
}
}
/*
- * For any MessageEvent e1 from maximal_events find Instances containing any MessageEvent e2
- * such that e2<<e1 and instances containing any MessageEvent e3 such that e1<<e3.
+ * For any Event e1 from maximal_events find Instances containing any Event e2
+ * such that e2<<e1 and instances containing any Event e3 such that e1<<e3.
*/
- MessageEventPList::const_iterator e;
+ EventPList::const_iterator e;
ExtremeEvents& extreme_events_greater = get_events_greater(b.get());
ExtremeEvents& extreme_events_less = get_events_less(b.get());
m_modified_bmscs.push_back(b.get());
- MessageEventPListPtr events = DFSEventsTraverser::topology_order(b);
+ EventPListPtr events = DFSEventsTraverser::topology_order(b);
for(e=maximal_events.begin();e!=maximal_events.end();e++)
{
- EDInstancesPtr e_instances_greater(
- new EventDependentInstances(*e,m_instance_marker->get_count()));
- EDInstancesPtr e_instances_less(
- new EventDependentInstances(*e,m_instance_marker->get_count()));
+ EDInstancesPtr e_instances_greater(new EventDependentInstances(*e,m_instance_marker->get_count()));
+ EDInstancesPtr e_instances_less(new EventDependentInstances(*e,m_instance_marker->get_count()));
size_t e_index = m_vis_initiator->get_topology_index(*e);
const BoolVector& e_closure = m_caus_initiator->get_causal_closure(*e);
- MessageEventPList::const_iterator f;
+ EventPList::const_iterator f;
/*
Note that in the article only Events from MinP (used D \in MinP notation in
the article) are supposed to be checked. Nothing changes if we check all
@@ -270,26 +267,30 @@
return result;
}
-BMscPtr RaceChecker::create_counter_example(MessageEvent* e1, MessageEvent* e2)
+BMscPtr RaceChecker::create_counter_example(Event* e1, Event* e2)
{
BMscDuplicator duplicator;
BMscPtr original = e1->get_instance()->get_bmsc();
+
+ // NOTE: race should only occur with message events; just for sure...
+ MessageEvent* me1 = dynamic_cast<MessageEvent*>(e1);
+ MessageEvent* me2 = dynamic_cast<MessageEvent*>(e2);
e1->set_marked();
e2->set_marked();
- e1->get_message().get()->set_marked();
- e2->get_message().get()->set_marked();
+ if (me1 != NULL) me1->get_message().get()->set_marked();
+ if (me2 != NULL) me2->get_message().get()->set_marked();
BMscPtr copy = duplicator.duplicate_bmsc(original);
e1->set_marked(NONE);
e2->set_marked(NONE);
- e1->get_message().get()->set_marked(NONE);
- e2->get_message().get()->set_marked(NONE);
+ if (me1 != NULL) me1->get_message().get()->set_marked(NONE);
+ if (me2 != NULL) me2->get_message().get()->set_marked(NONE);
return copy;
}
-bool RaceChecker::check_events(MessageEvent* e1, MessageEvent* e2)
+bool RaceChecker::check_events(Event* e1, Event* e2)
{
//e1<e2 or they are unordered because of topology order with respect to <
BoolVector& e1_visual_order = m_visual_initiator.get_visual_closure(e1);
@@ -305,11 +306,8 @@
std::list<BMscPtr> RaceChecker::check_bmsc(BMscPtr bmsc, ChannelMapperPtr mapper)
{
- MessageEventPListPtr t = DFSEventsTraverser::topology_order(bmsc);
- MessageEventPVector topology(
- t->begin(),
- t->end()
- );
+ EventPListPtr t = DFSEventsTraverser::topology_order(bmsc);
+ EventPVector topology(t->begin(), t->end());
m_visual_initiator.initialize(topology);
m_causal_initiator.initialize(topology,m_visual_initiator,mapper);
std::list<BMscPtr> result;
@@ -610,15 +608,18 @@
EDInstancesPtrSet::const_iterator b;
for(b=bmsc_edi[i].begin();b!=bmsc_edi[i].end();b++)
{
- MessageEvent* b_event = (*b)->get_event();
- if(b_event->is_receive())
+ MessageEvent* b_event = dynamic_cast<MessageEvent*>((*b)->get_event());
+ if(b_event != NULL && b_event->is_receive())
{
const BoolVector& b_instances = (*b)->get_instances();
const EDInstancesPtrSetVector& fooprint_edi = m_footprint->get_events_instances();
EDInstancesPtrSet::const_iterator a;
for(a=fooprint_edi[i].begin();a!=fooprint_edi[i].end();a++)
{
- MessageEvent* a_event = (*a)->get_event();
+ MessageEvent* a_event = dynamic_cast<MessageEvent*>((*a)->get_event());
+ if (a_event == NULL)
+ continue;
+
if(a_event->is_receive() && !m_mapper->same_channel(a_event,b_event))
{
m_counterexamples.push_back(RaceInHMscException(f,b_event,a_event,get_reached_elements().back()));
Modified: trunk/src/check/race/race_checker.h
===================================================================
--- trunk/src/check/race/race_checker.h 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/race/race_checker.h 2013-10-11 09:27:00 UTC (rev 1864)
@@ -89,7 +89,7 @@
* becomes members of new Footprint f2.
*
* When computing new Footprint it is neccessary to find relation between Events
- * in f1 and Events in MaxP of b in case there is some MessageEvent from f1 which belongs
+ * in f1 and Events in MaxP of b in case there is some Event from f1 which belongs
* to new f2 too. This listener prepares structure for this purpose too.
*
* Details are described in Lemma 15 of the article.
@@ -246,7 +246,7 @@
/**
* It was found that e1<e2 but not e1<<e2
*/
- BMscPtr create_counter_example(MessageEvent* e1, MessageEvent* e2);
+ BMscPtr create_counter_example(Event* e1, Event* e2);
/**
*
@@ -303,7 +303,7 @@
return true;
}
- bool check_events(MessageEvent* e1, MessageEvent* e2);
+ bool check_events(Event* e1, Event* e2);
};
class RaceInBMscException:public std::exception
Modified: trunk/src/check/time/constraint_syntax.cpp
===================================================================
--- trunk/src/check/time/constraint_syntax.cpp 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/time/constraint_syntax.cpp 2013-10-11 09:27:00 UTC (rev 1864)
@@ -360,8 +360,8 @@
std::set<TimeRelationEventPtr>::iterator rel;
for(rel=time_relations.begin();rel!=time_relations.end();rel++)
{
- MessageEvent* a = (*rel)->get_event_a();
- MessageEvent* b = (*rel)->get_event_b();
+ Event* a = (*rel)->get_event_a();
+ Event* b = (*rel)->get_event_b();
if(!events_top.visual_is_leq(a,b)&&!events_top.visual_is_leq(b,a))
m_broken_rel.push(*rel);
}
Modified: trunk/src/check/time/hmsc_all_paths.cpp
===================================================================
--- trunk/src/check/time/hmsc_all_paths.cpp 2013-09-26 12:48:24 UTC (rev 1863)
+++ trunk/src/check/time/hmsc_all_paths.cpp 2013-10-11 09:27:00 UTC (rev 1864)
@@ -1,4 +1,5 @@
#include "hmsc_all_paths.h"
+#include <vector>
void AllPaths::traverse()
{
@@ -14,10 +15,9 @@
}
-void AllPaths::all_paths(
-HMscNodePtr node,
-MscElementPList path_prefix2
-)
+//#define MYDBG
+
+void AllPaths::all_paths(HMscNodePtr node, MscElementPList path_prefix2, SystemState system_state)
{
HMscNodePtrSet::iterator last_it;
std::list<PathFoundListener*>::iterator listener_it;
@@ -46,7 +46,7 @@
}
}
- set_number(node,get_number(node)+1); //increment occurence counter of node
+ set_number(node, get_number(node, system_state)+1, system_state); //increment occurence counter of node
//check whether node has successors
PredecessorNode * pre;
@@ -58,10 +58,44 @@
//keep poping until reference node is reached
while(!dynamic_cast<HMscNode*>(path_prefix2.back()))
path_prefix2.pop_back();
- set_number(node, 0);
+ set_number(node, 0, system_state);
return;
}
+ // update the system state
+ // ...from condition nodes
+ ConditionNodePtr cond = boost::dynamic_pointer_cast<ConditionNode>(node);
+ if (cond != NULL)
+ {
+ const std::vector<std::string> names = cond->get_names();
+ switch (cond->get_type())
+ {
+ case ConditionNode::SETTING:
+ for (std::vector<std::string>::const_iterator i = names.begin(); i != names.end(); ++i)
+ system_state.insert(*i);
+ break;
+ case ConditionNode::UNSETTING:
+ for (std::vector<std::string>::const_iterator i = names.begin(); i != names.end(); ++i)
+ system_state.erase(*i);
+ break;
+ default:
+ ; // other condition types have no effect on the system state
+ }
+ }
+ // ... and reference nodes
+ ReferenceNodePtr ref = boost::dynamic_pointer_cast<ReferenceNode>(node);
+ if (ref != NULL)
+ {
+ BMscPtr bmsc = ref->get_bmsc();
+ if (bmsc != NULL)
+ {
+ std::pair<SystemState, SystemState> cond_effect = bmsc->get_condition_effect();
+ for (SystemState::const_iterator i = cond_effect.first.begin(); i != cond_effect.first.end(); ++i)
+ system_state.insert(*i);
+ for (SystemState::const_iterator i = cond_effect.second.begin(); i != cond_effect.second.end(); ++i)
+ system_state.erase(*i);
+ }
+ }
//traverse all successors which do not occur in path_prefix more than m_occurence
NodeRelationPtrVector set_succ = pre->get_successors();
@@ -69,15 +103,31 @@
for(rel=set_succ.begin(); rel!=set_succ.end();rel++)
{
const NodeRelationPtr& node_relation = *rel;
- HMscNodePtr new_node(dynamic_cast<HMscNode*>(node_relation.get()->get_successor()));
- if(get_number(new_node)<m_occurence)
+ HMscNodePtr new_node(dynamic_cast<HMscNode*>(node_relation->get_successor()));
+ if(get_number(new_node, system_state)<m_occurence)
{
-
- path_prefix2.push_back(node_relation.get()); //update attribute
- all_paths(new_node,path_prefix2);
-
+ // check for an unsatisfied guard
+ ConditionNodePtr new_cond_node = boost::dynamic_pointer_cast<ConditionNode>(new_node);
+ if (new_cond_node != NULL)
+ {
+ if (new_cond_node->get_type() == ConditionNode::GUARDING)
+ {
+ bool satisfied = false;
+ const std::vector<std::string> names = new_cond_node->get_names();
+ for (std::vector<std::string>::const_iterator i = names.begin(); i != names.end(); ++i)
+ if (system_state.find(*i) != system_state.end())
+ {
+ satisfied = true;
+ break;
+ }
+ if (!satisfied)
+ continue;
+ }
+ }
+
+ path_prefix2.push_back(node_relation.get()); //update attribute
+ all_paths(new_node,path_prefix2, system_state);
}
-
}
//all successors have been traversed-> update attributes and finish.
@@ -85,6 +135,6 @@
//keep poping until reference node is reached
while(!dynamic_cast<HMscNode*>(path_prefix2.back()))
path_prefix2.pop_back();
- set_number(node, get_number(node)-1);
+ set_number(node, get_number(node, system_state)-1, system_state);
...
[truncated message content] |