|
From: <ba...@us...> - 2009-03-12 19:41:27
|
Revision: 202
http://scstudio.svn.sourceforge.net/scstudio/?rev=202&view=rev
Author: babicaj
Date: 2009-03-12 19:41:00 +0000 (Thu, 12 Mar 2009)
Log Message:
-----------
Bug in HMsc race checking found
Modified Paths:
--------------
trunk/src/check/race/race_checker.cpp
trunk/tests/race_checker_test.cpp
Modified: trunk/src/check/race/race_checker.cpp
===================================================================
--- trunk/src/check/race/race_checker.cpp 2009-03-12 19:15:42 UTC (rev 201)
+++ trunk/src/check/race/race_checker.cpp 2009-03-12 19:41:00 UTC (rev 202)
@@ -102,11 +102,16 @@
EventPList::const_iterator f;
for(f=minimal_events.begin();f!=minimal_events.end();f++)
{
- //if f is less than e then Instance of f must be inserted
- BoolVector& closure = m_caus_initiator->get_causal_closure(*f);
- if(closure[e_index])
- e_instances->set_dependent(
- m_instance_marker->get_instance_id((*f)->get_instance()));
+ //if f is less than e (not equal) then Instance of f must be inserted
+ if(e!=f)
+ {
+ BoolVector& closure = m_caus_initiator->get_causal_closure(*f);
+ if(closure[e_index])
+ {
+ size_t f_id = m_instance_marker->get_instance_id((*f)->get_instance());
+ e_instances->set_dependent(f_id);
+ }
+ }
}
extreme_events.add_extreme_event(
m_instance_marker->get_instance_id((*e)->get_instance()),e_instances);
@@ -503,7 +508,8 @@
}
if(j==a_instances.size())
{
- throw new RaceInHMscException(m_footprint,b_event,a_event,get_reached_elements().back());
+ //throw RaceInHMscException(m_footprint,b_event,a_event,get_reached_elements().back());
+ throw RaceInHMscException(f,b_event,a_event,get_reached_elements().back());
}
}
}
Modified: trunk/tests/race_checker_test.cpp
===================================================================
--- trunk/tests/race_checker_test.cpp 2009-03-12 19:15:42 UTC (rev 201)
+++ trunk/tests/race_checker_test.cpp 2009-03-12 19:41:00 UTC (rev 202)
@@ -358,6 +358,56 @@
return check(hmsc1,false,false);
}
+bool HMscG()
+{
+ std::cout << "HMscG:" << std::endl;
+ BMscPtr bmsc1(new BMsc("BMsc1"));
+ InstancePtr instance1_1(new Instance("1"));
+ InstancePtr instance1_2(new Instance("2"));
+ bmsc1->add_instance(instance1_1);
+ bmsc1->add_instance(instance1_2);
+ StrictOrderAreaPtr strict1_1(new StrictOrderArea());
+ StrictOrderAreaPtr strict1_2(new StrictOrderArea());
+ instance1_1->add_area(strict1_1);
+ instance1_2->add_area(strict1_2);
+ EventPtr e1 = strict1_1->add_event();
+ EventPtr e2 = strict1_2->add_event();
+ CompleteMessagePtr m1 = new CompleteMessage("a");
+ m1->glue_events(e1, e2);
+
+ BMscPtr bmsc2(new BMsc("BMsc2"));
+ InstancePtr instance2_1(new Instance("3"));
+ InstancePtr instance2_2(new Instance("1"));
+ bmsc2->add_instance(instance2_1);
+ bmsc2->add_instance(instance2_2);
+ StrictOrderAreaPtr strict2_1(new StrictOrderArea());
+ StrictOrderAreaPtr strict2_2(new StrictOrderArea());
+ instance2_1->add_area(strict2_1);
+ instance2_2->add_area(strict2_2);
+ EventPtr e3 = strict2_1->add_event();
+ EventPtr e4 = strict2_2->add_event();
+ CompleteMessagePtr m2 = new CompleteMessage("b");
+ m2->glue_events(e3, e4);
+
+ HMscPtr hmsc1(new HMsc("HMsc"));
+ StartNodePtr start1 = new StartNode();
+ hmsc1->set_start(start1);
+ ReferenceNodePtr r1(new ReferenceNode());
+ ReferenceNodePtr r2(new ReferenceNode());
+ EndNodePtr end1(new EndNode());
+ hmsc1->add_node(r1);
+ hmsc1->add_node(r2);
+ hmsc1->add_node(end1);
+ start1->add_successor(r1.get());
+ r1->add_successor(r2.get());
+ r2->add_successor(end1.get());
+
+ r1->set_msc(bmsc1);
+ r2->set_msc(bmsc2);
+
+ return check(hmsc1,false,false);
+}
+
int main(int argc, char** argv) {
RETURN_IF_FAILED(HMscA());
RETURN_IF_FAILED(HMscB());
@@ -365,6 +415,7 @@
RETURN_IF_FAILED(HMscD());
RETURN_IF_FAILED(HMscE());
RETURN_IF_FAILED(HMscF());
+ RETURN_IF_FAILED(HMscG());
return 0;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|