|
From: <ma...@us...> - 2010-10-03 22:11:39
|
Revision: 988
http://scstudio.svn.sourceforge.net/scstudio/?rev=988&view=rev
Author: madzin
Date: 2010-10-03 22:11:32 +0000 (Sun, 03 Oct 2010)
Log Message:
-----------
repair membership bug, add test of this bug and solve some memory leaks
Modified Paths:
--------------
trunk/src/membership/membership_additional.cpp
trunk/src/membership/membership_alg.cpp
trunk/src/membership/membership_time.cpp
trunk/tests/membership/CMakeLists.txt
Added Paths:
-----------
trunk/tests/membership/test_bmsc35.mpr
trunk/tests/membership/test_hmsc35.mpr
Modified: trunk/src/membership/membership_additional.cpp
===================================================================
--- trunk/src/membership/membership_additional.cpp 2010-10-03 19:25:06 UTC (rev 987)
+++ trunk/src/membership/membership_additional.cpp 2010-10-03 22:11:32 UTC (rev 988)
@@ -81,10 +81,16 @@
a_id = a->get_attribute("identification", -1, a_set);
+ if(a_set)
+ c->add_attributed_event(a);
+
bool b_set = true;
b_id = b->get_attribute("identification", -2, b_set);
+ if(b_set)
+ c->add_attributed_event(b);
+
if(c->get_focused_instances().empty()
|| c->contain_focused_instances(a->get_matching_event()->get_instance()->get_label()))
{
Modified: trunk/src/membership/membership_alg.cpp
===================================================================
--- trunk/src/membership/membership_alg.cpp 2010-10-03 19:25:06 UTC (rev 987)
+++ trunk/src/membership/membership_alg.cpp 2010-10-03 22:11:32 UTC (rev 988)
@@ -38,12 +38,7 @@
*/
MscPtr MembershipAlg::find(MscPtr msc, MscPtr bmsc, std::vector<std::wstring> instances)
{
- MembershipContext* c = new MembershipContext();
- c->set_mem(this);
- c->set_focused_instances(instances);
-
HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc > (msc);
-
BMscPtr bmsc_f = boost::dynamic_pointer_cast<BMsc > (bmsc);
if (bmsc_f == NULL)
@@ -52,21 +47,28 @@
return NULL;
}
+ MembershipContext* c = new MembershipContext();
+ c->set_mem(this);
+ c->set_focused_instances(instances);
c->set_bmsc(bmsc_f);
+ MscPtr result = NULL;
if (hmsc != NULL)
- return search_hmsc(c, hmsc, bmsc_f);
+ result = search_hmsc(c, hmsc, bmsc_f);
else
{
BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc > (msc);
if(bmsc != NULL)
- return search_bmsc(c, bmsc, bmsc_f);
+ result = search_bmsc(c, bmsc, bmsc_f);
else
{
print_report(RS_ERROR, L"Membership algorithm cannot recognize a type of browsed MSC");
return NULL;
}
}
+
+ delete c;
+ return result;
}
MscPtr MembershipAlg::find(MscPtr msc, MscPtr bmsc)
@@ -115,11 +117,6 @@
*/
bool check_branch(MembershipContext* c, HMscNodePtr hmsc_node, ConfigurationPtr b)
{
- //remove attributes from previous computation
- if(!c->get_attributed_events().empty()){
- c->clear_attributed_events();
- }
-
//add node to the path which will be printed if the flow meets specification
c->push_path(hmsc_node);
@@ -128,6 +125,11 @@
if (end != NULL)
{
+ //remove attributes from previous computation
+ if(!c->get_attributed_events().empty()){
+ c->clear_attributed_events();
+ }
+
if (b->is_null(c))
return true;
else
@@ -202,8 +204,6 @@
return false;
}
- c->clear_attributed_events();
-
NodeRelationPtrVector successors = node->get_successors();
NodeRelationPtrVector::iterator it;
SuccessorNode* succ;
Modified: trunk/src/membership/membership_time.cpp
===================================================================
--- trunk/src/membership/membership_time.cpp 2010-10-03 19:25:06 UTC (rev 987)
+++ trunk/src/membership/membership_time.cpp 2010-10-03 22:11:32 UTC (rev 988)
@@ -228,6 +228,10 @@
//set of the maximal events (in case more events, the algorithm is not able to decide the maximum one)
std::set<Event*> max;
+
+ if(pos_max.size() == 0)
+ return NULL;
+
max.insert(pos_max[0]);
//try to eliminate pos_min to one event
@@ -438,7 +442,7 @@
start = cor_order->getOrdering().front();
}
-
+
std::vector<int> identifications;
Event* e = get_last_instance_event(c, start.get());
@@ -452,6 +456,8 @@
if(!it_set)
identifications.push_back(it_id);
+ else
+ throw std::runtime_error("Unexpected behaviour");
node_last_events.insert(std::make_pair((*inst_it)->get_label(), identifications));
}
Modified: trunk/tests/membership/CMakeLists.txt
===================================================================
--- trunk/tests/membership/CMakeLists.txt 2010-10-03 19:25:06 UTC (rev 987)
+++ trunk/tests/membership/CMakeLists.txt 2010-10-03 22:11:32 UTC (rev 988)
@@ -265,3 +265,7 @@
#do not meet preconditions
#ADD_TEST(membership_test-118 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc32.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc32_2.mpr 0)
+
+
+ADD_TEST(membership_test-118 ${MEMBERSHIP_TEST_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_hmsc35.mpr ${CMAKE_CURRENT_SOURCE_DIR}/test_bmsc35.mpr 1)
+
Added: trunk/tests/membership/test_bmsc35.mpr
===================================================================
--- trunk/tests/membership/test_bmsc35.mpr (rev 0)
+++ trunk/tests/membership/test_bmsc35.mpr 2010-10-03 22:11:32 UTC (rev 988)
@@ -0,0 +1,19 @@
+mscdocument Membership_help_bmsc.vsd;
+msc Page_1;
+inst A;
+inst B;
+A: instance;
+label e0;
+out request,0 to B;
+time e1 [1], e2 [7];
+label e2;
+in response,1 from B;
+endinstance;
+B: instance;
+label e1;
+in request,0 from A;
+time e3 [2];
+label e3;
+out response,1 to A;
+endinstance;
+endmsc;
Added: trunk/tests/membership/test_hmsc35.mpr
===================================================================
--- trunk/tests/membership/test_hmsc35.mpr (rev 0)
+++ trunk/tests/membership/test_hmsc35.mpr 2010-10-03 22:11:32 UTC (rev 988)
@@ -0,0 +1,46 @@
+mscdocument membership_help_bug.vsd;
+msc Page_1;
+initial connect L0;
+L0: connect L1, L2;
+L1: reference bmsc2 time [0,4);
+ connect L3;
+L2: reference bmsc1 top top L4 [0,12];
+ bottom top L4 [0,3);
+ connect L4;
+L3: connect L5;
+L4: reference bmsc3 connect L3;
+L5: final;
+endmsc;
+msc bmsc1;
+inst A;
+inst B;
+A: instance;
+label e0;
+out request,0 to B;
+time e1 [0,2);
+endinstance;
+B: instance;
+label e1;
+in request,0 from A;
+endinstance;
+endmsc;
+msc bmsc3;
+inst A;
+inst B;
+A: instance;
+in response,0 from B;
+endinstance;
+B: instance;
+out response,0 to A;
+endinstance;
+endmsc;
+msc bmsc2;
+inst A;
+inst B;
+A: instance;
+out Sip,0 to B;
+endinstance;
+B: instance;
+in Sip,0 from A;
+endinstance;
+endmsc;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|