|
From: <ma...@us...> - 2011-08-09 17:24:51
|
Revision: 1178
http://scstudio.svn.sourceforge.net/scstudio/?rev=1178&view=rev
Author: madzin
Date: 2011-08-09 17:24:44 +0000 (Tue, 09 Aug 2011)
Log Message:
-----------
Bug fix: reference node was not marked in case absolute time constraint was not satisfied.
Modified Paths:
--------------
trunk/src/membership/membership_alg.cpp
trunk/src/membership/membership_base.h
trunk/src/membership/membership_time.cpp
Added Paths:
-----------
trunk/tests/membership/complete_absolute_pat2.mpr.result
trunk/tests/membership/complete_pat6_6.mpr.result
Modified: trunk/src/membership/membership_alg.cpp
===================================================================
--- trunk/src/membership/membership_alg.cpp 2011-08-09 00:31:03 UTC (rev 1177)
+++ trunk/src/membership/membership_alg.cpp 2011-08-09 17:24:44 UTC (rev 1178)
@@ -1033,6 +1033,7 @@
{
//get msc from the node
ConfigurationPtr old_conf = new Configuration(conf);
+ c->set_processed_ref_node(node);
MscPtr msc = node->get_msc();
BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc > (msc);
Modified: trunk/src/membership/membership_base.h
===================================================================
--- trunk/src/membership/membership_base.h 2011-08-09 00:31:03 UTC (rev 1177)
+++ trunk/src/membership/membership_base.h 2011-08-09 17:24:44 UTC (rev 1178)
@@ -38,6 +38,7 @@
class MembershipResult;
class MembershipContext;
class MembershipTimeRelation;
+class MembershipAbsoluteTime;
enum check_type {membership, receive_ordering};
enum TopBottom {top, bottom};
@@ -50,7 +51,10 @@
typedef boost::intrusive_ptr<CoregionOrdering> CoregionOrderingPtr;
typedef boost::intrusive_ptr<MembershipTimeRelation> MembershipTimeRelationPtr;
typedef boost::intrusive_ptr<MembershipResult> MembershipResultPtr;
+typedef boost::intrusive_ptr<MembershipAbsoluteTime> MembershipAbsoluteTimePtr;
+typedef std::list<MembershipAbsoluteTimePtr> MembershipAbsoluteTimePtrList;
+
class MembershipTimeRelation
{
private:
@@ -137,6 +141,52 @@
}
}
+class MembershipAbsoluteTime
+{
+private:
+ HMscNodePtr ref_node;
+ AbsoluteTimePtr abs;
+
+ //! Number of references to this object.
+ mutable size_t m_counter;
+
+// see http://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/intrusive_ptr.html
+friend void intrusive_ptr_add_ref(const MembershipAbsoluteTime *ptr);
+friend void intrusive_ptr_release(const MembershipAbsoluteTime *ptr);
+
+public:
+ MembershipAbsoluteTime(AbsoluteTimePtr abs, HMscNodePtr ref_node)
+ {
+ this->abs = abs;
+ this->ref_node = ref_node;
+ }
+
+ HMscNodePtr get_ref_node()
+ {
+ return ref_node;
+ }
+
+ AbsoluteTimePtr get_absolute_time()
+ {
+ return abs;
+ }
+};
+
+inline void intrusive_ptr_add_ref(const MembershipAbsoluteTime *ptr)
+{
+ if(ptr != NULL)
+ ++ptr->m_counter;
+}
+
+inline void intrusive_ptr_release(const MembershipAbsoluteTime *ptr)
+{
+ if(ptr != NULL)
+ {
+ if(--ptr->m_counter <= 0)
+ delete ptr;
+ }
+}
+
class MembershipResult
{
std::vector<std::pair<TimeConstraintPtr, HMscNodePtr> > not_covered_intervals; //! intervals in specification which are not satisfied
@@ -210,6 +260,7 @@
BMscPtr bmsc; //! bmsc which represents the flow
MscPtr msc; //! msc which represents the specification
HMscPtr hmsc; //! hmsc which represents the specification //TODO (find uses hmsc, diff uses msc)
+ ReferenceNodePtr processed_ref_node; //! currently processed reference node
std::vector<std::wstring> focused_instances; //! name of instances on which a user is focused on
std::map<CoregionAreaPtr, SnapshotContextPtr> snapshots; //! snapshots of context for each coregion
std::vector<Event*> attributed_events; //! events with attribute
@@ -230,7 +281,7 @@
std::stack<std::vector<TimeRelationRefNodePtr> > ref_node_time_stack;
std::map<TimeRelationRefNodePtr, std::vector<MembershipTimeRelationPtr> > ref_node_time; //! key is a time relation in hmsc specification and set of MembershipTimeRelationPtr which hold possible events for the comparison.
- std::stack<std::map<Event*, AbsoluteTimePtrList> > absolute_time;
+ std::stack<std::map<Event*, MembershipAbsoluteTimePtrList> > absolute_time;
enum checkingTimeMode checking_time_mode;
enum DiffType diff_type;
@@ -246,6 +297,10 @@
diff_type = NOT_DIFF;
checking_time_mode = NO_TIME;
result = NULL;
+ bmsc = NULL;
+ msc = NULL;
+ hmsc = NULL;
+ processed_ref_node = NULL;
}
void set_mem(MembershipAlg* m)
@@ -293,6 +348,16 @@
return msc;
}
+ void set_processed_ref_node(ReferenceNodePtr node)
+ {
+ processed_ref_node = node;
+ }
+
+ ReferenceNodePtr get_processed_ref_node()
+ {
+ return processed_ref_node;
+ }
+
void set_focused_instances(std::vector<std::wstring> instances)
{
focused_instances.insert(focused_instances.begin(), instances.begin(), instances.end());
@@ -587,25 +652,35 @@
}
- void add_absolute_time(Event* e, AbsoluteTimePtrList list)
+ void add_absolute_time(Event* e, AbsoluteTimePtrList list, HMscNodePtr ref_node)
{
- std::pair<std::map<Event*, AbsoluteTimePtrList>::iterator, bool> map_return;
+ std::map<Event*, MembershipAbsoluteTimePtrList>::iterator map_it;
AbsoluteTimePtrList::iterator list_it;
+ MembershipAbsoluteTimePtr abs;
- //it's tricky one, the return value returns a pair of iteratior and a bool value whether the element was added
- //in both cases the first of return pair is a iterator to the element in the map
- map_return = absolute_time.top().insert(std::make_pair(e, list));
+ if(absolute_time.top().find(e) == absolute_time.top().end())
+ {
+ MembershipAbsoluteTimePtrList abs_list;
- if(map_return.second == false)
+ for(list_it = list.begin(); list_it != list.end(); list_it++)
+ {
+ abs = new MembershipAbsoluteTime(*list_it, ref_node);
+ abs_list.push_back(abs);
+ }
+
+ absolute_time.top().insert(std::make_pair(e, abs_list));
+ }
+ else
{
for(list_it = list.begin(); list_it != list.end(); list_it++)
{
- map_return.first->second.insert(map_return.first->second.begin(), *list_it);
+ abs = new MembershipAbsoluteTime(*list_it, ref_node);
+ map_it->second.push_back(abs);
}
}
}
- std::stack<std::map<Event*, AbsoluteTimePtrList> > get_absolute_time()
+ std::stack<std::map<Event*, MembershipAbsoluteTimePtrList> > get_absolute_time()
{
return absolute_time;
}
@@ -658,7 +733,7 @@
void push_time_stacks()
{
std::map<TimeRelationEventPtr, std::vector<MembershipTimeRelationPtr> > r_time;
- std::map<Event*, AbsoluteTimePtrList> a_time;
+ std::map<Event*, MembershipAbsoluteTimePtrList> a_time;
std::vector<TimeRelationRefNodePtr> ref_time;
relative_time.push(r_time);
Modified: trunk/src/membership/membership_time.cpp
===================================================================
--- trunk/src/membership/membership_time.cpp 2011-08-09 00:31:03 UTC (rev 1177)
+++ trunk/src/membership/membership_time.cpp 2011-08-09 17:24:44 UTC (rev 1178)
@@ -18,10 +18,10 @@
#include "membership/membership_time.h"
std::set<MembershipTimeRelationPtr> merge_relative_time_constraints(MembershipContext* c);
-std::map<Event*, AbsoluteTimePtrList> merge_absolute_time_constraints(MembershipContext* c);
+std::map<Event*, MembershipAbsoluteTimePtrList> merge_absolute_time_constraints(MembershipContext* c);
std::set<MembershipTimeRelationPtr> merge_ref_node_time_constraints(MembershipContext* c);
bool check_time(MembershipContext* c, std::set<MembershipTimeRelationPtr>& relative_time,
- std::map<Event*, AbsoluteTimePtrList>& absolute_time,
+ std::map<Event*, MembershipAbsoluteTimePtrList>& absolute_time,
std::set<MembershipTimeRelationPtr> ref_node_time);
void print_bmsc(MembershipContext* c)
@@ -62,7 +62,7 @@
{
std::set<MembershipTimeRelationPtr> relative_time;
- std::map<Event*, AbsoluteTimePtrList> absolute_time;
+ std::map<Event*, MembershipAbsoluteTimePtrList> absolute_time;
std::set<MembershipTimeRelationPtr> ref_node_time;
relative_time = merge_relative_time_constraints(c);
@@ -98,10 +98,11 @@
return relative_time;
}
-std::map<Event*, AbsoluteTimePtrList> merge_absolute_time_constraints(MembershipContext* c)
+//! merge maps of absolute time constraints which are stored in the stack to one map
+std::map<Event*, MembershipAbsoluteTimePtrList> merge_absolute_time_constraints(MembershipContext* c)
{
- std::map<Event*, AbsoluteTimePtrList> absolute_time, temp;
- std::stack<std::map<Event*, AbsoluteTimePtrList> > stack;
+ std::map<Event*, MembershipAbsoluteTimePtrList> absolute_time, temp;
+ std::stack<std::map<Event*, MembershipAbsoluteTimePtrList> > stack;
stack = c->get_absolute_time();
@@ -110,7 +111,7 @@
temp = stack.top();
stack.pop();
- std::map<Event*, AbsoluteTimePtrList>::iterator it, temp_it;
+ std::map<Event*, MembershipAbsoluteTimePtrList>::iterator it, temp_it;
for(temp_it = temp.begin(); temp_it != temp.end(); temp_it++)
{
it = absolute_time.find(temp_it->first);
@@ -141,7 +142,7 @@
}
bool check_time_absolute_mode(MembershipContext* c, std::set<MembershipTimeRelationPtr>& relative_time,
- std::map<Event*, AbsoluteTimePtrList>& absolute_time,
+ std::map<Event*, MembershipAbsoluteTimePtrList>& absolute_time,
std::set<MembershipTimeRelationPtr> ref_node_time)
{
std::map<TimeRelationRefNodePtr, std::vector<MembershipTimeRelationPtr> > ref_node_time_map;
@@ -217,21 +218,23 @@
//absolute time constraints checking
if(absolute_time.size() > 0)
{
- std::map<Event*, AbsoluteTimePtrList>::iterator absolute_it;
+ std::map<Event*, MembershipAbsoluteTimePtrList>::iterator absolute_it;
MscTimeIntervalSetD bmsc_inter, hmsc_absolute, result;
+ MembershipAbsoluteTimePtr abs;
//TODO only first list interval is taken to the consideration
for(absolute_it = absolute_time.begin(); absolute_it != absolute_time.end(); absolute_it++)
{
+ MembershipAbsoluteTimePtr abs = *(absolute_it->second.begin());
bmsc_inter = absolute_it->first->get_absolut_times().front()->get_interval_set();
- hmsc_absolute = (*(absolute_it->second.begin()))->get_interval_set();
+ hmsc_absolute = abs->get_absolute_time()->get_interval_set();
result = MscTimeIntervalSetD::set_intersection(hmsc_absolute, bmsc_inter);
if(result.is_empty())
- c->add_not_covered_interval(*(absolute_it->second.begin()), NULL);
+ c->add_not_covered_interval(abs->get_absolute_time(), abs->get_ref_node());
else
if(result != bmsc_inter)
- c->add_not_full_covered_interval(*(absolute_it->second.begin()), NULL);
+ c->add_not_full_covered_interval(abs->get_absolute_time(), abs->get_ref_node());
}
}
@@ -266,7 +269,7 @@
}
bool check_time_relative_mode(MembershipContext* c, std::set<MembershipTimeRelationPtr>& relative_time,
- std::map<Event*, AbsoluteTimePtrList>& absolute_time,
+ std::map<Event*, MembershipAbsoluteTimePtrList>& absolute_time,
std::set<MembershipTimeRelationPtr> ref_node_time)
{
BMscPtr bmsc_f = c->get_bmsc();
@@ -343,7 +346,7 @@
}
//add time relation between events with absolute time comstrainst to possible minimal events
- std::map<Event*, AbsoluteTimePtrList>::iterator map_it;
+ std::map<Event*, MembershipAbsoluteTimePtrList>::iterator map_it;
for(map_it = absolute_time.begin(); map_it != absolute_time.end(); map_it++)
{
for(second = bmsc_minimal_events.begin(); second != bmsc_minimal_events.end(); second++)
@@ -449,22 +452,24 @@
if(absolute_time.size() > 0)
{
Event* minimal = get_min_event(c, bmsc_minimal_events);
+ std::map<Event*, MembershipAbsoluteTimePtrList>::iterator absolute_it;
+ MscTimeIntervalSetD bmsc_inter, hmsc_absolute, result;
+ MembershipAbsoluteTimePtr abs;
- std::map<Event*, AbsoluteTimePtrList>::iterator absolute_it;
- MscTimeIntervalSetD bmsc_inter, hmsc_absolute, result;
for(absolute_it = absolute_time.begin(); absolute_it != absolute_time.end(); absolute_it++)
{
+ //TODO only first interval from the list is taken to comparison, don't know why the list is pressen and not only a interval.
+ abs = *(absolute_it->second.begin());
bmsc_inter = c->get_time_matrix()->operator()(minimal, absolute_it->first);
- //TODO only first interval from the list is taken to comparison, don't know why the list is pressen and not only a interval.
- hmsc_absolute = (*(absolute_it->second.begin()))->get_interval_set();
+ hmsc_absolute = abs->get_absolute_time()->get_interval_set();
result = MscTimeIntervalSetD::set_intersection(hmsc_absolute, bmsc_inter);
if(result.is_empty())
- c->add_not_covered_interval(*(absolute_it->second.begin()), NULL);
+ c->add_not_covered_interval(abs->get_absolute_time(), abs->get_ref_node());
else
if(result != bmsc_inter)
- c->add_not_full_covered_interval(*(absolute_it->second.begin()), NULL);
+ c->add_not_full_covered_interval(abs->get_absolute_time(), abs->get_ref_node());
}
}
@@ -493,7 +498,7 @@
}
bool check_time(MembershipContext* c, std::set<MembershipTimeRelationPtr>& relative_time,
- std::map<Event*, AbsoluteTimePtrList>& absolute_time,
+ std::map<Event*, MembershipAbsoluteTimePtrList>& absolute_time,
std::set<MembershipTimeRelationPtr> ref_node_time)
{
switch(c->get_checking_time_mode())
@@ -850,7 +855,7 @@
void analyze_time_constraints(MembershipContext* c, Event* node_e, Event* b_e)
{
if(node_e->get_absolut_times().size() > 0)
- c->add_absolute_time(b_e, node_e->get_absolut_times());
+ c->add_absolute_time(b_e, node_e->get_absolut_times(), c->get_processed_ref_node());
if(node_e->get_time_relations().size() > 0)
c->add_relative_time(b_e, node_e->get_time_relations(), node_e);
Added: trunk/tests/membership/complete_absolute_pat2.mpr.result
===================================================================
--- trunk/tests/membership/complete_absolute_pat2.mpr.result (rev 0)
+++ trunk/tests/membership/complete_absolute_pat2.mpr.result 2011-08-09 17:24:44 UTC (rev 1178)
@@ -0,0 +1,125 @@
+Flow "Page_1" not found. Unsatisfied time constraint(s) (red intervals are not satisfied, blue intervals are partialy satisfied):
+mscdocument complete_absolute;
+msc Page_1;
+/* PATH */
+initial connect/* PATH */
+ L0;
+/* PATH */
+L0: reference A/* PATH */
+ connect/* PATH */
+ L1;
+/* PATH */
+L1:/* PATH */
+ connect/* PATH */
+ L2, L3;
+/* MARKED */
+L2: reference C top/* NOT_COVER */
+ bottom L4 [4,5];
+ bottom top L4 [2,3);
+/* PATH */
+ connect/* PATH */
+ L4;
+L3: reference B time [1];
+ connect L5;
+/* PATH */
+L4: reference D/* PATH */
+ connect/* PATH */
+ L5;
+/* PATH */
+L5:/* PATH */
+ connect/* PATH */
+ L6;
+/* PATH */
+L6: final/* PATH */
+;
+endmsc;
+msc A;
+inst PC;
+inst Router;
+inst Server;
+PC: instance;
+label e0;
+out c,0 to Router;
+time e1 [0,1);
+endinstance;
+Router: instance;
+concurrent;
+label e1;
+in c,0 from PC;
+label e2;
+out a,1 to Server before e3;
+time e3 [1,2];
+label e3;
+out b,2 to Server;
+endconcurrent;
+endinstance;
+Server: instance;
+in a,1 from Router;
+in b,2 from Router;
+endinstance;
+endmsc;
+msc C;
+inst PC;
+inst Router;
+inst Server;
+PC: instance;
+out a,0 to Router;
+time /* NOT_FULL_COVER */
+@[9,10];
+out a,1 to Router;
+endinstance;
+Router: instance;
+in a,0 from PC;
+in b,2 from Server;
+in a,1 from PC;
+endinstance;
+Server: instance;
+out b,2 to Router;
+endinstance;
+endmsc;
+msc B;
+inst PC;
+inst Router;
+inst Server;
+PC: instance;
+in c,0 from Server;
+out b,1 to Router;
+endinstance;
+Router: instance;
+in c,2 from Server;
+in b,1 from PC;
+time @[0,15];
+endinstance;
+Server: instance;
+concurrent;
+out c,2 to Router;
+out c,0 to PC;
+endconcurrent;
+endinstance;
+endmsc;
+msc D;
+inst PC;
+inst Router;
+inst Server;
+PC: instance;
+in b,0 from Router;
+out c,1 to Router;
+time @[15,16];
+endinstance;
+Router: instance;
+concurrent;
+in a,2 from Server;
+in a,3 from Server;
+in b,4 from Server;
+out b,0 to PC;
+endconcurrent;
+in c,1 from PC;
+endinstance;
+Server: instance;
+concurrent;
+out a,2 to Router;
+out a,3 to Router;
+out b,4 to Router;
+endconcurrent;
+endinstance;
+endmsc;
Added: trunk/tests/membership/complete_pat6_6.mpr.result
===================================================================
--- trunk/tests/membership/complete_pat6_6.mpr.result (rev 0)
+++ trunk/tests/membership/complete_pat6_6.mpr.result 2011-08-09 17:24:44 UTC (rev 1178)
@@ -0,0 +1,42 @@
+Flow "Page_1" not found. Unsatisfied time constraint(s) (red intervals are not satisfied, blue intervals are partialy satisfied):
+mscdocument bmsc_spec3;
+msc Page_1;
+inst PC;
+inst Router;
+inst Server;
+PC: instance;
+out c,0 to Router;
+out a,1 to Router;
+label e0;
+out a,2 to Router;
+time e1 [4,6);
+in b,3 from Router;
+label e1;
+out c,4 to Router;
+endinstance;
+Router: instance;
+in c,0 from PC;
+label e2;
+out a,5 to Server;
+time/* NOT_COVER */
+ e3 [3,6];
+label e3;
+out b,6 to Server;
+in a,1 from PC;
+in b,7 from Server;
+in a,2 from PC;
+in b,8 from Server;
+in a,9 from Server;
+out b,3 to PC;
+in a,10 from Server;
+in c,4 from PC;
+endinstance;
+Server: instance;
+in a,5 from Router;
+in b,6 from Router;
+out b,7 to Router;
+out b,8 to Router;
+out a,9 to Router;
+out a,10 to Router;
+endinstance;
+endmsc;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|