|
From: <ba...@us...> - 2008-12-29 15:50:00
|
Revision: 142
http://scstudio.svn.sourceforge.net/scstudio/?rev=142&view=rev
Author: babicaj
Date: 2008-12-29 15:49:54 +0000 (Mon, 29 Dec 2008)
Log Message:
-----------
Livelock modified to omit connection node cycles, dfs_refnode_hmsc_traverser added into build, SRLChannelMapper renamed to SRMChannelMapper
Modified Paths:
--------------
trunk/src/check/liveness/livelock_checker.cpp
trunk/src/check/order/fifo_checker.h
trunk/src/check/pseudocode/CMakeLists.txt
trunk/src/check/pseudocode/refnode_finder.cpp
trunk/src/check/pseudocode/refnode_finder.h
trunk/src/data/CMakeLists.txt
trunk/src/data/checker.h
trunk/src/data/dfs_bmsc_graph_traverser.cpp
trunk/src/data/dfs_bmsc_graph_traverser.h
trunk/src/data/dfs_refnode_hmsc_traverser.cpp
trunk/src/data/dfs_refnode_hmsc_traverser.h
trunk/tests/acyclic_checker_test.cpp
trunk/tests/fifo_checker_test.cpp
trunk/tests/race_checker_test.cpp
Added Paths:
-----------
trunk/src/data/refnode_finder.cpp
trunk/src/data/refnode_finder.h
Modified: trunk/src/check/liveness/livelock_checker.cpp
===================================================================
--- trunk/src/check/liveness/livelock_checker.cpp 2008-12-29 10:15:52 UTC (rev 141)
+++ trunk/src/check/liveness/livelock_checker.cpp 2008-12-29 15:49:54 UTC (rev 142)
@@ -17,6 +17,7 @@
*/
#include "check/liveness/livelock_checker.h"
+#include "data/dfs_refnode_hmsc_traverser.h"
const std::string ATTRIBUTE_REACHABLE = "LL_reachable";
@@ -87,7 +88,7 @@
HMscPtr LivelockChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
{
HMscPtr p;
- DFSHMscTraverser traverser("LC_color");
+ DFSRefNodeHMscTraverser traverser("LC_color");
LivelockListener listener;
traverser.add_white_node_found_listener(&listener);
traverser.add_gray_node_found_listener(&listener);
Modified: trunk/src/check/order/fifo_checker.h
===================================================================
--- trunk/src/check/order/fifo_checker.h 2008-12-29 10:15:52 UTC (rev 141)
+++ trunk/src/check/order/fifo_checker.h 2008-12-29 15:49:54 UTC (rev 142)
@@ -78,7 +78,7 @@
if(p1 != NULL)
return true;
- SRLChannelMapperPtr p2 = boost::dynamic_pointer_cast<SRLChannelMapper>(chm);
+ SRMChannelMapperPtr p2 = boost::dynamic_pointer_cast<SRMChannelMapper>(chm);
if(p2 != NULL)
return true;
Modified: trunk/src/check/pseudocode/CMakeLists.txt
===================================================================
--- trunk/src/check/pseudocode/CMakeLists.txt 2008-12-29 10:15:52 UTC (rev 141)
+++ trunk/src/check/pseudocode/CMakeLists.txt 2008-12-29 15:49:54 UTC (rev 142)
@@ -3,8 +3,6 @@
causal_closure_initiator.h
visual_closure_initiator.cpp
visual_closure_initiator.h
- refnode_finder.cpp
- refnode_finder.h
utils.cpp
utils.h
msc_duplicators.cpp
Modified: trunk/src/check/pseudocode/refnode_finder.cpp
===================================================================
--- trunk/src/check/pseudocode/refnode_finder.cpp 2008-12-29 10:15:52 UTC (rev 141)
+++ trunk/src/check/pseudocode/refnode_finder.cpp 2008-12-29 15:49:54 UTC (rev 142)
@@ -58,4 +58,10 @@
return successors;
}
+HMscNodePListPtr ReferenceNodeFinder::successors(HMscNode* node, const std::string& color_attribute)
+{
+ ReferenceNodeFinder finder(color_attribute);
+ return finder.find_successors(node);
+}
+
// $Id$
Modified: trunk/src/check/pseudocode/refnode_finder.h
===================================================================
--- trunk/src/check/pseudocode/refnode_finder.h 2008-12-29 10:15:52 UTC (rev 141)
+++ trunk/src/check/pseudocode/refnode_finder.h 2008-12-29 15:49:54 UTC (rev 142)
@@ -82,6 +82,11 @@
* in case you want to reuse this traverser while traversing HMsc.
*/
HMscNodePListPtr find_successors(HMscNode* node);
+
+ /**
+ * \brief Creates ReferenceNodeFinder and returns result of find_successors
+ */
+ static HMscNodePListPtr successors(HMscNode* node, const std::string& color_attribute = "rnf_color");
protected:
Modified: trunk/src/data/CMakeLists.txt
===================================================================
--- trunk/src/data/CMakeLists.txt 2008-12-29 10:15:52 UTC (rev 141)
+++ trunk/src/data/CMakeLists.txt 2008-12-29 15:49:54 UTC (rev 142)
@@ -8,6 +8,10 @@
dfs_events_traverser.h
dfs_hmsc_traverser.cpp
dfs_hmsc_traverser.h
+ refnode_finder.cpp
+ refnode_finder.h
+ dfs_refnode_hmsc_traverser.cpp
+ dfs_refnode_hmsc_traverser.h
dfsb_hmsc_traverser.cpp
dfsb_hmsc_traverser.h
dfs_instance_events_traverser.cpp
Modified: trunk/src/data/checker.h
===================================================================
--- trunk/src/data/checker.h 2008-12-29 10:15:52 UTC (rev 141)
+++ trunk/src/data/checker.h 2008-12-29 15:49:54 UTC (rev 142)
@@ -312,7 +312,7 @@
* To see delivery semantic of this class see operator<() and same_channel()
* methods of this class.
*/
-class SRLMessagePart {
+class SRMMessagePart {
std::string m_sender;
@@ -322,14 +322,14 @@
public:
- SRLMessagePart(const Event* e)
+ SRMMessagePart(const Event* e)
{
m_sender = e->get_sender_label();
m_receiver = e->get_receiver_label();
m_label = e->get_message()->get_label();
}
- bool operator<(const SRLMessagePart& mp) const
+ bool operator<(const SRMMessagePart& mp) const
{
int s = m_sender.compare(mp.m_sender);
int r = m_receiver.compare(mp.m_receiver);
@@ -350,10 +350,10 @@
};
typedef GeneralMapper<SRMessagePart> SRChannelMapper;
-typedef GeneralMapper<SRLMessagePart> SRLChannelMapper;
+typedef GeneralMapper<SRMMessagePart> SRMChannelMapper;
typedef boost::shared_ptr<SRChannelMapper> SRChannelMapperPtr;
-typedef boost::shared_ptr<SRLChannelMapper> SRLChannelMapperPtr;
+typedef boost::shared_ptr<SRMChannelMapper> SRMChannelMapperPtr;
template <class T>
boost::shared_ptr<GeneralMapper<T> > GeneralMapper<T>::m_instance;
Modified: trunk/src/data/dfs_bmsc_graph_traverser.cpp
===================================================================
--- trunk/src/data/dfs_bmsc_graph_traverser.cpp 2008-12-29 10:15:52 UTC (rev 141)
+++ trunk/src/data/dfs_bmsc_graph_traverser.cpp 2008-12-29 15:49:54 UTC (rev 142)
@@ -209,10 +209,10 @@
m_reached_elements.push_back(MscElementPList());
}
-Color DFSBMscGraphTraverser::get_color(HMscNode* n)
+Color& DFSBMscGraphTraverser::get_color(HMscNode* n)
{
bool just_set;
- Color c = n->get_attribute<Color>(m_color_attribute,WHITE,just_set);
+ Color& c = n->get_attribute<Color>(m_color_attribute,WHITE,just_set);
if(just_set)
{
m_colored_nodes.back().push_back(n);
@@ -220,4 +220,10 @@
return c;
}
+void DFSBMscGraphTraverser::set_color(HMscNode* n, Color c)
+{
+ Color& col = get_color(n);
+ col = c;
+}
+
// $Id$
Modified: trunk/src/data/dfs_bmsc_graph_traverser.h
===================================================================
--- trunk/src/data/dfs_bmsc_graph_traverser.h 2008-12-29 10:15:52 UTC (rev 141)
+++ trunk/src/data/dfs_bmsc_graph_traverser.h 2008-12-29 15:49:54 UTC (rev 142)
@@ -425,17 +425,14 @@
/**
* Sets color attribute of e to c value .
*/
- void set_color(HMscNode* n, Color c)
- {
- n->set_attribute<Color>(m_color_attribute,c);
- }
+ void set_color(HMscNode* n, Color c);
/**
* Returns value of color attribute.
*
* If attribute isn't set it is set to default value WHITE.
*/
- Color get_color(HMscNode* n);
+ Color& get_color(HMscNode* n);
virtual void push_top_attributes();
Modified: trunk/src/data/dfs_refnode_hmsc_traverser.cpp
===================================================================
--- trunk/src/data/dfs_refnode_hmsc_traverser.cpp 2008-12-29 10:15:52 UTC (rev 141)
+++ trunk/src/data/dfs_refnode_hmsc_traverser.cpp 2008-12-29 15:49:54 UTC (rev 142)
@@ -32,4 +32,10 @@
return end_found;
}
+void DFSRefNodeHMscTraverser::cleanup_traversing_attributes()
+{
+ DFSBMscGraphTraverser::cleanup_traversing_attributes();
+ m_finder.cleanup_traversing_attributes();
+}
+
// $Id$
Modified: trunk/src/data/dfs_refnode_hmsc_traverser.h
===================================================================
--- trunk/src/data/dfs_refnode_hmsc_traverser.h 2008-12-29 10:15:52 UTC (rev 141)
+++ trunk/src/data/dfs_refnode_hmsc_traverser.h 2008-12-29 15:49:54 UTC (rev 142)
@@ -20,7 +20,7 @@
#define _DFS_REFNODE_HMSC_TRAVERSER_H
#include "data/dfs_bmsc_graph_traverser.h"
-#include "check/refnode_finder.h"
+#include "data/refnode_finder.h"
/**
@@ -30,12 +30,8 @@
* only edge of graph. I.e. user of this traverser and connected
* listeners to this traverser can suppose that HMsc is graph
* consisting of StartNodes, EndNodes and ReferenceNodes.
- * Moreover this traverser traverses each HMsc only one time.
*/
-class SCMSC_EXPORT DFSRefNodeHMscTraverser:
- public DFSBMscGraphTraverser,public WhiteNodeFoundListener,
- public GrayNodeFoundListener,public BlackNodeFoundListener,
- public NodeFinishedListener
+class SCMSC_EXPORT DFSRefNodeHMscTraverser:public DFSBMscGraphTraverser
{
protected:
Added: trunk/src/data/refnode_finder.cpp
===================================================================
--- trunk/src/data/refnode_finder.cpp (rev 0)
+++ trunk/src/data/refnode_finder.cpp 2008-12-29 15:49:54 UTC (rev 142)
@@ -0,0 +1,75 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2008 Jindra Babica <ba...@ma...>
+ *
+ * $Id$
+ */
+
+#include "data/refnode_finder.h"
+
+ReferenceNodeFinder::ReferenceNodeFinder(const std::string& color_attribute)
+ :DFSBMscGraphTraverser(color_attribute)
+{
+
+}
+
+bool ReferenceNodeFinder::traverse_node(HMscNode* node)
+{
+ m_reached_elements.back().push_back(node);
+ if(is_processed(node))
+ {
+ //return value is no more needed
+ return true;
+ }
+ white_node_found(node);
+ //traverse successors only if node is not ReferenceNode
+ if(!dynamic_cast<ReferenceNode*>(node))
+ {
+ if(dynamic_cast<ConnectionNode*>(node)||
+ dynamic_cast<StartNode*>(node))
+ {
+ traverse_successors(dynamic_cast<PredecessorNode*>(node));
+ }
+ //else node is supposed to be EndNode
+ }
+ node_finished(node);
+ //return value is no more needed
+ return true;
+}
+
+HMscNodePListPtr ReferenceNodeFinder::find_successors(HMscNode* node)
+{
+ HMscNodePListPtr successors(new HMscNodePList);
+ ReferenceNodeFinderListener l(successors.get());
+ add_white_node_found_listener(&l);
+ push_top_attributes();
+ set_color(node,GRAY); //set node to GRAY to avoid him to be traversed
+ m_reached_elements.back().push_back(node); //push him on top to simulate it was already traversed
+ PredecessorNode* pred = dynamic_cast<PredecessorNode*>(node);
+ if(pred)
+ {
+ traverse_successors(pred);
+ }
+ cleanup_traversing_attributes();
+ remove_white_node_found_listeners();
+ return successors;
+}
+
+HMscNodePListPtr ReferenceNodeFinder::successors(HMscNode* node, const std::string& color_attribute)
+{
+ ReferenceNodeFinder finder(color_attribute);
+ return finder.find_successors(node);
+}
+
+// $Id$
Property changes on: trunk/src/data/refnode_finder.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/src/data/refnode_finder.h
===================================================================
--- trunk/src/data/refnode_finder.h (rev 0)
+++ trunk/src/data/refnode_finder.h 2008-12-29 15:49:54 UTC (rev 142)
@@ -0,0 +1,99 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2008 Jindra Babica <ba...@ma...>
+ *
+ * $Id$
+ */
+
+#ifndef _REFNODE_FINDER_H
+#define _REFNODE_FINDER_H
+
+#include <list>
+#include "data/dfs_bmsc_graph_traverser.h"
+#include "check/pseudocode/export.h"
+
+typedef std::list<HMscNode*> HMscNodePList;
+typedef boost::shared_ptr<HMscNodePList> HMscNodePListPtr;
+
+class ReferenceNodeFinderListener:
+ public WhiteNodeFoundListener,public GrayNodeFoundListener
+{
+
+ HMscNodePList* m_successors;
+
+ void insert_successor(HMscNode* n)
+ {
+ //Don not insert the first one node and ConnectionNode
+ if(!dynamic_cast<ConnectionNode*>(n))
+ {
+ m_successors->push_back(n);
+ }
+ }
+
+public:
+
+ ReferenceNodeFinderListener(HMscNodePList* successors):
+ WhiteNodeFoundListener(),GrayNodeFoundListener(),
+ m_successors(successors)
+ {
+ }
+
+ void on_white_node_found(HMscNode* n)
+ {
+ insert_successor(n);
+ }
+
+ //HMscNode can be accessible from itself
+ void on_gray_node_found(HMscNode* n)
+ {
+ insert_successor(n);
+ }
+
+};
+
+/**
+ * \brief See method traverse(HMscNode* node) for purpose.
+ */
+class SCMSC_EXPORT ReferenceNodeFinder: public DFSBMscGraphTraverser
+{
+
+public:
+
+ ReferenceNodeFinder(const std::string& color_attribute = "rnf_color");
+
+ /**
+ * \brief Finds successors of node which aren't ConnectionNodes.
+ *
+ * Note that it is neccessary to call cleanup_traversing_attributes()
+ * in case you want to reuse this traverser while traversing HMsc.
+ */
+ HMscNodePListPtr find_successors(HMscNode* node);
+
+ /**
+ * \brief Creates ReferenceNodeFinder and returns result of find_successors
+ */
+ static HMscNodePListPtr successors(HMscNode* node, const std::string& color_attribute = "rnf_color");
+
+protected:
+
+ /**
+ * \brief Traverses from node to nearest StartNode,EndNodes or ReferenceNodes.
+ */
+ bool traverse_node(HMscNode* node);
+
+};
+
+#endif /* _REFNODE_FINDER_H */
+
+// $Id$
Property changes on: trunk/src/data/refnode_finder.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/tests/acyclic_checker_test.cpp
===================================================================
--- trunk/tests/acyclic_checker_test.cpp 2008-12-29 10:15:52 UTC (rev 141)
+++ trunk/tests/acyclic_checker_test.cpp 2008-12-29 15:49:54 UTC (rev 142)
@@ -60,7 +60,7 @@
{
AcyclicCheckerPtr checker = AcyclicChecker::instance();
SRChannelMapperPtr srm = SRChannelMapper::instance();
- SRLChannelMapperPtr srlm = SRLChannelMapper::instance();
+ SRMChannelMapperPtr srlm = SRMChannelMapper::instance();
return (print_result(checker->check(bmsc,srm),is_sr_fifo,"sender-receiver") &&
print_result(checker->check(bmsc,srlm),is_srl_fifo,"sender-receiver-label"));
}
Modified: trunk/tests/fifo_checker_test.cpp
===================================================================
--- trunk/tests/fifo_checker_test.cpp 2008-12-29 10:15:52 UTC (rev 141)
+++ trunk/tests/fifo_checker_test.cpp 2008-12-29 15:49:54 UTC (rev 142)
@@ -102,7 +102,7 @@
{
FifoCheckerPtr checker = FifoChecker::instance();
SRChannelMapperPtr srm = SRChannelMapper::instance();
- SRLChannelMapperPtr srlm = SRLChannelMapper::instance();
+ SRMChannelMapperPtr srlm = SRMChannelMapper::instance();
return (print_result(checker->check(bmsc,srm),is_sr_fifo,"sender-receiver") &&
print_result(checker->check(bmsc,srlm),is_srl_fifo,"sender-receiver-label"));
}
Modified: trunk/tests/race_checker_test.cpp
===================================================================
--- trunk/tests/race_checker_test.cpp 2008-12-29 10:15:52 UTC (rev 141)
+++ trunk/tests/race_checker_test.cpp 2008-12-29 15:49:54 UTC (rev 142)
@@ -60,7 +60,7 @@
{
static RaceChecker ch;
SRChannelMapperPtr srm = SRChannelMapper::instance();
- SRLChannelMapperPtr srlm = SRLChannelMapper::instance();
+ SRMChannelMapperPtr srlm = SRMChannelMapper::instance();
bool result = (print_result(ch.check(hmsc,srm),is_sr_race_free,"sender-receiver") &&
print_result(ch.check(hmsc,srlm),is_srl_race_free,"sender-receiver-label"));
return result;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|