|
From: <ba...@us...> - 2009-03-22 15:40:07
|
Revision: 205
http://scstudio.svn.sourceforge.net/scstudio/?rev=205&view=rev
Author: babicaj
Date: 2009-03-22 15:39:52 +0000 (Sun, 22 Mar 2009)
Log Message:
-----------
HMsc checking bug fixed
Modified Paths:
--------------
trunk/src/check/pseudocode/utils.cpp
trunk/src/check/race/race_checker.cpp
trunk/tests/race_checker_test.cpp
Modified: trunk/src/check/pseudocode/utils.cpp
===================================================================
--- trunk/src/check/pseudocode/utils.cpp 2009-03-14 18:38:09 UTC (rev 204)
+++ trunk/src/check/pseudocode/utils.cpp 2009-03-22 15:39:52 UTC (rev 205)
@@ -67,16 +67,17 @@
void InstanceIdMarker::set_instance_id(Instance* i)
{
StringSizeTMap::iterator it = m_identifiers.find(i->get_label());
+ size_t id;
if(it!=m_identifiers.end())
{
- i->set_attribute<size_t>(m_instance_id_attribute,(*it).second);
+ id = (*it).second;
}
else
{
- size_t size = m_identifiers.size();
- i->set_attribute<size_t>(m_instance_id_attribute,size);
- m_identifiers[i->get_label()] = size;
+ id = m_identifiers.size();
+ m_identifiers[i->get_label()] = id;
}
+ i->set_attribute<size_t>(m_instance_id_attribute,id);
m_modified_instances.push_back(i);
}
@@ -102,7 +103,8 @@
size_t InstanceIdMarker::get_instance_id(Instance* i)
{
- return i->get_attribute<size_t>(m_instance_id_attribute,0);
+ size_t id = i->get_attribute<size_t>(m_instance_id_attribute,0);
+ return id;
}
void InstanceIdMarker::cleanup_attributes()
Modified: trunk/src/check/race/race_checker.cpp
===================================================================
--- trunk/src/check/race/race_checker.cpp 2009-03-14 18:38:09 UTC (rev 204)
+++ trunk/src/check/race/race_checker.cpp 2009-03-22 15:39:52 UTC (rev 205)
@@ -113,8 +113,8 @@
}
}
}
- extreme_events.add_extreme_event(
- m_instance_marker->get_instance_id((*e)->get_instance()),e_instances);
+ size_t e_id = m_instance_marker->get_instance_id((*e)->get_instance());
+ extreme_events.add_extreme_event(e_id,e_instances);
}
}
@@ -156,9 +156,9 @@
EventPList::const_iterator e2 = events->begin();
while(e2!=events->end())
{
- if(e1!=e2)
+ //we are looking only for different events to be greater
+ if(*e1!=*e2)
{
- Event* e = *e2;
size_t e2_index = m_vis_initiator->get_topology_index(*e2);
//e1<<e2 => e1 isn't maximal
if(e1_causal[e2_index]) break;
@@ -196,22 +196,29 @@
*/
for(f=events->begin();f!=events->end();f++)
{
- const BoolVector& f_closure = m_caus_initiator->get_causal_closure(*f);
- size_t f_index = m_vis_initiator->get_topology_index(*f);
- size_t f_instance_id = m_instance_marker->get_instance_id((*f)->get_instance());
- //f is less than e
- if(f_closure[e_index])
+ //we are looking only for events of different instances
+ if((*e)->get_instance()!=(*f)->get_instance())
{
- e_instances_greater->set_dependent(f_instance_id);
+ const BoolVector& f_closure = m_caus_initiator->get_causal_closure(*f);
+ size_t f_index = m_vis_initiator->get_topology_index(*f);
+ size_t f_instance_id = m_instance_marker->get_instance_id((*f)->get_instance());
+ //f is less than e
+ if(f_closure[e_index])
+ {
+ //e_instances_greater->set_dependent(f_instance_id);
+ e_instances_less->set_dependent(f_instance_id);
+ }
+ //e is less than f
+ if(e_closure[f_index])
+ {
+ //e_instances_less->set_dependent(f_instance_id);
+ e_instances_greater->set_dependent(f_instance_id);
+ }
}
- //e is less than f
- if(e_closure[f_index])
- {
- e_instances_less->set_dependent(f_instance_id);
- }
}
- extreme_events_greater.add_extreme_event(
- m_instance_marker->get_instance_id((*e)->get_instance()),e_instances_greater);
+ size_t e_instance_id = m_instance_marker->get_instance_id((*e)->get_instance());
+ extreme_events_greater.add_extreme_event(e_instance_id,e_instances_greater);
+ extreme_events_less.add_extreme_event(e_instance_id,e_instances_less);
}
}
@@ -508,7 +515,6 @@
}
if(j==a_instances.size())
{
- //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-14 18:38:09 UTC (rev 204)
+++ trunk/tests/race_checker_test.cpp 2009-03-22 15:39:52 UTC (rev 205)
@@ -408,6 +408,66 @@
return check(hmsc1,false,false);
}
+bool HMscH()
+{
+ std::cout << "HMscH:" << 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("b");
+ m1->glue_events(e2, e1);
+
+ BMscPtr bmsc2(new BMsc("BMsc2"));
+ InstancePtr instance2_1(new Instance("1"));
+ InstancePtr instance2_2(new Instance("2"));
+ InstancePtr instance2_3(new Instance("3"));
+ bmsc2->add_instance(instance2_1);
+ bmsc2->add_instance(instance2_2);
+ bmsc2->add_instance(instance2_3);
+ StrictOrderAreaPtr strict2_1(new StrictOrderArea());
+ StrictOrderAreaPtr strict2_2(new StrictOrderArea());
+ StrictOrderAreaPtr strict2_3(new StrictOrderArea());
+ instance2_1->add_area(strict2_1);
+ instance2_2->add_area(strict2_2);
+ instance2_3->add_area(strict2_3);
+
+ EventPtr s = strict2_1->add_event();
+ EventPtr r = strict2_3->add_event();
+ CompleteMessagePtr m2 = new CompleteMessage("b");
+ m2->glue_events(s, r);
+
+ s = strict2_3->add_event();
+ r = strict2_2->add_event();
+ m2 = new CompleteMessage("b");
+ m2->glue_events(s,r);
+
+ 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,true,true);
+}
+
int main(int argc, char** argv) {
RETURN_IF_FAILED(HMscA());
RETURN_IF_FAILED(HMscB());
@@ -416,6 +476,7 @@
RETURN_IF_FAILED(HMscE());
RETURN_IF_FAILED(HMscF());
RETURN_IF_FAILED(HMscG());
+ RETURN_IF_FAILED(HMscH());
return 0;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|