|
From: <ba...@us...> - 2009-04-26 19:48:13
|
Revision: 231
http://scstudio.svn.sourceforge.net/scstudio/?rev=231&view=rev
Author: babicaj
Date: 2009-04-26 19:48:01 +0000 (Sun, 26 Apr 2009)
Log Message:
-----------
LivelockChecker bug fixed
Modified Paths:
--------------
trunk/src/check/liveness/livelock_checker.cpp
trunk/src/check/liveness/livelock_checker.h
trunk/src/data/dfsb_hmsc_traverser.cpp
trunk/src/data/dfsb_hmsc_traverser.h
trunk/tests/livelock_checker_test.cpp
Modified: trunk/src/check/liveness/livelock_checker.cpp
===================================================================
--- trunk/src/check/liveness/livelock_checker.cpp 2009-04-26 19:30:44 UTC (rev 230)
+++ trunk/src/check/liveness/livelock_checker.cpp 2009-04-26 19:48:01 UTC (rev 231)
@@ -24,44 +24,23 @@
LivelockCheckerPtr LivelockChecker::m_instance;
-LivelockReachableMarker::LivelockReachableMarker(LivelockListener* ll):
- m_ll(ll)
+LivelockMarker::LivelockMarker(WhiteNodeMarker *marker):
+m_traverser("LLM_color")
{
+ m_traverser.add_white_node_found_listener(marker);
}
-void LivelockReachableMarker::on_white_node_found(HMscNode* n)
+void LivelockMarker::on_white_node_found(HMscNode *n)
{
- bool& reachable = m_ll->get_reachable(n);
- reachable = true;
-}
-
-LivelockListener::LivelockListener()
-{
- m_marker = LivelockReachableMarker(this);
- m_traverser = DFSBHMscTraverser("LL_color");
- m_traverser.add_white_node_found_listener(&m_marker);
-}
-
-void LivelockListener::mark_reachable(HMscNode* node)
-{
- m_traverser.traverse(node);
-}
-
-void LivelockListener::cleanup_attributes(){
- while(!m_marked_elements.empty())
+ if(dynamic_cast<EndNode*>(n))
{
- HMscNode* p = m_marked_elements.back();
- p->remove_attribute<bool>(ATTRIBUTE_REACHABLE);
- m_marked_elements.pop_back();
+ m_traverser.traverse(n,false);
}
}
-void LivelockListener::on_white_node_found(HMscNode* node)
+LivelockListener::LivelockListener(WhiteNodeMarker *marker):
+m_marker(marker)
{
- if(dynamic_cast<EndNode*>(node))
- {
- mark_reachable(node);
- }
}
void LivelockListener::on_gray_node_found(HMscNode* n)
@@ -73,18 +52,11 @@
LivelockListener::~LivelockListener()
{
- cleanup_attributes();
}
-bool& LivelockListener::get_reachable(HMscNode* node)
+bool LivelockListener::get_reachable(HMscNode* node)
{
- bool just_set;
- bool& reachable = node->get_attribute<bool>(ATTRIBUTE_REACHABLE,false,just_set);
- if(just_set)
- {
- m_marked_elements.push_back(node);
- }
- return reachable;
+ return m_marker->get_mark(node);
}
Checker::PreconditionList LivelockChecker::get_preconditions(MscPtr msc) const
@@ -97,9 +69,15 @@
HMscPtr LivelockChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
{
HMscPtr p;
+ //mark nodes that path to EndNode exists from
+ DFSHMscTraverser hmsc_traverser("M_color");
+ WhiteNodeMarker marker;
+ LivelockMarker livelock_marker(&marker);
+ hmsc_traverser.add_white_node_found_listener(&livelock_marker);
+ hmsc_traverser.traverse(hmsc);
+ //check cycles of non-marked nodes
DFSRefNodeHMscTraverser traverser("LC_color");
- LivelockListener listener;
- traverser.add_white_node_found_listener(&listener);
+ LivelockListener listener(&marker);
traverser.add_gray_node_found_listener(&listener);
try
{
Modified: trunk/src/check/liveness/livelock_checker.h
===================================================================
--- trunk/src/check/liveness/livelock_checker.h 2009-04-26 19:30:44 UTC (rev 230)
+++ trunk/src/check/liveness/livelock_checker.h 2009-04-26 19:48:01 UTC (rev 231)
@@ -21,6 +21,7 @@
#include "data/dfs_hmsc_traverser.h"
#include "data/dfsb_hmsc_traverser.h"
#include "check/liveness/export.h"
+#include "check/pseudocode/utils.h"
#include <string>
#include <stack>
@@ -47,44 +48,35 @@
}
};
-class LivelockReachableMarker:public WhiteNodeFoundListener
+class LivelockMarker:public WhiteNodeFoundListener
{
+private:
- LivelockListener* m_ll;
+ WhiteNodeMarker *m_marker;
+ DFSBHMscTraverser m_traverser;
public:
- LivelockReachableMarker(LivelockListener* ll=NULL);
+ LivelockMarker(WhiteNodeMarker *marker);
- void on_white_node_found(HMscNode* n);
-
+ void on_white_node_found(HMscNode *n);
};
-class LivelockListener:public WhiteNodeFoundListener, public GrayNodeFoundListener
+class LivelockListener:public GrayNodeFoundListener
{
private:
-
- HMscNodePList m_marked_elements;
- LivelockReachableMarker m_marker;
-
- DFSBHMscTraverser m_traverser;
-
- void mark_reachable(HMscNode* node);
-
- void cleanup_attributes();
+ WhiteNodeMarker *m_marker;
public:
- LivelockListener();
+ LivelockListener(WhiteNodeMarker *marker);
~LivelockListener();
- void on_white_node_found(HMscNode* node);
-
virtual void on_gray_node_found(HMscNode* n);
- bool& get_reachable(HMscNode* node);
+ bool get_reachable(HMscNode* node);
};
Modified: trunk/src/data/dfsb_hmsc_traverser.cpp
===================================================================
--- trunk/src/data/dfsb_hmsc_traverser.cpp 2009-04-26 19:30:44 UTC (rev 230)
+++ trunk/src/data/dfsb_hmsc_traverser.cpp 2009-04-26 19:48:01 UTC (rev 231)
@@ -39,10 +39,13 @@
cleanup_traversing_attributes();
}
-void DFSBHMscTraverser::traverse(HMscNode* node)
+void DFSBHMscTraverser::traverse(HMscNode* node, bool cleanup)
{
traverse_node(node);
- cleanup_traversing_attributes();
+ if(cleanup)
+ {
+ cleanup_traversing_attributes();
+ }
}
bool DFSBHMscTraverser::traverse_node(HMscNode* node)
Modified: trunk/src/data/dfsb_hmsc_traverser.h
===================================================================
--- trunk/src/data/dfsb_hmsc_traverser.h 2009-04-26 19:30:44 UTC (rev 230)
+++ trunk/src/data/dfsb_hmsc_traverser.h 2009-04-26 19:48:01 UTC (rev 231)
@@ -52,7 +52,7 @@
*/
virtual void traverse(HMscPtr hmsc);
- virtual void traverse(HMscNode* node);
+ virtual void traverse(HMscNode* node, bool cleanup=true);
/**
* Cleans up traversing attributes
Modified: trunk/tests/livelock_checker_test.cpp
===================================================================
--- trunk/tests/livelock_checker_test.cpp 2009-04-26 19:30:44 UTC (rev 230)
+++ trunk/tests/livelock_checker_test.cpp 2009-04-26 19:48:01 UTC (rev 231)
@@ -3,8 +3,11 @@
#include <string>
#include <iostream>
-int main() {
- std::cout << "Test of livelock: " << std::endl;
+#define RETURN_IF_FAILED(test) if(!(test)) return 1;
+
+bool TestA()
+{
+ std::cout << "Test of livelock A: " << std::endl;
std::cout << "h1: h2: " << std::endl;
std::cout << " start start " << std::endl;
std::cout << " | | " << std::endl;
@@ -51,10 +54,85 @@
if(path_h1.get())
{
std::cerr << "OK: h1 contains livelock" << std::endl;
- return 0;
+ return true;
}
std::cerr << "ERROR: h1 doesn't contain livelock" << std::endl;
- return 1;
+ return false;
}
+bool TestB()
+{
+ std::cout << "Test of livelock B:" << std::endl;
+ std::cout << " start " << std::endl;
+ std::cout << " | " << std::endl;
+ std::cout << " p2 = p1 " << std::endl;
+ std::cout << " \\ " << std::endl;
+ std::cout << " end " << std::endl;
+
+ HMscPtr h1(new HMsc("h1"));
+
+ StartNodePtr start1 = new StartNode(); h1->set_start(start1);
+ EndNodePtr end1(new EndNode);h1->add_node(end1);
+ ReferenceNodePtr p1(new ReferenceNode());h1->add_node(p1);
+ ReferenceNodePtr p2(new ReferenceNode());h1->add_node(p2);
+
+ start1->add_successor(p1.get());
+ p1->add_successor(p2.get());
+ p1->add_successor(end1.get());
+ p2->add_successor(p1.get());
+
+ ChannelMapperPtr chm;
+ LivelockCheckerPtr live = LivelockChecker::instance();
+
+ HMscPtr path_h1 = live->check(h1,chm);
+ if(path_h1.get())
+ {
+ std::cerr << "ERROR: h1 contains livelock" << std::endl;
+ return false;
+ }
+ std::cerr << "OK: h1 doesn't contain livelock" << std::endl;
+ return true;
+}
+
+bool TestC()
+{
+ std::cout << "Test of livelock C:" << std::endl;
+ std::cout << " start " << std::endl;
+ std::cout << " | " << std::endl;
+ std::cout << " p2 = p1 " << std::endl;
+ std::cout << " \\ " << std::endl;
+ std::cout << " end " << std::endl;
+
+ HMscPtr h1(new HMsc("h1"));
+
+ StartNodePtr start1 = new StartNode(); h1->set_start(start1);
+ EndNodePtr end1(new EndNode);h1->add_node(end1);
+ ReferenceNodePtr p1(new ReferenceNode());h1->add_node(p1);
+ ReferenceNodePtr p2(new ReferenceNode());h1->add_node(p2);
+
+ start1->add_successor(p1.get());
+ p1->add_successor(end1.get());
+ p1->add_successor(p2.get());
+ p2->add_successor(p1.get());
+
+ ChannelMapperPtr chm;
+ LivelockCheckerPtr live = LivelockChecker::instance();
+
+ HMscPtr path_h1 = live->check(h1,chm);
+ if(path_h1.get())
+ {
+ std::cerr << "ERROR: h1 contains livelock" << std::endl;
+ return false;
+ }
+ std::cerr << "OK: h1 doesn't contain livelock" << std::endl;
+ return true;
+}
+
+int main() {
+ RETURN_IF_FAILED(TestA());
+ RETURN_IF_FAILED(TestB());
+ RETURN_IF_FAILED(TestC());
+ return 0;
+}
+
// $Id$
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|