|
From: <ba...@us...> - 2008-07-27 09:20:15
|
Revision: 103
http://scstudio.svn.sourceforge.net/scstudio/?rev=103&view=rev
Author: babicaj
Date: 2008-07-27 09:20:07 +0000 (Sun, 27 Jul 2008)
Log Message:
-----------
HMsc now supports connections nodes, few bugs were found and corrected. DotWriter as same as livelock_checker needs to be rewritten to follow changes in structure of HMsc.
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/src/check/CMakeLists.txt
trunk/src/check/bmsc_race_checker.cpp
trunk/src/check/deadlock_checker.cpp
trunk/src/check/deadlock_checker.h
trunk/src/check/dfs_events_traverser.cpp
trunk/src/check/dfs_events_traverser.h
trunk/src/check/dfs_hmsc_traverser.cpp
trunk/src/check/dfs_hmsc_traverser.h
trunk/src/check/dfs_instance_events_traverser.cpp
trunk/src/check/dfs_instance_events_traverser.h
trunk/src/data/Z120/CMakeLists.txt
trunk/src/data/msc.cpp
trunk/src/data/msc.h
trunk/tests/CMakeLists.txt
Added Paths:
-----------
trunk/src/check/dfs_bmsc_graph_traverser.cpp
trunk/src/check/dfs_bmsc_graph_traverser.h
Removed Paths:
-------------
trunk/src/check/dfs_msc_graph_traverser.cpp
trunk/src/check/dfs_msc_graph_traverser.h
trunk/src/check/instance_vis_cls_init.cpp
trunk/src/check/instance_vis_cls_init.h
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2008-07-16 07:16:36 UTC (rev 102)
+++ trunk/CMakeLists.txt 2008-07-27 09:20:07 UTC (rev 103)
@@ -3,7 +3,7 @@
# cmake . -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/local
PROJECT(scstudio C CXX)
-# SET(CMAKE_VERBOSE_MAKEFILE ON)
+#SET(CMAKE_VERBOSE_MAKEFILE ON)
INCLUDE_DIRECTORIES(src)
ADD_SUBDIRECTORY(src .)
Modified: trunk/src/check/CMakeLists.txt
===================================================================
--- trunk/src/check/CMakeLists.txt 2008-07-16 07:16:36 UTC (rev 102)
+++ trunk/src/check/CMakeLists.txt 2008-07-27 09:20:07 UTC (rev 103)
@@ -1,13 +1,17 @@
-ADD_LIBRARY(acyclic_checker STATIC acyclic_checker.cpp)
-ADD_LIBRARY(bmsc_race_checker STATIC bmsc_race_checker.cpp)
-ADD_LIBRARY(causal_closure_initiator STATIC causal_closure_initiator.cpp)
-ADD_LIBRARY(deadlock_checker STATIC deadlock_checker.cpp)
+#traversers
ADD_LIBRARY(dfs_area_traverser STATIC dfs_area_traverser.cpp)
ADD_LIBRARY(dfs_events_traverser STATIC dfs_events_traverser.cpp)
ADD_LIBRARY(dfs_hmsc_traverser STATIC dfs_hmsc_traverser.cpp)
ADD_LIBRARY(dfs_instance_events_traverser STATIC dfs_instance_events_traverser.cpp)
-ADD_LIBRARY(dfs_msc_graph_traverser STATIC dfs_msc_graph_traverser.cpp)
+ADD_LIBRARY(dfs_bmsc_graph_traverser STATIC dfs_bmsc_graph_traverser.cpp)
+
+#order relation
+ADD_LIBRARY(causal_closure_initiator STATIC causal_closure_initiator.cpp)
+ADD_LIBRARY(visual_closure_initiator STATIC visual_closure_initiator.cpp)
+
+#checkers
+ADD_LIBRARY(acyclic_checker STATIC acyclic_checker.cpp)
+ADD_LIBRARY(deadlock_checker STATIC deadlock_checker.cpp)
ADD_LIBRARY(fifo_checker STATIC fifo_checker.cpp)
-#ADD_LIBRARY(instance_vis_cls_init STATIC instance_vis_cls_init.cpp)
-ADD_LIBRARY(livelock_checker STATIC livelock_checker.cpp)
-ADD_LIBRARY(visual_closure_initiator STATIC visual_closure_initiator.cpp)
+#ADD_LIBRARY(livelock_checker STATIC livelock_checker.cpp)
+#ADD_LIBRARY(race_checker STATIC race_checker.cpp)
Modified: trunk/src/check/bmsc_race_checker.cpp
===================================================================
--- trunk/src/check/bmsc_race_checker.cpp 2008-07-16 07:16:36 UTC (rev 102)
+++ trunk/src/check/bmsc_race_checker.cpp 2008-07-27 09:20:07 UTC (rev 103)
@@ -18,7 +18,64 @@
#include "check/bmsc_race_checker.h"
-const std::string BMscRaceChecker::m_instance_events_attribute = "brc_instance_events";
+void MinimalEventsInitiator::on_white_node_found(ReferenceNode* node)
+{
+ BMscPtr b = node->get_bmsc();
+ const InstancePtrList& instances = b->get_instances();
+ //compute minimal Events of Instances
+ EventPList minimal_events;
+ InstancePtrList::const_iterator i;
+ for(i=instances.begin();i!=instances.end();i++)
+ {
+ EventPList* events = DFSInstanceEventsTraverser::topology_order(*i);
+ EventPList::const_iterator e1 = events->begin();
+ while(e1!=events->end())
+ {
+ EventPList::const_iterator e2 = events->begin();
+ while(e2!=events->end())
+ {
+ if(e1!=e2)
+ {
+ Event* e = *e2;
+ BoolVector& e2_causal = m_caus_initiator->get_causal_closure(*e2);
+ size_t e1_index = m_vis_initiator->get_topology_index(*e1);
+ //e2<<e1 => e1 isn't minimal
+ if(e2_causal[e1_index]) break;
+ }
+ e2++;
+ }
+ //'while loop' hasn't found any Event e2 to be less than e1
+ if(e2==events.end())
+ minimal_events.push_back(*e1);
+ e1++;
+ }
+ delete events;
+ }
+ /*
+ For the minimal_events find Instances containing less Events.
+ Note that if there exists any less Event e1 at Instance i, e1 must be grater
+ or equal to some Event e2 in minimal_events, therefore we will use only
+ minimal_events to seek.
+ */
+ EventPList::const_iterator e;
+ ExtremeEvents& extreme_events = get_minimal_events(b.get());
+ for(e=minimal_events.begin();e!=minimal_events.end();e++)
+ {
+ EventDependentInstances e_instances(*e,m_instance_marker.get_count());
+ size_t e_index = m_vis_initiator->get_topology_index(*e);
+ EventPList::const_iterator f;
+ for(f=minimal_events.begin();f!=minimal_events.end();f++)
+ {
+ //if f is less than e then Instance of f must be inserted
+ BoolVector& closure = m_caus_initiator->get_causal_closure(*f);
+ if(closure[e_index])
+ e_instances.set_dependent(
+ m_instance_marker->get_id((*f)->get_instance()));
+ }
+ extreme_events.add_extreme_event(e_instances);
+ }
+ m_modified_bmscs.push_back(b.get());
+}
BMsc* BMscRaceChecker::create_counter_example(Event* e1, Event* e2)
{
@@ -70,35 +127,36 @@
BMscPtr BMscRaceChecker::check(BMscPtr bmsc, ChannelMapperPtr mapper)
{
DFSEventsTraverser traverser;
+ TopologicalOrderListener topology_listener;
traverser.add_event_finished_listener(this);
traverser.traverse(bmsc);
EventPVector topology(
- get_topology().begin(),
- get_topology().end()
+ topology_listener.get_topology().begin(),
+ topology_listener.get_topology().end()
);
m_visual_initiator.initialize(topology);
m_causal_initiator.initialize(topology,m_visual_initiator,mapper);
- BMscPtr result;
+ OrderCheckerListener order_checker_listener(&m_visual_initiator);
+ DFSInstanceEventsTraverser instance_traverser;
for(size_t i = 0; i < topology.size(); i++)
{
- size_t i_index = m_visual_initiator.get_topology_index(topology[i]);
- BoolVector& i_visual = m_visual_initiator.get_visual_closure(topology[i]);
- BoolVector& i_causal = m_causal_initiator.get_causal_closure(topology[i]);
- EventPList& instance_events = get_instance_events(topology[i]->get_instance());
- EventPList::iterator j;
- for(j=instance_events.begin(); j!=instance_events.end(); j++)
+ //in this block checkout whether there is any Event in race with topology[i]
+ order_checker_listener.reset(
+ topology[i],
+ &m_visual_initiator.get_visual_closure(topology[i]),
+ &m_causal_initiator.get_causal_closure(topology[i]));
+ try
{
- size_t j_index = m_visual_initiator.get_topology_index(*j);
- if(i_visual[j_index] && !i_causal[j_index])
- {
- result = create_counter_example(topology[i_index],topology[j_index]);
- cleanup_attributes();
- return result;
- }
+ instance_traverser.traverse(topology[i]->get_instance());
+ instance_traverser.cleanup_traversing_attributes();
}
+ catch(EventRaceException& e)
+ {
+ instance_traverser.cleanup_traversing_attributes();
+ return create_counter_example(topology[i],e->get_event());
+ }
}
- cleanup_attributes();
- return result;
+ return BMscPtr();
}
void BMscRaceChecker::cleanup_attributes()
Modified: trunk/src/check/deadlock_checker.cpp
===================================================================
--- trunk/src/check/deadlock_checker.cpp 2008-07-16 07:16:36 UTC (rev 102)
+++ trunk/src/check/deadlock_checker.cpp 2008-07-27 09:20:07 UTC (rev 103)
@@ -18,86 +18,59 @@
#include "check/deadlock_checker.h"
-const std::string DeadlockChecker::visited_attribute = "deadlock_visited";
-const std::string DeadlockChecker::checked_attribute = "deadlock_checked";
DeadlockCheckerPtr DeadlockChecker::m_instance;
-
-ReferenceNode* DeadlockChecker::check_deadlock_free_visit(ReferenceNode* node){
- ReferenceNode* p = new ReferenceNode(node);
- set_visited(node);
- //search current node if it contains HMsc
- HMscPtr h = node->get_hmsc();
- if(h.get() && !get_checked(h)){
- HMscPtr inner = check_deadlock_free(h);
- if(inner.get()){
- p->set_msc(inner);
- return p;
- }
- }
- ReferenceNodePSet::const_iterator succ;
- const ReferenceNodePSet& successors = node->get_successors();
- if(successors.size()==0 && !node->is_end_node())
+HMscPtr DeadlockChecker::create_counter_example(const InnerNodePListList& path)
+{
+ InnerNodePListList::const_iterator hmscs_it;
+ HMscPtr result;
+ for(hmscs_it=path.begin();hmscs_it!=path.end();hmscs_it++)
{
- return p;
- }
- for(succ = successors.begin();succ != successors.end();++succ)
- {
- if(!get_visited(*succ))
+ HMscPtr current_hmsc;
+ InnerNode* last_node = NULL;
+ InnerNodePList::const_iterator nodes_it;
+ for(nodes_it=hmscs_it->begin();nodes_it!=hmscs_it->end();nodes_it++)
{
- ReferenceNode* succ_node = check_deadlock_free_visit(*succ);
- if(succ_node!=NULL)
+ if(last_node==NULL)
{
- p->add_successor(succ_node);
- return p;
+ if(dynamic_cast<ReferenceNode*>(*nodes_it)!=NULL)
+ last_node = new ReferenceNode((ReferenceNode*)*nodes_it);
+ else
+ last_node = new ConnectionNode((ConnectionNode*)*nodes_it);
+ current_hmsc = new HMsc((*nodes_it)->get_owner());
+ current_hmsc->get_start()->add_successor(last_node);
+ if(!result.get())
+ result = current_hmsc;
}
+ else
+ {
+ last_node->add_successor(*nodes_it);
+ last_node = *nodes_it;
+ }
}
}
- delete p;
- return NULL;
+ return result;
}
-HMscPtr DeadlockChecker::check_deadlock_free(HMscPtr hmsc)
-{
- set_checked(hmsc);
- ReferenceNodePSet::const_iterator node;
- const ReferenceNodePSet& successors = hmsc->get_start()->get_successors();
- for(node = successors.begin();node!=successors.end();++node){
- if(!get_visited(*node)){
- ReferenceNode* n = check_deadlock_free_visit(*node);
- if(n!=NULL)
- {
- HMscPtr h(new HMsc);
- h->set_original(hmsc.get());
- h->get_start()->add_successor(n);
- return h;
- }
- }
- }
- HMscPtr p;
- return p;
-}
-
HMscPtr DeadlockChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
{
//this will be used do show eventual counterexample
- HMscPtr p = check_deadlock_free(hmsc);
- cleanup_attributes();
+ HMscPtr p;
+ DeadlockListener listener;
+ DFSHMscTraverser traverser;
+ traverser.add_white_node_found_listener(&listener);
+ try
+ {
+ traverser.traverse(hmsc);
+ }
+ catch(DeadlockException& e)
+ {
+ p = create_counter_example(traverser.get_reached_nodes());
+ traverser.cleanup_traversing_attributes();
+ }
return p;
}
void DeadlockChecker::cleanup_attributes()
{
- while(!checked_elements.empty())
- {
- HMscPtr p = checked_elements.top();
- p->remove_attribute<bool>(checked_attribute);
- checked_elements.pop();
- }
- while(!visited_elements.empty())
- {
- ReferenceNode* p = visited_elements.top();
- p->remove_attribute<bool>(visited_attribute);
- visited_elements.pop();
- }
}
Modified: trunk/src/check/deadlock_checker.h
===================================================================
--- trunk/src/check/deadlock_checker.h 2008-07-16 07:16:36 UTC (rev 102)
+++ trunk/src/check/deadlock_checker.h 2008-07-27 09:20:07 UTC (rev 103)
@@ -16,93 +16,56 @@
* $Id$
*/
+#include <string>
+#include <stack>
+#include <exception>
+
#include "check/checker.h"
#include "data/msc.h"
#include "data/counted_ptr.h"
-#include <string>
-#include <stack>
+#include "check/dfs_hmsc_traverser.h"
class DeadlockChecker;
typedef counted_ptr<DeadlockChecker> DeadlockCheckerPtr;
-class DeadlockChecker: public HMscChecker
+class DeadlockException:public std::exception
{
-protected:
+public:
- /**
- * Common instance.
- */
- static DeadlockCheckerPtr m_instance;
-
- DeadlockChecker(){};
-
- /**
- * Visited attribute name.
- */
- static const std::string visited_attribute;
-
- /**
- * Checked attribute name.
- */
- static const std::string checked_attribute;
-
- /**
- * Setter for visited attribute.
- */
- void set_visited(ReferenceNode* node)
+ const char* what()
{
- node->set_attribute<bool>(visited_attribute, true);
- visited_elements.push(node);
+ return "There was found deadlock in HMsc";
}
+};
- /**
- * Setter for checked attribute.
- */
- void set_checked(HMscPtr h)
- {
- h->set_attribute<bool>(checked_attribute,true);
- checked_elements.push(h);
- }
+class DeadlockListener:public WhiteRefNodeFoundListener
+{
+public:
- /**
- * Getter for visited attribute.
- *
- * This method isn't public due to missing control of cleaning this attribute.
- */
- bool get_visited(ReferenceNode* node)
+ void on_white_node_found(ReferenceNode* node)
{
- return node->get_attribute<bool>(visited_attribute, false);
+ if(!node->is_end_node() && !node->has_successors())
+ {
+ throw DeadlockException();
+ }
}
+};
- /**
- * Getter for checked attribute.
- *
- * This method isn't public due to missing control of cleaning this attribute.
- */
- bool get_checked(HMscPtr h)
- {
- return h->get_attribute<bool>(checked_attribute,false);
- }
+class DeadlockChecker: public HMscChecker
+{
+protected:
+
/**
- * Container for elements with set visited attribute.
- *
- * Used for cleaning up these attributes.
+ * Common instance.
*/
- std::stack<ReferenceNode*> visited_elements;
-
- /**
- * Container for elements with set checked attribute.
- *
- * Used for cleaning up these attributes.
- */
- std::stack<HMscPtr> checked_elements;
+ static DeadlockCheckerPtr m_instance;
- ReferenceNode* check_deadlock_free_visit(ReferenceNode* node);
+ DeadlockChecker(){};
- HMscPtr check_deadlock_free(HMscPtr hmsc);
+ HMscPtr create_counter_example(const InnerNodePListList& path);
public:
Copied: trunk/src/check/dfs_bmsc_graph_traverser.cpp (from rev 98, trunk/src/check/dfs_msc_graph_traverser.cpp)
===================================================================
--- trunk/src/check/dfs_bmsc_graph_traverser.cpp (rev 0)
+++ trunk/src/check/dfs_bmsc_graph_traverser.cpp 2008-07-27 09:20:07 UTC (rev 103)
@@ -0,0 +1,138 @@
+/*
+ * 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 <stack>
+
+#include "check/dfs_bmsc_graph_traverser.h"
+
+DFSBMscGraphTraverser::~DFSBMscGraphTraverser()
+{
+ cleanup_traversing_attributes();
+}
+
+void DFSBMscGraphTraverser::traverse(HMscPtr hmsc)
+{
+ m_colored_nodes.push_back(InnerNodePList());
+ traverse_successors(hmsc->get_start()->get_successors());
+ cleanup_traversing_attributes();
+}
+
+bool DFSBMscGraphTraverser::traverse_node(InnerNode* node)
+{
+ Color c = get_color(node);
+ if(c==BLACK)
+ {
+ black_node_found(node);
+ return false;
+ }
+ if(c==GRAY)
+ {
+ gray_node_found(node);
+ return false;
+ }
+ white_node_found(node);
+ ReferenceNode* ref_node = dynamic_cast<ReferenceNode*>(node);
+ if(ref_node!=NULL)
+ {
+ HMscPtr hmsc = ref_node->get_hmsc();
+ if(hmsc.get()!=NULL)
+ {
+ m_reached_nodes.push_back(InnerNodePList());
+ //this line ensures (yet another one) that HMsc will be traversed as many times
+ //as it is referenced
+ m_colored_nodes.push_back(InnerNodePList());
+ //node's successors aren't traversed if end node wasn't found in hmsc
+ return traverse_successors(hmsc->get_start()->get_successors()) &&
+ (traverse_successors(node->get_successors()) || ref_node->is_end_node());
+ //this line ensures (yet another one) that HMsc will traversed as many times
+ //as it is referenced
+ cleanup_top_attributes();
+ m_reached_nodes.pop_back();
+ }
+ }
+ bool ending_successors = traverse_successors(node->get_successors());
+ node_finished(node);
+ return ending_successors || (ref_node!=NULL && ref_node->is_end_node());
+}
+
+bool DFSBMscGraphTraverser::traverse_successors(const InnerNodePSet& successors)
+{
+ bool end_found = false;
+ InnerNodePSet::const_iterator successor;
+ for(successor=successors.begin();successor!=successors.end();successor++)
+ {
+ end_found = traverse_node(*successor) || end_found;
+ }
+ return end_found;
+}
+
+void DFSBMscGraphTraverser::cleanup_top_attributes()
+{
+ InnerNodePList& top = m_colored_nodes.back();
+ InnerNodePList::iterator event;
+ for(event=top.begin();event!=top.end();event++)
+ (*event)->remove_attribute<Color>(m_color_attribute);
+ m_colored_nodes.pop_back();
+}
+
+void DFSBMscGraphTraverser::cleanup_traversing_attributes()
+{
+ while(!m_colored_nodes.empty())
+ {
+ cleanup_top_attributes();
+ }
+ while(!m_reached_nodes.empty())
+ {
+ m_reached_nodes.pop_back();
+ }
+
+}
+
+void DFSBMscGraphTraverser::white_node_found(InnerNode* n)
+{
+ m_reached_nodes.back().push_back(n);
+ WhiteNodeFoundListenerPList::iterator l;
+ for(l=m_white_node_found_listeners.begin();l!=m_white_node_found_listeners.end();l++)
+ (*l)->on_white_node_found(n);
+ set_color(n,GRAY);
+ m_colored_nodes.back().push_back(n);
+}
+
+void DFSBMscGraphTraverser::gray_node_found(InnerNode* n)
+{
+ GrayNodeFoundListenerPList::iterator l;
+ for(l=m_gray_node_found_listeners.begin();l!=m_gray_node_found_listeners.end();l++)
+ (*l)->on_gray_node_found(n);
+}
+
+void DFSBMscGraphTraverser::black_node_found(InnerNode* n)
+{
+ BlackNodeFoundListenerPList::iterator l;
+ for(l=m_black_node_found_listeners.begin();l!=m_black_node_found_listeners.end();l++)
+ (*l)->on_black_node_found(n);
+}
+
+void DFSBMscGraphTraverser::node_finished(InnerNode* n)
+{
+ NodeFinishedListenerPList::iterator l;
+ for(l=m_node_finished_listeners.begin();l!=m_node_finished_listeners.end();l++)
+ (*l)->on_node_finished(n);
+ m_reached_nodes.back().pop_back();
+ set_color(n,BLACK);
+}
+
Copied: trunk/src/check/dfs_bmsc_graph_traverser.h (from rev 98, trunk/src/check/dfs_msc_graph_traverser.h)
===================================================================
--- trunk/src/check/dfs_bmsc_graph_traverser.h (rev 0)
+++ trunk/src/check/dfs_bmsc_graph_traverser.h 2008-07-27 09:20:07 UTC (rev 103)
@@ -0,0 +1,425 @@
+/*
+ * 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 _DFS_MSC_GRAPH_TRAVERSER_H
+#define _DFS_MSC_GRAPH_TRAVERSER_H
+
+#include<stack>
+
+#include "data/msc.h"
+#include "check/checker.h"
+
+typedef std::list<InnerNode*> InnerNodePList;
+typedef std::list<InnerNodePList> InnerNodePListList;
+
+/**
+ * Listener of founded white InnerNode
+ */
+class WhiteNodeFoundListener
+{
+public:
+
+ virtual ~WhiteNodeFoundListener()
+ {
+
+ }
+
+ virtual void on_white_node_found(InnerNode* n)=0;
+};
+
+/**
+ * Listener of founded gray InnerNode
+ */
+class GrayNodeFoundListener
+{
+public:
+
+ virtual ~GrayNodeFoundListener()
+ {
+
+ }
+
+ virtual void on_gray_node_found(InnerNode* n)=0;
+};
+
+/**
+ * Listener of founded black InnerNode
+ */
+class BlackNodeFoundListener
+{
+public:
+
+ virtual ~BlackNodeFoundListener()
+ {
+
+ }
+
+ virtual void on_black_node_found(InnerNode* n)=0;
+};
+
+/**
+ * Listener of finished InnerNode
+ */
+class NodeFinishedListener
+{
+public:
+
+ virtual ~NodeFinishedListener()
+ {
+
+ }
+
+ virtual void on_node_finished(InnerNode* node)=0;
+};
+
+/**
+ * Auxiliary listener of founded white InnerNode.
+ *
+ * Extend this listener to process only ReferenceNodes during traversing.
+ */
+class WhiteRefNodeFoundListener:public WhiteNodeFoundListener
+{
+public:
+
+ virtual ~WhiteRefNodeFoundListener()
+ {
+
+ }
+
+ virtual void on_white_node_found(InnerNode* n){
+ ReferenceNode* ref = dynamic_cast<ReferenceNode*>(n);
+ if(ref!=NULL)
+ {
+ on_white_node_found(ref);
+ }
+ }
+
+ virtual void on_white_node_found(ReferenceNode* n)=0;
+};
+
+/**
+ * Auxiliary listener of founded gray InnerNode.
+ *
+ * Extend this listener to process only ReferenceNodes during traversing.
+ */
+class GrayRefNodeFoundListener:public GrayNodeFoundListener
+{
+public:
+
+ virtual ~GrayRefNodeFoundListener()
+ {
+
+ }
+
+ virtual void on_gray_node_found(InnerNode* n){
+ ReferenceNode* ref = dynamic_cast<ReferenceNode*>(n);
+ if(ref!=NULL)
+ {
+ on_gray_node_found(ref);
+ }
+ }
+
+ virtual void on_gray_node_found(ReferenceNode* n)=0;
+};
+
+/**
+ * Auxiliary listener of founded black InnerNode.
+ *
+ * Extend this listener to process only ReferenceNodes during traversing.
+ */
+class BlackRefNodeFoundListener:public BlackNodeFoundListener
+{
+public:
+
+ virtual ~BlackRefNodeFoundListener()
+ {
+
+ }
+
+ virtual void on_black_node_found(InnerNode* n){
+ ReferenceNode* ref = dynamic_cast<ReferenceNode*>(n);
+ if(ref!=NULL)
+ {
+ on_black_node_found(ref);
+ }
+ }
+
+ virtual void on_black_node_found(ReferenceNode* n)=0;
+};
+
+/**
+ * Auxiliary listener of finished InnerNode.
+ *
+ * Extend this listener to process only ReferenceNodes during traversing.
+ */
+class RefNodeFinishedListener:public NodeFinishedListener
+{
+public:
+
+ virtual ~RefNodeFinishedListener()
+ {
+
+ }
+
+ virtual void on_node_finished(InnerNode* n){
+ ReferenceNode* ref = dynamic_cast<ReferenceNode*>(n);
+ if(ref!=NULL)
+ {
+ on_node_finished(ref);
+ }
+ }
+
+ virtual void on_node_finished(ReferenceNode* n)=0;
+};
+
+typedef NodeFinishedListener* NodeFinishedListenerP;
+typedef std::list<NodeFinishedListenerP> NodeFinishedListenerPList;
+typedef WhiteNodeFoundListener* WhiteNodeFoundListenerP;
+typedef std::list<WhiteNodeFoundListenerP> WhiteNodeFoundListenerPList;
+typedef GrayNodeFoundListener* GrayNodeFoundListenerP;
+typedef std::list<GrayNodeFoundListenerP> GrayNodeFoundListenerPList;
+typedef BlackNodeFoundListener* BlackNodeFoundListenerP;
+typedef std::list<BlackNodeFoundListenerP> BlackNodeFoundListenerPList;
+
+/**
+ * Traverses all accessible InnerNodes in HMsc and referenced HMsc in depth
+ * first search manner.
+ *
+ * HMsc is traversed like BMsc-graph (flattened version of HMsc - each
+ * ReferenceNode references only BMsc not HMsc), i.e. each HMsc is traversed as
+ * many times as it is referenced. If ReferenceNode references HMsc, this HMsc
+ * is traversed before successors of referencing node are processed.
+ *
+ * InnerNodes of HMsc are during traversing in different states - with different
+ * color. WHITE color means that node wasn't traversed before. GRAY nodes
+ * are those which have been already traversed and they are just on the stack -
+ * not all successors of these events were processed. BLACK nodes are those
+ * which have been already traversed but aren't yet on the stack - all
+ * successors have been processed.
+ *
+ * Note that not all InnerNodes must be traversed by this DFSBMscGraphTraverser,
+ * imagine InnerNode B which is accessible only from ReferenceNode A but A's
+ * HMsc hasn't got any end node.
+ *
+ * @warning Non-recursive HMsc is expected.
+ */
+class DFSBMscGraphTraverser
+{
+
+public:
+
+ /**
+ * To change default name of attribute which holds color of InnerNodes use
+ * color_attribute parameter.
+ */
+ DFSBMscGraphTraverser(const std::string& color_attribute = "msc_graph_traverse_color")
+ {
+ m_color_attribute = color_attribute;
+ }
+
+ /**
+ * Calls cleanup_traversing_attributes
+ */
+ virtual ~DFSBMscGraphTraverser();
+
+ /**
+ * Trigger of traversing
+ */
+ virtual void traverse(HMscPtr hmsc);
+
+ /**
+ * Cleans up traversing attributes
+ */
+ virtual void cleanup_traversing_attributes();
+
+ /**
+ * Adds NodeFinishedListener
+ */
+ void add_node_finished_listener(NodeFinishedListenerP l)
+ {
+ m_node_finished_listeners.push_back(l);
+ }
+
+ void remove_node_finished_listeners()
+ {
+ m_node_finished_listeners.erase(
+ m_node_finished_listeners.begin(),m_node_finished_listeners.end());
+ }
+
+ /**
+ * Adds WhiteNodeFoundListener
+ */
+ void add_white_node_found_listener(WhiteNodeFoundListenerP l)
+ {
+ m_white_node_found_listeners.push_back(l);
+ }
+
+ void remove_white_node_found_listeners()
+ {
+ m_white_node_found_listeners.erase(
+ m_white_node_found_listeners.begin(),m_white_node_found_listeners.end());
+ }
+
+ /**
+ * Adds GrayNodeFoundListener
+ */
+ void add_gray_node_found_listener(GrayNodeFoundListenerP l)
+ {
+ m_gray_node_found_listeners.push_back(l);
+ }
+
+ void remove_gray_node_found_listeners()
+ {
+ m_gray_node_found_listeners.erase(
+ m_gray_node_found_listeners.begin(),m_gray_node_found_listeners.end());
+ }
+
+ /**
+ * Adds BlackNodeFoundListener
+ */
+ void add_black_node_found_listener(BlackNodeFoundListenerP l)
+ {
+ m_black_node_found_listeners.push_back(l);
+ }
+
+ void remove_black_node_found_listeners()
+ {
+ m_black_node_found_listeners.erase(
+ m_black_node_found_listeners.begin(),m_black_node_found_listeners.end());
+ }
+
+ void remove_all_listeners()
+ {
+ remove_node_finished_listeners();
+ remove_white_node_found_listeners();
+ remove_gray_node_found_listeners();
+ remove_black_node_found_listeners();
+ }
+
+ /**
+ * Returns reached InnerNodes in particular phase of traversing.
+ *
+ * The result corresponds to call stack on particular InnerNodes.
+ *
+ * Warning: The result is emptied when cleanup_traversing_attributes() is called
+ */
+ const InnerNodePListList& get_reached_nodes()
+ {
+ return m_reached_nodes;
+ }
+
+protected:
+
+ /**
+ * Holds nodes with set color attribute
+ */
+ InnerNodePListList m_colored_nodes;
+
+ /**
+ * Holds currently reached InnerNodes.
+ */
+ InnerNodePListList m_reached_nodes;
+
+ /**
+ * Cleans up traversing attributes from the top of m_colored_nodes
+ */
+ void cleanup_top_attributes();
+
+ /**
+ * Traverses single node
+ */
+ virtual bool traverse_node(InnerNode* node);
+
+ /**
+ * Traverses successors
+ */
+ virtual bool traverse_successors(const InnerNodePSet& successors);
+
+ /**
+ * Holds listeners
+ */
+ NodeFinishedListenerPList m_node_finished_listeners;
+
+ /**
+ * Holds listeners
+ */
+ WhiteNodeFoundListenerPList m_white_node_found_listeners;
+
+ /**
+ * Holds listeners
+ */
+ GrayNodeFoundListenerPList m_gray_node_found_listeners;
+
+ /**
+ * Holds listeners
+ */
+ BlackNodeFoundListenerPList m_black_node_found_listeners;
+
+ /**
+ * Holds listeners
+ */
+ GrayNodeFoundListenerPList m_grey_node_found_listeners;
+
+ /**
+ * Color attribute's name
+ */
+ std::string m_color_attribute;
+
+ /**
+ * Called when white InnerNode is found.
+ */
+ virtual void white_node_found(InnerNode* n);
+
+ /**
+ * Called when gray InnerNode is found.
+ */
+ virtual void gray_node_found(InnerNode* n);
+
+ /**
+ * Called when black InnerNode is found.
+ */
+ virtual void black_node_found(InnerNode* n);
+
+ /**
+ * Called when all successors of e are processed.
+ */
+ virtual void node_finished(InnerNode* n);
+
+ /**
+ * Sets color attribute of e to c value .
+ */
+ void set_color(InnerNode* n, Color c)
+ {
+ n->set_attribute<Color>(m_color_attribute,c);
+ }
+
+ /**
+ * Returns value of color attribute.
+ *
+ * If attribute isn't set it is set to default value WHITE.
+ */
+ Color get_color(InnerNode* n)
+ {
+ return n->get_attribute<Color>(m_color_attribute,WHITE);
+ }
+
+};
+
+
+#endif /* _DFS_MSC_GRAPH_TRAVERSER_H */
+
Modified: trunk/src/check/dfs_events_traverser.cpp
===================================================================
--- trunk/src/check/dfs_events_traverser.cpp 2008-07-16 07:16:36 UTC (rev 102)
+++ trunk/src/check/dfs_events_traverser.cpp 2008-07-27 09:20:07 UTC (rev 103)
@@ -17,12 +17,13 @@
*/
#include "check/dfs_events_traverser.h"
+#include "check/utils.h"
const std::string DFSEventsTraverser::color_attribute = "events_traverse_color";
DFSEventsTraverser::~DFSEventsTraverser()
{
-
+ cleanup_traversing_att...
[truncated message content] |
|
From: <ba...@us...> - 2008-08-03 17:56:47
|
Revision: 105
http://scstudio.svn.sourceforge.net/scstudio/?rev=105&view=rev
Author: babicaj
Date: 2008-08-03 17:56:44 +0000 (Sun, 03 Aug 2008)
Log Message:
-----------
DeadlockChecker bug found and corrected, dynamic attribute setting improved to test presence of attribute
Modified Paths:
--------------
trunk/Makefile
trunk/src/check/deadlock_checker.cpp
trunk/src/check/deadlock_checker.h
trunk/src/data/msc.h
Modified: trunk/Makefile
===================================================================
--- trunk/Makefile 2008-08-01 20:39:02 UTC (rev 104)
+++ trunk/Makefile 2008-08-03 17:56:44 UTC (rev 105)
@@ -99,6 +99,20 @@
.PHONY : depend
# Convenience name for target.
+CMakeFiles/deadlock_checker_test.dir/rule:
+ $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/deadlock_checker_test.dir/rule
+.PHONY : CMakeFiles/deadlock_checker_test.dir/rule
+
+# Convenience name for target.
+deadlock_checker_test: CMakeFiles/deadlock_checker_test.dir/rule
+.PHONY : deadlock_checker_test
+
+# fast build rule for target.
+deadlock_checker_test/fast:
+ $(MAKE) -f CMakeFiles/deadlock_checker_test.dir/build.make CMakeFiles/deadlock_checker_test.dir/build
+.PHONY : deadlock_checker_test/fast
+
+# Convenience name for target.
CMakeFiles/fifo_checker_test.dir/rule:
$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/fifo_checker_test.dir/rule
.PHONY : CMakeFiles/fifo_checker_test.dir/rule
@@ -127,6 +141,21 @@
.PHONY : livelock_checker_test/fast
# target to build an object file
+deadlock_checker_test.o:
+ $(MAKE) -f CMakeFiles/deadlock_checker_test.dir/build.make CMakeFiles/deadlock_checker_test.dir/deadlock_checker_test.o
+.PHONY : deadlock_checker_test.o
+
+# target to preprocess a source file
+deadlock_checker_test.i:
+ $(MAKE) -f CMakeFiles/deadlock_checker_test.dir/build.make CMakeFiles/deadlock_checker_test.dir/deadlock_checker_test.i
+.PHONY : deadlock_checker_test.i
+
+# target to generate assembly for a file
+deadlock_checker_test.s:
+ $(MAKE) -f CMakeFiles/deadlock_checker_test.dir/build.make CMakeFiles/deadlock_checker_test.dir/deadlock_checker_test.s
+.PHONY : deadlock_checker_test.s
+
+# target to build an object file
fifo_checker_test.o:
$(MAKE) -f CMakeFiles/fifo_checker_test.dir/build.make CMakeFiles/fifo_checker_test.dir/fifo_checker_test.o
.PHONY : fifo_checker_test.o
@@ -162,10 +191,14 @@
@echo "... all (the default if no target is provided)"
@echo "... clean"
@echo "... depend"
+ @echo "... deadlock_checker_test"
@echo "... edit_cache"
@echo "... fifo_checker_test"
@echo "... livelock_checker_test"
@echo "... rebuild_cache"
+ @echo "... deadlock_checker_test.o"
+ @echo "... deadlock_checker_test.i"
+ @echo "... deadlock_checker_test.s"
@echo "... fifo_checker_test.o"
@echo "... fifo_checker_test.i"
@echo "... fifo_checker_test.s"
Modified: trunk/src/check/deadlock_checker.cpp
===================================================================
--- trunk/src/check/deadlock_checker.cpp 2008-08-01 20:39:02 UTC (rev 104)
+++ trunk/src/check/deadlock_checker.cpp 2008-08-03 17:56:44 UTC (rev 105)
@@ -20,26 +20,99 @@
DeadlockCheckerPtr DeadlockChecker::m_instance;
+void DeadlockListener::on_white_node_found(InnerNode* node)
+{
+ //set depth attribute
+ m_current_depth++;
+ get_depth(node) = m_current_depth;
+ if (dynamic_cast<ReferenceNode*> (node))
+ {
+ m_reference_depth.push(m_current_depth);
+ }
+ //set deadlock free attribute
+ bool& deadlock_free = get_deadlock_free(node);
+ if (node->is_end_node())
+ {
+ mark_deadlock_free(node);
+ }
+}
+
+void DeadlockListener::on_node_finished(InnerNode* node)
+{
+ if (dynamic_cast<ReferenceNode*> (node))
+ {
+ bool& deadlock_free = get_deadlock_free(node);
+ if (!deadlock_free)
+ {
+ throw DeadlockException();
+ }
+ //this node is no more on traversing stack
+ m_reference_depth.pop();
+ }
+ m_current_depth--;
+}
+
+void DeadlockListener::on_gray_node_found(InnerNode* node)
+{
+ //m_reference_depth can be empty
+ if (!m_reference_depth.empty())
+ {
+ //depth of node is surely set (in on_white_node_found())
+ size_t node_depth = get_depth(node);
+ size_t top_reference_depth = m_reference_depth.top();
+ //there is some ReferenceNode on path from node to previous white InnerNode
+ if (top_reference_depth >= m_current_depth)
+ {
+ mark_deadlock_free(node);
+ }
+ }
+}
+
+void DeadlockListener::mark_deadlock_free(InnerNode* node)
+{
+ bool& deadlock_free = get_deadlock_free(node);
+ deadlock_free = true;
+ InnerNodePSet::const_iterator n;
+ const InnerNodePSet& preds = node->get_predecessors();
+ for (n = preds.begin(); n != preds.end(); n++)
+ {
+ if (!get_deadlock_free(*n))
+ {
+ mark_deadlock_free(*n);
+ }
+ }
+}
+
+void DeadlockListener::cleanup_attributes()
+{
+ while (!m_modified.empty())
+ {
+ m_modified.back()->remove_attribute<bool>(m_deadlock_free_attribute);
+ m_modified.back()->remove_attribute<size_t> (m_depth_attribute);
+ m_modified.pop_back();
+ }
+}
+
HMscPtr DeadlockChecker::create_counter_example(const InnerNodePListList& path)
{
InnerNodePListList::const_iterator hmscs_it;
HMscPtr result;
- for(hmscs_it=path.begin();hmscs_it!=path.end();hmscs_it++)
+ for (hmscs_it = path.begin(); hmscs_it != path.end(); hmscs_it++)
{
HMscPtr current_hmsc;
InnerNode* last_node = NULL;
InnerNodePList::const_iterator nodes_it;
- for(nodes_it=hmscs_it->begin();nodes_it!=hmscs_it->end();nodes_it++)
+ for (nodes_it = hmscs_it->begin(); nodes_it != hmscs_it->end(); nodes_it++)
{
- if(last_node==NULL)
+ if (last_node == NULL)
{
- if(dynamic_cast<ReferenceNode*>(*nodes_it)!=NULL)
- last_node = new ReferenceNode((ReferenceNode*)*nodes_it);
+ if (dynamic_cast<ReferenceNode*> (*nodes_it) != NULL)
+ last_node = new ReferenceNode((ReferenceNode*) * nodes_it);
else
- last_node = new ConnectionNode((ConnectionNode*)*nodes_it);
+ last_node = new ConnectionNode((ConnectionNode*) * nodes_it);
current_hmsc = new HMsc((*nodes_it)->get_owner());
current_hmsc->get_start()->add_successor(last_node);
- if(!result.get())
+ if (!result.get())
result = current_hmsc;
}
else
@@ -59,11 +132,13 @@
DeadlockListener listener;
DFSHMscTraverser traverser;
traverser.add_white_node_found_listener(&listener);
+ traverser.add_gray_node_found_listener(&listener);
+ traverser.add_node_finished_listener(&listener);
try
{
traverser.traverse(hmsc);
}
- catch(DeadlockException& e)
+ catch (DeadlockException& e)
{
p = create_counter_example(traverser.get_reached_nodes());
traverser.cleanup_traversing_attributes();
Modified: trunk/src/check/deadlock_checker.h
===================================================================
--- trunk/src/check/deadlock_checker.h 2008-08-01 20:39:02 UTC (rev 104)
+++ trunk/src/check/deadlock_checker.h 2008-08-03 17:56:44 UTC (rev 105)
@@ -40,17 +40,58 @@
}
};
-class DeadlockListener:public WhiteRefNodeFoundListener
+class DeadlockListener:
+public WhiteNodeFoundListener,
+public GrayNodeFoundListener,
+public NodeFinishedListener
{
+protected:
+
+ /**
+ * Depth of last found white InnerNode in Depth First Search tree
+ */
+ size_t m_current_depth;
+
+ /**
+ * Depths of founded ReferenceNodes
+ */
+ std::stack<size_t> m_reference_depth;
+
+ std::string m_deadlock_free_attribute;
+
+ std::string m_depth_attribute;
+
+ InnerNodePList m_modified;
+
+ bool& get_deadlock_free(InnerNode* node);
+
+ size_t& get_depth(InnerNode* node);
+
public:
- void on_white_node_found(ReferenceNode* node)
+ DeadlockListener(
+ const std::string& deadlock_free_attribute ="dl:deadlock_free",
+ const std::string& depth_attribute ="dl:depth")
{
- if(!node->is_end_node() && !node->has_successors())
- {
- throw DeadlockException();
- }
+ m_current_depth = 0;
+ m_deadlock_free_attribute = deadlock_free_attribute;
+ m_depth_attribute = depth_attribute;
}
+
+ void on_white_node_found(InnerNode* node);
+
+ void on_node_finished(InnerNode* node);
+
+ void on_gray_node_found(InnerNode* node);
+
+ void mark_deadlock_free(InnerNode* node);
+
+ void cleanup_attributes();
+
+ ~DeadlockListener()
+ {
+ cleanup_attributes();
+ }
};
class DeadlockChecker: public HMscChecker
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2008-08-01 20:39:02 UTC (rev 104)
+++ trunk/src/data/msc.h 2008-08-03 17:56:44 UTC (rev 105)
@@ -195,6 +195,39 @@
}
/**
+ * Returns dynamic attribute of MscElement.
+ *
+ * If attribute is not set, value of def is copied into its value and is
+ * returned. T is type of attribute.
+ *
+ * Keep in mind that this method hasn't got constant complexity but O(log n)
+ * where n=number of dynamic attributes set to this element.
+ *
+ * @param name - attribute name
+ * @param def - default value of attribute
+ * @param status - set to true if attribute was just created, to false
+ * otherwise
+ */
+ template<class T>
+ T& get_attribute(const std::string& name, const T& def, bool& status)
+ {
+ AttributePMap::iterator i = m_attributes.find(name);
+ T* a;
+ if(i!=m_attributes.end())
+ {
+ a = static_cast<T*>(i->second);
+ status = false;
+ }else{
+ //insert attribute with default value
+ a = new T;
+ *a = def;
+ m_attributes[name] = a;
+ status = true;
+ }
+ return *a;
+ }
+
+ /**
* Sets dynamic attribute of MscElement.
*
* Value of def is copied as value of this attribute. T is type of attribute.
@@ -552,6 +585,12 @@
* @warning counted_ptrs mustn't be used because of possible cyclic dependency
*/
InnerNodePSet m_predecessors;
+
+ /**
+ * EndNode which this ReferenceNode is connected to,
+ * undefined if there isn't any such connection.
+ */
+ EndNodePtr m_end;
InnerNode(InnerNode* original=NULL):HMscNode(original)
{
@@ -615,6 +654,37 @@
return m_successors.size()!=0;
}
+ /**
+ * Getter for m_end.
+ */
+ EndNodePtr get_end()
+ {
+ return m_end;
+ }
+
+ EndNodePtr set_end()
+ {
+ EndNodePtr end(new EndNode);
+ end->set_owner(m_owner);
+ return m_end = end;
+ }
+
+ /**
+ * Setter for m_end
+ */
+ EndNodePtr set_end(EndNodePtr end)
+ {
+ return m_end = end;
+ }
+
+ /**
+ * Returns true iff m_end is defined.
+ */
+ bool is_end_node()
+ {
+ return m_end.get();
+ }
+
friend class HMsc;
};
@@ -631,12 +701,6 @@
* MSC which is contained in this node.
*/
MscPtr m_msc;
-
- /**
- * EndNode which this ReferenceNode is connected to,
- * undefined if there isn't any such connection.
- */
- EndNodePtr m_end;
public:
@@ -651,31 +715,8 @@
{
}
- /**
- * Getter for m_end.
- */
- EndNodePtr get_end()
- {
- return m_end;
- }
- EndNodePtr set_end()
- {
- EndNodePtr end(new EndNode);
- end->set_owner(m_owner);
- return m_end = end;
- }
-
/**
- * Setter for m_end
- */
- EndNodePtr set_end(EndNodePtr end)
- {
- return m_end = end;
- }
-
-
- /**
* Getter for m_msc.
*/
MscPtr get_msc()
@@ -725,14 +766,6 @@
return p;
}
- /**
- * Returns true iff m_end is defined.
- */
- bool is_end_node()
- {
- return m_end.get();
- }
-
};
/**
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ba...@us...> - 2008-08-11 19:31:30
|
Revision: 108
http://scstudio.svn.sourceforge.net/scstudio/?rev=108&view=rev
Author: babicaj
Date: 2008-08-11 19:31:08 +0000 (Mon, 11 Aug 2008)
Log Message:
-----------
Deadlock checker missed implementation of declared methods, new incomplete version of race checker.
Modified Paths:
--------------
trunk/Makefile
trunk/src/check/CMakeLists.txt
trunk/src/check/deadlock_checker.cpp
trunk/tests/CMakeLists.txt
Added Paths:
-----------
trunk/src/check/footprint.cpp
trunk/src/check/footprint.h
trunk/src/check/race_checker.cpp
trunk/src/check/race_checker.h
trunk/src/check/utils.h
Modified: trunk/Makefile
===================================================================
--- trunk/Makefile 2008-08-09 16:39:00 UTC (rev 107)
+++ trunk/Makefile 2008-08-11 19:31:08 UTC (rev 108)
@@ -126,20 +126,6 @@
$(MAKE) -f CMakeFiles/fifo_checker_test.dir/build.make CMakeFiles/fifo_checker_test.dir/build
.PHONY : fifo_checker_test/fast
-# Convenience name for target.
-CMakeFiles/livelock_checker_test.dir/rule:
- $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/livelock_checker_test.dir/rule
-.PHONY : CMakeFiles/livelock_checker_test.dir/rule
-
-# Convenience name for target.
-livelock_checker_test: CMakeFiles/livelock_checker_test.dir/rule
-.PHONY : livelock_checker_test
-
-# fast build rule for target.
-livelock_checker_test/fast:
- $(MAKE) -f CMakeFiles/livelock_checker_test.dir/build.make CMakeFiles/livelock_checker_test.dir/build
-.PHONY : livelock_checker_test/fast
-
# target to build an object file
deadlock_checker_test.o:
$(MAKE) -f CMakeFiles/deadlock_checker_test.dir/build.make CMakeFiles/deadlock_checker_test.dir/deadlock_checker_test.o
@@ -170,21 +156,6 @@
$(MAKE) -f CMakeFiles/fifo_checker_test.dir/build.make CMakeFiles/fifo_checker_test.dir/fifo_checker_test.s
.PHONY : fifo_checker_test.s
-# target to build an object file
-livelock_checker_test.o:
- $(MAKE) -f CMakeFiles/livelock_checker_test.dir/build.make CMakeFiles/livelock_checker_test.dir/livelock_checker_test.o
-.PHONY : livelock_checker_test.o
-
-# target to preprocess a source file
-livelock_checker_test.i:
- $(MAKE) -f CMakeFiles/livelock_checker_test.dir/build.make CMakeFiles/livelock_checker_test.dir/livelock_checker_test.i
-.PHONY : livelock_checker_test.i
-
-# target to generate assembly for a file
-livelock_checker_test.s:
- $(MAKE) -f CMakeFiles/livelock_checker_test.dir/build.make CMakeFiles/livelock_checker_test.dir/livelock_checker_test.s
-.PHONY : livelock_checker_test.s
-
# Help Target
help:
@echo "The following are some of the valid targets for this Makefile:"
@@ -194,7 +165,6 @@
@echo "... deadlock_checker_test"
@echo "... edit_cache"
@echo "... fifo_checker_test"
- @echo "... livelock_checker_test"
@echo "... rebuild_cache"
@echo "... deadlock_checker_test.o"
@echo "... deadlock_checker_test.i"
@@ -202,9 +172,6 @@
@echo "... fifo_checker_test.o"
@echo "... fifo_checker_test.i"
@echo "... fifo_checker_test.s"
- @echo "... livelock_checker_test.o"
- @echo "... livelock_checker_test.i"
- @echo "... livelock_checker_test.s"
.PHONY : help
Modified: trunk/src/check/CMakeLists.txt
===================================================================
--- trunk/src/check/CMakeLists.txt 2008-08-09 16:39:00 UTC (rev 107)
+++ trunk/src/check/CMakeLists.txt 2008-08-11 19:31:08 UTC (rev 108)
@@ -14,4 +14,7 @@
ADD_LIBRARY(deadlock_checker STATIC deadlock_checker.cpp)
ADD_LIBRARY(fifo_checker STATIC fifo_checker.cpp)
#ADD_LIBRARY(livelock_checker STATIC livelock_checker.cpp)
-#ADD_LIBRARY(race_checker STATIC race_checker.cpp)
+ADD_LIBRARY(race_checker STATIC race_checker.cpp)
+
+#other
+ADD_LIBRARY(footprint STATIC footprint.cpp)
Modified: trunk/src/check/deadlock_checker.cpp
===================================================================
--- trunk/src/check/deadlock_checker.cpp 2008-08-09 16:39:00 UTC (rev 107)
+++ trunk/src/check/deadlock_checker.cpp 2008-08-11 19:31:08 UTC (rev 108)
@@ -20,6 +20,22 @@
DeadlockCheckerPtr DeadlockChecker::m_instance;
+bool& DeadlockListener::get_deadlock_free(InnerNode* node)
+{
+ bool status;
+ bool& deadlock_free = node->get_attribute<bool>(m_deadlock_free_attribute,false,status);
+ if(status)
+ {
+ m_modified.push_back(node);
+ }
+ return deadlock_free;
+}
+
+size_t& DeadlockListener::get_depth(InnerNode* node)
+{
+ return node->get_attribute<size_t>(m_depth_attribute,0);
+}
+
void DeadlockListener::on_white_node_found(InnerNode* node)
{
//set depth attribute
@@ -88,7 +104,7 @@
while (!m_modified.empty())
{
m_modified.back()->remove_attribute<bool>(m_deadlock_free_attribute);
- m_modified.back()->remove_attribute<size_t> (m_depth_attribute);
+ m_modified.back()->remove_attribute<size_t>(m_depth_attribute);
m_modified.pop_back();
}
}
Added: trunk/src/check/footprint.cpp
===================================================================
--- trunk/src/check/footprint.cpp (rev 0)
+++ trunk/src/check/footprint.cpp 2008-08-11 19:31:08 UTC (rev 108)
@@ -0,0 +1,6 @@
+#import "check/footprint.h"
+
+bool EDInstancesPtrComparator::operator()(const EDInstancesPtr& a, const EDInstancesPtr& b)
+{
+ return a->operator <(*b.get());
+}
\ No newline at end of file
Added: trunk/src/check/footprint.h
===================================================================
--- trunk/src/check/footprint.h (rev 0)
+++ trunk/src/check/footprint.h 2008-08-11 19:31:08 UTC (rev 108)
@@ -0,0 +1,200 @@
+#ifndef _FOOTPRINT_H
+#define _FOOTPRINT_H
+
+#include <map>
+#include <set>
+
+#include "data/msc.h"
+
+
+class Footprint;
+class EventDependentInstances;
+
+typedef std::vector<bool> BoolVector;
+typedef counted_ptr<EventDependentInstances> EDInstancesPtr;
+typedef counted_ptr<Footprint> FootprintPtr;
+
+class EDInstancesPtrComparator
+{
+public:
+ bool operator()(const EDInstancesPtr& a, const EDInstancesPtr& b);
+};
+
+typedef std::set<EDInstancesPtr,EDInstancesPtrComparator> EDInstancesPtrSet;
+
+/**
+ * Represents dependent Instances -- contain lesser/grater (depends on chosen semantic)
+ * Event then the Event with specified m_event in this class.
+ */
+class EventDependentInstances
+{
+
+private:
+
+ /**
+ * This instance of DependetInstances represents dependet instances of an Event
+ * of this attribute
+ */
+ Event* m_event;
+
+ /**
+ * Each Instance i must have its own number. For this vector m_instances holds:
+ * m_instances[i]==true iff i contains any greater/lesser Event than the Event e with
+ * id == m_event_id.
+ */
+ BoolVector m_instances;
+
+public:
+
+ /**
+ *
+ */
+ EventDependentInstances(Event* event,size_t instances_count)
+ {
+ m_event = event;
+ m_instances = BoolVector(instances_count,false);
+ }
+
+ /**
+ * Used in std::set as comparision method
+ *
+ * The di is supposed to have m_instances as large as this one has.
+ */
+ bool operator<(const EventDependentInstances& di) const
+ {
+ return compare(di)<0;
+ }
+
+ /**
+ * Returns -1 for this<di, 0 for this==di and 1 for this>di
+ */
+ int compare(const EventDependentInstances& di) const
+ {
+ if(m_event<di.m_event) return -1;
+ if(di.m_event<m_event) return 1;
+ //compare bool vector as binary number
+ for(int i=0; i<m_instances.size(); i++)
+ {
+ if(m_instances[i]!=di.m_instances[i])
+ return m_instances[i]-di.m_instances[i];
+ }
+ //otherwise this is same as di
+ return 0;
+ }
+
+ void set_dependent(size_t instance)
+ {
+ m_instances[instance] = true;
+ }
+
+
+
+};
+
+class ExtremeEvents
+{
+
+protected:
+
+ /**
+ * Holds greater/lesser Instances of Events accessible under id of Event's
+ * Instance.
+ */
+ EDInstancesPtrSet m_events_instances;
+
+public:
+
+ ExtremeEvents()
+ {
+ }
+
+ /**
+ * Compares ExtremeEvents by items.
+ */
+ bool operator<(const ExtremeEvents& extreme) const
+ {
+ EDInstancesPtrSet::const_iterator my_i = m_events_instances.begin();
+ EDInstancesPtrSet::const_iterator extreme_i = extreme.m_events_instances.begin();
+ while(my_i!=m_events_instances.end() && extreme_i!=extreme.m_events_instances.end())
+ {
+ const EDInstancesPtr my_edis = *my_i;
+ const EDInstancesPtr extreme_edis = *extreme_i;
+ int comparision = my_edis->compare(*extreme_edis.get());
+ if(comparision!=0) return comparision<0;
+ my_i++;
+ extreme_i++;
+ }
+ //otherwise this is same as extreme
+ return false;
+ }
+
+ void add_extreme_event(EDInstancesPtr& edis)
+ {
+ m_events_instances.insert(edis);
+ }
+
+ const EDInstancesPtrSet& get_events_instances()
+ {
+ return m_events_instances;
+ }
+};
+
+/**
+ * Footprint of path in BMsc-graph.
+ *
+ * Footprint is implementation of footprint (with lowercase f) suggested in
+ * article Decidable Race Condition in High-Level Message Sequence Charts by
+ * Jan Fousek, Vojtech Rehak and Petr Slovak.
+ */
+class Footprint:public ExtremeEvents
+{
+
+private:
+
+ /**
+ * Node in HMsc which built this Footprint.
+ *
+ * A path with counter example should be returned as structured path (i.e. as
+ * HMsc) but keeping HMsc for all possible Footprint during computation would
+ * be very memory consuming therefore only one ReferenceNode is used and
+ * previous Footprint which this one originates from (see m_previous).
+ * Structured path should be computed from these properties.
+ */
+ ReferenceNode* m_node;
+
+ /**
+ * Previous Footprint which was this one created from.
+ */
+ FootprintPtr m_previous;
+
+public:
+
+ /**
+ * Creates new Footprint of two concatenated BMscs.
+ *
+ * The first one is represented by its footprint, the second one is whole BMsc.
+ * @param previous - previous Footprint which is this one creted from
+ * @param bmsc_node - ReferenceNode containing BMsc
+ * TODO: throw exception if bmsc_node doesn't contain BMsc
+ */
+ Footprint(FootprintPtr previous, ReferenceNode* bmsc_node)
+ {
+ m_previous = previous;
+ m_node = bmsc_node;
+ }
+
+ /**
+ * Creates new initial Footprint
+ *
+ * Created Footprint doesn't reference neither ReferenceNode nor Footprint and
+ * is supposed to be predecessor (not neccessary direct) of the others
+ * Footprints.
+ */
+ Footprint()
+ {
+ }
+
+};
+
+#endif /* _FOOTPRINT_H */
+
Added: trunk/src/check/race_checker.cpp
===================================================================
--- trunk/src/check/race_checker.cpp (rev 0)
+++ trunk/src/check/race_checker.cpp 2008-08-11 19:31:08 UTC (rev 108)
@@ -0,0 +1,339 @@
+/*
+ * 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: bmsc_race_checker.cpp 97 2008-06-02 10:40:48Z babicaj $
+ */
+
+#include <list>
+
+
+#include "check/race_checker.h"
+
+void MinimalEventsInitiator::on_white_node_found(ReferenceNode* node)
+{
+ BMscPtr b = node->get_bmsc();
+ const InstancePtrList& instances = b->get_instances();
+ //compute minimal Events of Instances
+ EventPList minimal_events;
+ InstancePtrList::const_iterator i;
+ for(i=instances.begin();i!=instances.end();i++)
+ {
+ EventPList* events = DFSInstanceEventsTraverser::topology_order((*i).get());
+ EventPList::const_iterator e1;
+ for(e1 = events->begin();e1!=events->end();e1++)
+ {
+ EventPList::const_iterator e2;
+ for(e1 = events->begin();e1!=events->end();e1++)
+ {
+ if(e1!=e2)
+ {
+ Event* e = *e2;
+ BoolVector& e2_causal = m_caus_initiator->get_causal_closure(*e2);
+ size_t e1_index = m_vis_initiator->get_topology_index(*e1);
+ //e2<<e1 => e1 isn't minimal
+ if(e2_causal[e1_index]) break;
+ }
+ }
+ //'while loop' hasn't found any Event e2 to be less than e1
+ if(e2==events->end())
+ minimal_events.push_back(*e1);
+ }
+ delete events;
+ }
+ /*
+ For each Event e1 from minimal_events find Instances containing less Events
+ than Event e1 in minimal_events.
+ Note that if there exists any Event e2<e1 at Instance i, e2 must be grater
+ or equal to some Event e3 in minimal_events, therefore we will use only
+ minimal_events to seek.
+ */
+ EventPList::const_iterator e;
+ ExtremeEvents& extreme_events = get_events(b.get());
+ m_modified_bmscs.push_back(b.get());
+ for(e=minimal_events.begin();e!=minimal_events.end();e++)
+ {
+ EDInstancesPtr e_instances =
+ new EventDependentInstances(*e,m_instance_marker->get_count());
+ size_t e_index = m_vis_initiator->get_topology_index(*e);
+ EventPList::const_iterator f;
+ for(f=minimal_events.begin();f!=minimal_events.end();f++)
+ {
+ //if f is less than e then Instance of f must be inserted
+ BoolVector& closure = m_caus_initiator->get_causal_closure(*f);
+ if(closure[e_index])
+ e_instances->set_dependent(
+ m_instance_marker->get_instance_id((*f)->get_instance()));
+ }
+ extreme_events.add_extreme_event(e_instances);
+ }
+}
+
+void MinimalEventsInitiator::cleanup_attributes(){
+ while(!m_modified_bmscs.empty())
+ {
+ BMsc* b = m_modified_bmscs.back();
+ b->remove_attribute<ExtremeEvents>(m_events_attribute);
+ m_modified_bmscs.pop_back();
+ }
+}
+
+void MaximalEventsInitiator::on_white_node_found(ReferenceNode* node)
+{
+ BMscPtr b = node->get_bmsc();
+ const InstancePtrList& instances = b->get_instances();
+ //compute maximal Events of Instances
+ EventPList maximal_events;
+ InstancePtrList::const_iterator i;
+ for(i=instances.begin();i!=instances.end();i++)
+ {
+ EventPList* events = DFSInstanceEventsTraverser::topology_order((*i).get());
+ EventPList::const_iterator e1 = events->begin();
+ while(e1!=events->end())
+ {
+ BoolVector& e1_causal = m_caus_initiator->get_causal_closure(*e1);
+ EventPList::const_iterator e2 = events->begin();
+ while(e2!=events->end())
+ {
+ 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;
+ }
+ e2++;
+ }
+ //'while loop' hasn't found any Event e2 to be greater than e1
+ if(e2==events->end())
+ maximal_events.push_back(*e1);
+ e1++;
+ }
+ delete events;
+ }
+ /*
+ For any Event e1 from maximal_events find Instances containing any Event e2
+ such that e2<<e1.
+ */
+ EventPList::const_iterator e;
+ ExtremeEvents& extreme_events = get_events(b.get());
+ m_modified_bmscs.push_back(b.get());
+ EventPList* events = DFSEventsTraverser::topology_order((*e)->get_instance());
+ for(e=maximal_events.begin();e!=maximal_events.end();e++)
+ {
+ EDInstancesPtr e_instances =
+ new EventDependentInstances(*e,m_instance_marker->get_count());
+ size_t e_index = m_vis_initiator->get_topology_index(*e);
+ EventPList::const_iterator f;
+ /*
+ Note that in the article only Events from MinP (used D \in MinP notation in
+ the article) are supposed to be checked. Nothing changes if we check all
+ Events moreover we don't need to find MinP.
+ */
+ for(f=events->begin();f!=events->end();f++)
+ {
+ //if f is less than e then Instance of f must be inserted
+ BoolVector& f_closure = m_caus_initiator->get_causal_closure(*f);
+ if(f_closure[e_index])
+ e_instances->set_dependent(
+ m_instance_marker->get_instance_id((*f)->get_instance()));
+ }
+ extreme_events.add_extreme_event(e_instances);
+ }
+ delete events;
+}
+
+RaceChecker::RaceChecker()
+{
+ m_min_events_initiator = MinimalEventsInitiator(
+ &m_visual_initiator,&m_causal_initiator,&m_instance_marker);
+ m_max_events_initiator = MaximalEventsInitiator(
+ &m_visual_initiator,&m_causal_initiator,&m_instance_marker);
+}
+
+BMsc* RaceChecker::create_counter_example(Event* e1, Event* e2)
+{
+ BMsc* bmsc = new BMsc(e1->get_instance()->get_bmsc());
+ InstancePtr common_instance = new Instance(bmsc,e1->get_instance());
+ bmsc->add_instance(common_instance);
+ BoolVector& e2_causal = m_causal_initiator.get_causal_closure(e2);
+ size_t e1_index = m_visual_initiator.get_topology_index(e1);
+ MscMessagePtr e1_message;
+ if(e1->is_send())
+ e1_message = new MscMessage(
+ common_instance.get(),NULL,e1->get_message().get());
+ else
+ e1_message = new MscMessage(
+ NULL,common_instance.get(),e1->get_message().get());
+ MscMessagePtr e2_message;
+ if(e2->is_send())
+ e2_message = new MscMessage(
+ common_instance.get(),NULL,e2->get_message().get());
+ else
+ e2_message = new MscMessage(
+ NULL,common_instance.get(),e2->get_message().get());
+ //e2 << e1
+ if(e2_causal[e1_index])
+ {
+ StrictOrderAreaPtr common_strict = new StrictOrderArea(
+ common_instance.get());
+ StrictEventPtr e1_strict = new StrictEvent(common_strict.get(),e1_message,e1);
+ StrictEventPtr e2_strict = new StrictEvent(common_strict.get(),e2_message,e2);
+ common_strict->set_first(e1_strict);
+ e1_strict->set_successor(e2_strict);
+ common_instance->set_first(common_strict);
+ }
+ //e2 || e1
+ else
+ {
+ CoregionAreaPtr common_coregion = new CoregionArea(common_instance.get());
+ CoregionEvent* e1_coregion = new CoregionEvent(
+ common_coregion.get(),e1_message,e1);
+ CoregionEvent* e2_coregion = new CoregionEvent(
+ common_coregion.get(),e2_message,e2);
+ common_coregion->add_minimal_event(e1_coregion);
+ common_coregion->add_minimal_event(e2_coregion);
+ common_instance->set_first(common_coregion);
+ }
+ return bmsc;
+}
+
+BMscPtr RaceChecker::check_bmsc(BMscPtr bmsc, ChannelMapperPtr mapper)
+{
+ EventPList* t = DFSEventsTraverser::topology_order(bmsc);
+ EventPVector topology(
+ t->begin(),
+ t->end()
+ );
+ delete t;
+ m_visual_initiator.initialize(topology);
+ m_causal_initiator.initialize(topology,m_visual_initiator,mapper);
+ BMscPtr result;
+ OrderCheckerListener order_checker_listener(&m_visual_initiator);
+ DFSInstanceEventsTraverser instance_traverser;
+ for(size_t i = 0; i < topology.size(); i++)
+ {
+ //in this block checkout whether there is any Event in race with topology[i]
+ order_checker_listener.reset(
+ &m_visual_initiator.get_visual_closure(topology[i]),
+ &m_causal_initiator.get_causal_closure(topology[i]));
+ try
+ {
+ instance_traverser.traverse(topology[i]->get_instance());
+ instance_traverser.cleanup_traversing_attributes();
+ }
+ catch(EventRaceException& e)
+ {
+ instance_traverser.cleanup_traversing_attributes();
+ return create_counter_example(topology[i],e.get_event());
+ }
+ }
+ return result;
+}
+
+BMscPtr RaceChecker::check(BMscPtr bmsc, ChannelMapperPtr mapper)
+{
+ BMscPtr b = check_bmsc(bmsc,mapper);
+ cleanup_attributes();
+ return b;
+}
+
+void RaceChecker::cleanup_attributes()
+{
+ m_visual_initiator.cleanup_attributes();
+ m_causal_initiator.cleanup_attributes();
+ m_instance_marker.cleanup_attributes();
+ m_min_events_initiator.cleanup_attributes();
+ m_max_events_initiator.cleanup_attributes();
+}
+
+void RaceChecker::prepare_hmsc(HMscPtr hmsc,ChannelMapperPtr mapper)
+{
+ //mark instances by id and count number of different instances
+ DFSBMscGraphTraverser traverser;
+ traverser.add_white_node_found_listener(&m_instance_marker);
+ traverser.traverse(hmsc);
+ traverser.remove_all_listeners();
+ //note that it is not neccessary to cleanup traversing attributes
+ //compute MinP and MaxP
+ traverser.add_white_node_found_listener(&m_min_events_initiator);
+ traverser.add_white_node_found_listener(&m_max_events_initiator);
+ traverser.traverse(hmsc);
+
+}
+
+HMscPtr RaceChecker::check(HMscPtr hmsc, ChannelMapperPtr mapper)
+{
+ //TODO:transform hmsc into BMsc graph
+ //compute causal closure of all BMsc and check BMscs to be race free
+ HMscPtr res = check_bmscs(hmsc,mapper);
+ if(res.get())
+ return res;
+ //precompute possible things for race checking - e.g. MinP
+ prepare_hmsc(hmsc,mapper);
+ //check hmsc to be race free
+ check_hmsc(hmsc);
+}
+
+HMscPtr RaceChecker::check_hmsc(HMscPtr hmsc)
+{
+
+}
+
+/**
+ * Checks HMsc to have only race free BMscs
+ */
+HMscPtr RaceChecker::check_bmscs(HMscPtr hmsc, ChannelMapperPtr mapper)
+{
+ BMscRaceCheckingListener bmsc_race_listener(this,mapper);
+ DFSBMscGraphTraverser traverser;
+ HMscPtr counter_example;
+ try
+ {
+ traverser.add_white_node_found_listener(&bmsc_race_listener);
+ traverser.traverse(hmsc);
+ }
+ catch(RaceInBMscException& e)
+ {
+ counter_example = create_counter_example(traverser.get_reached_nodes(),e.get_example());
+ }
+ return counter_example;
+}
+
+HMscPtr RaceChecker::create_counter_example(const InnerNodePListList& path, BMscPtr example){
+ //TODO: create counter example
+// ReferenceNodePList::const_iterator n;
+// HMscPtr first_hmsc;
+// HMscPtr current_hmsc;
+// ReferenceNode* last_node = NULL;
+// for(n=l.get_path().begin();n!=l.get_path().end();n++)
+// {
+// ReferenceNode* node = *n;
+// if(!current_hmsc.get() || current_hmsc->get_original()!=node->get_owner())
+// {
+// if(last_node)
+// last_node->set_end();
+// current_hmsc = new HMsc(node->get_owner());
+// ReferenceNode* new_node = new ReferenceNode(node);
+// current_hmsc->get_start()->add_successor(new_node);
+// last_node = new_node;
+// if(!first_hmsc.get())
+// first_hmsc = current_hmsc;
+// }else{
+// last_node->add_successor(new ReferenceNode(node));
+// }
+// }
+// last_node->set_msc(example);
+// return first_hmsc;
+}
Added: trunk/src/check/race_checker.h
===================================================================
--- trunk/src/check/race_checker.h (rev 0)
+++ trunk/src/check/race_checker.h 2008-08-11 19:31:08 UTC (rev 108)
@@ -0,0 +1,298 @@
+/*
+ * File: hmsc_race_checker.h
+ * Author: Jind?ich
+ *
+ * Created on 24. ÄŹĹĽËťerven 2008, 13:18
+ */
+
+#ifndef _HMSC_RACE_CHECKER_H
+#define _HMSC_RACE_CHECKER_H
+
+#include <exception>
+#include <stack>
+
+#include "data/msc.h"
+#include "check/causal_closure_initiator.h"
+#include "check/dfs_bmsc_graph_traverser.h"
+#include "check/utils.h"
+#include "check/footprint.h"
+
+class BMscRaceCheckingListener;
+class RaceInBMscException;
+
+typedef std::stack<ReferenceNode*> ReferenceNodePStack;
+typedef std::list<BMsc*> BMscPList;
+
+/**
+ * Stands for mechanism for computation of MinP
+ *
+ * MinP is used in checking Footprint and BMsc to be race free (Algortihm 1 in
+ * the article).
+ */
+class MinimalEventsInitiator:public WhiteRefNodeFoundListener
+{
+protected:
+
+ VisualClosureInitiator* m_vis_initiator;
+ CausalClosureInitiator* m_caus_initiator;
+ InstanceIdMarker* m_instance_marker;
+ std::string m_events_attribute;
+ BMscPList m_modified_bmscs;
+
+public:
+
+ MinimalEventsInitiator(
+ VisualClosureInitiator* vis_initiator=NULL,
+ CausalClosureInitiator* caus_initiator=NULL,
+ InstanceIdMarker* instance_marker=NULL,
+ const std::string& events_attribute = "minimal_events")
+ {
+ m_vis_initiator = vis_initiator;
+ m_caus_initiator = caus_initiator;
+ m_instance_marker = instance_marker;
+ m_events_attribute = events_attribute;
+ }
+
+ virtual ~MinimalEventsInitiator()
+ {
+ cleanup_attributes();
+ }
+
+ void on_white_node_found(ReferenceNode* node);
+
+ ExtremeEvents& get_events(BMsc* b)
+ {
+ static ExtremeEvents extreme;
+ m_modified_bmscs.push_back(b);
+ return b->get_attribute<ExtremeEvents>(m_events_attribute,extreme);
+ }
+
+ void cleanup_attributes();
+
+};
+
+/**
+ * Stands for mechanism for computation of MaxP
+ *
+ * MaxP is used to compute new Footprint f2 of the old Footprint f1 concatenated with
+ * some BMsc b. Events in MaxP of b replace Events of f1 on the same instances and
+ * becomes members of new Footprint f2.
+ *
+ * When computing new Footprint it is neccessary to find relation between Events
+ * in f1 and Events in MaxP of b in case there is some Event from f1 which belongs
+ * to new f2 too. This listener prepares structure for this purpose too.
+ *
+ * Details are described in Lemma 15 of the article.
+ */
+class MaximalEventsInitiator:public MinimalEventsInitiator
+{
+
+public:
+
+ MaximalEventsInitiator(
+ VisualClosureInitiator* vis_initiator=NULL,
+ CausalClosureInitiator* caus_initiator=NULL,
+ InstanceIdMarker* instance_marker=NULL,
+ const std::string& events_attribute = "maximal_events"):
+ MinimalEventsInitiator(
+ vis_initiator,caus_initiator,instance_marker,events_attribute)
+ {
+ }
+
+ void on_white_node_found(ReferenceNode* node);
+
+};
+
+class RaceChecker:public HMscChecker
+{
+
+protected:
+
+ VisualClosureInitiator m_visual_initiator;
+
+ CausalClosureInitiator m_causal_initiator;
+
+ InstanceIdMarker m_instance_marker;
+
+ MinimalEventsInitiator m_min_events_initiator;
+
+ MaximalEventsInitiator m_max_events_initiator;
+
+ /**
+ * Checks HMsc to have only race free BMscs
+ */
+ HMscPtr check_bmscs(HMscPtr hmsc, ChannelMapperPtr mapper);
+
+ /**
+ * It was found that e1<e2 but not e1<<e2
+ */
+ BMsc* create_counter_example(Event* e1, Event* e2);
+
+ /**
+ * Precomputes neccessary things for race checking
+ */
+ void prepare_hmsc(HMscPtr hmsc,ChannelMapperPtr mapper);
+
+ /**
+ * Coorrespond to Algorithm 1 of referenced article
+ */
+ void check_concatenation(const Footprint& f, BMscPtr bmsc, ChannelMapperPtr mapper);
+
+ /**
+ * Creates counter example in case there is any race violating BMsc
+ */
+ HMscPtr create_counter_example(const InnerNodePListList& path, BMscPtr example);
+
+ HMscPtr check_hmsc(HMscPtr hmsc);
+
+public:
+
+ RaceChecker();
+
+ BMscPtr check_bmsc(BMscPtr bmsc, ChannelMapperPtr mapper);
+
+ BMscPtr check(BMscPtr bmsc, ChannelMapperPtr mapper);
+
+ HMscPtr check(HMscPtr hmsc, ChannelMapperPtr mapper);
+
+ void cleanup_attributes();
+
+};
+
+class RaceInBMscException:public std::exception
+{
+private:
+
+ /**
+ * Counter example containing race
+ */
+ BMscPtr m_example;
+
+public:
+
+ RaceInBMscException(BMscPtr example)
+ {
+ m_example = example;
+ }
+
+ ~RaceInBMscException() throw ()
+ {
+
+ }
+
+ const char* what()
+ {
+ return "There was found race in BMsc";
+ }
+
+ BMscPtr get_example()
+ {
+ return m_example;
+ }
+};
+
+/**
+ * Used to check all BMscs in HMsc to satisfy race free property.
+ */
+class BMscRaceCheckingListener:public WhiteRefNodeFoundListener
+{
+
+ RaceChecker* m_checker;
+
+ ChannelMapperPtr m_mapper;
+
+public:
+
+ BMscRaceCheckingListener(RaceChecker* checker, ChannelMapperPtr mapper)
+ {
+ m_checker = checker;
+ m_mapper = mapper;
+ }
+
+ void on_white_node_found(ReferenceNode* node)
+ {
+ BMscPtr b = node->get_bmsc();
+ if(b.get())
+ {
+ BMscPtr example = m_checker->check_bmsc(b,m_mapper);
+ if(example.get())
+ throw RaceInBMscException(b);
+ //precompute MinP for b
+ }
+ }
+
+};
+
+class EventRaceException:public std::exception
+{
+private:
+
+ Event* m_event;
+
+public:
+
+ EventRaceException(Event* e)
+ {
+ m_event = e;
+ }
+
+ ~EventRaceException() throw ()
+ {
+
+ }
+
+ const char* what()
+ {
+ return "There was found race between two events";
+ }
+
+ Event* get_event()
+ {
+ return m_event;
+ }
+};
+
+/**
+ * Used for checking events to be in race or not.
+ */
+class OrderCheckerListener:public WhiteEventFoundListener
+{
+private:
+
+ VisualClosureInitiator* m_visual_initiator;
+
+ BoolVector* m_e1_visual_order;
+
+ BoolVector* m_e1_causal_order;
+
+public:
+
+ OrderCheckerListener(VisualClosureInitiator* visual_initiator)
+ {
+ m_visual_initiator=visual_initiator;
+
+ }
+
+ void reset(
+ BoolVector* visual_order,
+ BoolVector* causal_order)
+ {
+ m_e1_visual_order=visual_order;
+ m_e1_causal_order=causal_order;
+ }
+
+ void on_white_event_found(Event* e2)
+ {
+ size_t e2_index = m_visual_initiator->get_topology_index(e2);
+ if((*m_e1_visual_order)[e2_index] && !(*m_e1_causal_order)[e2_index])
+ {
+ throw EventRaceException(e2);
+ }
+ }
+
+};
+
+
+
+#endif /* _HMSC_RACE_CHECKER_H */
+
Added: trunk/src/check/utils.h
===================================================================
--- trunk/src/check/utils.h (rev 0)
+++ trunk/src/check/utils.h 2008-08-11 19:31:08 UTC (rev 108)
@@ -0,0 +1,107 @@
+#ifndef _UTILS_H
+#define _UTILS_H
+
+#include <string>
+
+#include "check/dfs_bmsc_graph_traverser.h"
+
+typedef std::map<std::string,size_t> StringSizeTMap;
+
+/**
+ * Marks Instances with apropriate identifiers
+ */
+class InstanceIdMarker:public WhiteRefNodeFoundListener
+{
+private:
+
+ std::string m_instance_id_attribute;
+
+ StringSizeTMap m_identifiers;
+
+ std::list<Instance*> m_modified_instances;
+
+ size_t m_counter;
+
+ void set_instance_id(Instance* i)
+ {
+ StringSizeTMap::iterator it = m_identifiers.find(i->get_label());
+ if(it!=m_identifiers.end())
+ i->set_attribute<size_t>(m_instance_id_attribute,(*it).second);
+ else
+ i->set_attribute<size_t>(m_instance_id_attribute,m_identifiers.size()+1);
+ m_modified_instances.push_back(i);
+ }
+
+public:
+
+ InstanceIdMarker(const std::string& instance_id_attribute="instance_id")
+ {
+ m_instance_id_attribute = instan...
[truncated message content] |
|
From: <ba...@us...> - 2008-10-19 15:53:30
|
Revision: 113
http://scstudio.svn.sourceforge.net/scstudio/?rev=113&view=rev
Author: babicaj
Date: 2008-10-19 15:53:21 +0000 (Sun, 19 Oct 2008)
Log Message:
-----------
New traverser DFSBHMscTraverser added -- traverses HMsc in backward manner, please use it if possible. DeadlockChecker is able to be translated.
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/Makefile
trunk/src/check/CMakeLists.txt
trunk/src/check/checker.h
trunk/src/check/deadlock_checker.cpp
trunk/src/check/deadlock_checker.h
trunk/src/check/dfs_bmsc_graph_traverser.cpp
trunk/src/check/dfs_bmsc_graph_traverser.h
trunk/src/check/visual_closure_initiator.cpp
Added Paths:
-----------
trunk/src/check/dfsb_hmsc_traverser.cpp
trunk/src/check/dfsb_hmsc_traverser.h
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2008-10-12 15:02:42 UTC (rev 112)
+++ trunk/CMakeLists.txt 2008-10-19 15:53:21 UTC (rev 113)
@@ -7,6 +7,6 @@
INCLUDE_DIRECTORIES(src)
ADD_SUBDIRECTORY(src .)
-ADD_SUBDIRECTORY(tests .)
+#ADD_SUBDIRECTORY(tests .)
Modified: trunk/Makefile
===================================================================
--- trunk/Makefile 2008-10-12 15:02:42 UTC (rev 112)
+++ trunk/Makefile 2008-10-19 15:53:21 UTC (rev 113)
@@ -98,80 +98,14 @@
$(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend
-# Convenience name for target.
-CMakeFiles/deadlock_checker_test.dir/rule:
- $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/deadlock_checker_test.dir/rule
-.PHONY : CMakeFiles/deadlock_checker_test.dir/rule
-
-# Convenience name for target.
-deadlock_checker_test: CMakeFiles/deadlock_checker_test.dir/rule
-.PHONY : deadlock_checker_test
-
-# fast build rule for target.
-deadlock_checker_test/fast:
- $(MAKE) -f CMakeFiles/deadlock_checker_test.dir/build.make CMakeFiles/deadlock_checker_test.dir/build
-.PHONY : deadlock_checker_test/fast
-
-# Convenience name for target.
-CMakeFiles/fifo_checker_test.dir/rule:
- $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/fifo_checker_test.dir/rule
-.PHONY : CMakeFiles/fifo_checker_test.dir/rule
-
-# Convenience name for target.
-fifo_checker_test: CMakeFiles/fifo_checker_test.dir/rule
-.PHONY : fifo_checker_test
-
-# fast build rule for target.
-fifo_checker_test/fast:
- $(MAKE) -f CMakeFiles/fifo_checker_test.dir/build.make CMakeFiles/fifo_checker_test.dir/build
-.PHONY : fifo_checker_test/fast
-
-# target to build an object file
-deadlock_checker_test.o:
- $(MAKE) -f CMakeFiles/deadlock_checker_test.dir/build.make CMakeFiles/deadlock_checker_test.dir/deadlock_checker_test.o
-.PHONY : deadlock_checker_test.o
-
-# target to preprocess a source file
-deadlock_checker_test.i:
- $(MAKE) -f CMakeFiles/deadlock_checker_test.dir/build.make CMakeFiles/deadlock_checker_test.dir/deadlock_checker_test.i
-.PHONY : deadlock_checker_test.i
-
-# target to generate assembly for a file
-deadlock_checker_test.s:
- $(MAKE) -f CMakeFiles/deadlock_checker_test.dir/build.make CMakeFiles/deadlock_checker_test.dir/deadlock_checker_test.s
-.PHONY : deadlock_checker_test.s
-
-# target to build an object file
-fifo_checker_test.o:
- $(MAKE) -f CMakeFiles/fifo_checker_test.dir/build.make CMakeFiles/fifo_checker_test.dir/fifo_checker_test.o
-.PHONY : fifo_checker_test.o
-
-# target to preprocess a source file
-fifo_checker_test.i:
- $(MAKE) -f CMakeFiles/fifo_checker_test.dir/build.make CMakeFiles/fifo_checker_test.dir/fifo_checker_test.i
-.PHONY : fifo_checker_test.i
-
-# target to generate assembly for a file
-fifo_checker_test.s:
- $(MAKE) -f CMakeFiles/fifo_checker_test.dir/build.make CMakeFiles/fifo_checker_test.dir/fifo_checker_test.s
-.PHONY : fifo_checker_test.s
-
# Help Target
help:
@echo "The following are some of the valid targets for this Makefile:"
@echo "... all (the default if no target is provided)"
@echo "... clean"
@echo "... depend"
- @echo "... deadlock_checker_test"
@echo "... edit_cache"
- @echo "... fifo_checker_test"
@echo "... rebuild_cache"
- @echo "... deadlock_checker_test.o"
- @echo "... deadlock_checker_test.i"
- @echo "... deadlock_checker_test.s"
- @echo "... fifo_checker_test.o"
- @echo "... fifo_checker_test.i"
- @echo "... fifo_checker_test.s"
.PHONY : help
Modified: trunk/src/check/CMakeLists.txt
===================================================================
--- trunk/src/check/CMakeLists.txt 2008-10-12 15:02:42 UTC (rev 112)
+++ trunk/src/check/CMakeLists.txt 2008-10-19 15:53:21 UTC (rev 113)
@@ -1,20 +1,21 @@
#traversers
-ADD_LIBRARY(dfs_area_traverser STATIC dfs_area_traverser.cpp)
+#ADD_LIBRARY(dfs_area_traverser STATIC dfs_area_traverser.cpp)
ADD_LIBRARY(dfs_events_traverser STATIC dfs_events_traverser.cpp)
ADD_LIBRARY(dfs_hmsc_traverser STATIC dfs_hmsc_traverser.cpp)
ADD_LIBRARY(dfs_instance_events_traverser STATIC dfs_instance_events_traverser.cpp)
ADD_LIBRARY(dfs_bmsc_graph_traverser STATIC dfs_bmsc_graph_traverser.cpp)
+ADD_LIBRARY(refnode_finder STATIC refnode_finder.cpp)
#order relation
ADD_LIBRARY(causal_closure_initiator STATIC causal_closure_initiator.cpp)
ADD_LIBRARY(visual_closure_initiator STATIC visual_closure_initiator.cpp)
#checkers
-ADD_LIBRARY(acyclic_checker STATIC acyclic_checker.cpp)
+#ADD_LIBRARY(acyclic_checker STATIC acyclic_checker.cpp)
ADD_LIBRARY(deadlock_checker STATIC deadlock_checker.cpp)
-ADD_LIBRARY(fifo_checker STATIC fifo_checker.cpp)
+#ADD_LIBRARY(fifo_checker STATIC fifo_checker.cpp)
#ADD_LIBRARY(livelock_checker STATIC livelock_checker.cpp)
-ADD_LIBRARY(race_checker STATIC race_checker.cpp)
+#ADD_LIBRARY(race_checker STATIC race_checker.cpp)
#other
-ADD_LIBRARY(footprint STATIC footprint.cpp)
+#ADD_LIBRARY(footprint STATIC footprint.cpp)
Modified: trunk/src/check/checker.h
===================================================================
--- trunk/src/check/checker.h 2008-10-12 15:02:42 UTC (rev 112)
+++ trunk/src/check/checker.h 2008-10-19 15:53:21 UTC (rev 113)
@@ -68,7 +68,7 @@
/**
* Basic abstract class for checking algorithms of HMsc.
*/
-class HMscChecker:public Checker
+class HMscChecker
{
protected:
@@ -100,7 +100,7 @@
/**
* Basic abstract class for checking algorithms of BMsc.
*/
-class BMscChecker:public Checker
+class BMscChecker
{
protected:
Modified: trunk/src/check/deadlock_checker.cpp
===================================================================
--- trunk/src/check/deadlock_checker.cpp 2008-10-12 15:02:42 UTC (rev 112)
+++ trunk/src/check/deadlock_checker.cpp 2008-10-19 15:53:21 UTC (rev 113)
@@ -16,12 +16,37 @@
* $Id$
*/
+#include "dfsb_hmsc_traverser.h"
+
+
#include "check/deadlock_checker.h"
DeadlockCheckerPtr DeadlockChecker::m_instance;
-bool& DeadlockListener::get_deadlock_free(InnerNode* node)
+DeadlockFreeMarker::DeadlockFreeMarker(DeadlockListener* dl):m_dl(dl)
{
+
+}
+
+void DeadlockFreeMarker::on_white_node_found(HMscNode* n)
+{
+ bool& deadlock_free = m_dl->get_deadlock_free(n);
+ deadlock_free = true;
+}
+
+DeadlockListener::DeadlockListener(
+ const std::string& deadlock_free_attribute,
+ const std::string& depth_attribute):
+ m_current_depth(0),
+ m_deadlock_free_attribute(deadlock_free_attribute),
+ m_depth_attribute(depth_attribute),
+ m_marker(this)
+ {
+ m_marker_traverser.add_white_node_found_listener(&m_marker);
+ }
+
+bool& DeadlockListener::get_deadlock_free(HMscNode* node)
+{
bool status;
bool& deadlock_free = node->get_attribute<bool>(m_deadlock_free_attribute,false,status);
if(status)
@@ -31,12 +56,12 @@
return deadlock_free;
}
-size_t& DeadlockListener::get_depth(InnerNode* node)
+size_t& DeadlockListener::get_depth(HMscNode* node)
{
return node->get_attribute<size_t>(m_depth_attribute,0);
}
-void DeadlockListener::on_white_node_found(InnerNode* node)
+void DeadlockListener::on_white_node_found(HMscNode* node)
{
//set depth attribute
m_current_depth++;
@@ -47,13 +72,13 @@
}
//set deadlock free attribute
bool& deadlock_free = get_deadlock_free(node);
- if (node->is_end_node())
+ if (dynamic_cast<EndNode*>(node))
{
mark_deadlock_free(node);
}
}
-void DeadlockListener::on_node_finished(InnerNode* node)
+void DeadlockListener::on_node_finished(HMscNode* node)
{
if (dynamic_cast<ReferenceNode*> (node))
{
@@ -68,7 +93,7 @@
m_current_depth--;
}
-void DeadlockListener::on_gray_node_found(InnerNode* node)
+void DeadlockListener::on_gray_node_found(HMscNode* node)
{
//m_reference_depth can be empty
if (!m_reference_depth.empty())
@@ -76,7 +101,7 @@
//depth of node is surely set (in on_white_node_found())
size_t node_depth = get_depth(node);
size_t top_reference_depth = m_reference_depth.top();
- //there is some ReferenceNode on path from node to previous white InnerNode
+ //there is some ReferenceNode on path from node to previous white HMscNode
if (top_reference_depth >= m_current_depth)
{
mark_deadlock_free(node);
@@ -84,19 +109,9 @@
}
}
-void DeadlockListener::mark_deadlock_free(InnerNode* node)
+void DeadlockListener::mark_deadlock_free(HMscNode* node)
{
- bool& deadlock_free = get_deadlock_free(node);
- deadlock_free = true;
- InnerNodePSet::const_iterator n;
- const InnerNodePSet& preds = node->get_predecessors();
- for (n = preds.begin(); n != preds.end(); n++)
- {
- if (!get_deadlock_free(*n))
- {
- mark_deadlock_free(*n);
- }
- }
+ m_marker_traverser.traverse(node);
}
void DeadlockListener::cleanup_attributes()
@@ -109,36 +124,38 @@
}
}
-HMscPtr DeadlockChecker::create_counter_example(const InnerNodePListList& path)
+HMscPtr DeadlockChecker::create_counter_example(const MscElementPListList& path)
{
- InnerNodePListList::const_iterator hmscs_it;
- HMscPtr result;
- for (hmscs_it = path.begin(); hmscs_it != path.end(); hmscs_it++)
- {
- HMscPtr current_hmsc;
- InnerNode* last_node = NULL;
- InnerNodePList::const_iterator nodes_it;
- for (nodes_it = hmscs_it->begin(); nodes_it != hmscs_it->end(); nodes_it++)
- {
- if (last_node == NULL)
- {
- if (dynamic_cast<ReferenceNode*> (*nodes_it) != NULL)
- last_node = new ReferenceNode((ReferenceNode*) * nodes_it);
- else
- last_node = new ConnectionNode((ConnectionNode*) * nodes_it);
- current_hmsc = new HMsc((*nodes_it)->get_owner());
- current_hmsc->get_start()->add_successor(last_node);
- if (!result.get())
- result = current_hmsc;
- }
- else
- {
- last_node->add_successor(*nodes_it);
- last_node = *nodes_it;
- }
- }
- }
- return result;
+// InnerNodePListList::const_iterator hmscs_it;
+// HMscPtr result;
+// for (hmscs_it = path.begin(); hmscs_it != path.end(); hmscs_it++)
+// {
+// HMscPtr current_hmsc;
+// InnerNode* last_node = NULL;
+// InnerNodePList::const_iterator nodes_it;
+// for (nodes_it = hmscs_it->begin(); nodes_it != hmscs_it->end(); nodes_it++)
+// {
+// if (last_node == NULL)
+// {
+// if (dynamic_cast<ReferenceNode*> (*nodes_it) != NULL)
+// last_node = new ReferenceNode((ReferenceNode*) * nodes_it);
+// else
+// last_node = new ConnectionNode((ConnectionNode*) * nodes_it);
+// current_hmsc = new HMsc((*nodes_it)->get_owner());
+// current_hmsc->get_start()->add_successor(last_node);
+// if (!result.get())
+// result = current_hmsc;
+// }
+// else
+// {
+// last_node->add_successor(*nodes_it);
+// last_node = *nodes_it;
+// }
+// }
+// }
+// return result;
+ HMscPtr example = new HMsc("counter example");
+ return example;
}
HMscPtr DeadlockChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
@@ -156,7 +173,7 @@
}
catch (DeadlockException& e)
{
- p = create_counter_example(traverser.get_reached_nodes());
+ p = create_counter_example(traverser.get_reached_elements());
traverser.cleanup_traversing_attributes();
}
return p;
Modified: trunk/src/check/deadlock_checker.h
===================================================================
--- trunk/src/check/deadlock_checker.h 2008-10-12 15:02:42 UTC (rev 112)
+++ trunk/src/check/deadlock_checker.h 2008-10-19 15:53:21 UTC (rev 113)
@@ -26,6 +26,7 @@
#include "check/dfs_hmsc_traverser.h"
class DeadlockChecker;
+class DeadlockListener;
typedef counted_ptr<DeadlockChecker> DeadlockCheckerPtr;
@@ -40,15 +41,29 @@
}
};
+class DeadlockFreeMarker:public WhiteNodeFoundListener
+{
+
+ DeadlockListener* m_dl;
+
+public:
+
+ DeadlockFreeMarker(DeadlockListener* dl);
+
+ void on_white_node_found(HMscNode* n);
+
+};
+
class DeadlockListener:
public WhiteNodeFoundListener,
public GrayNodeFoundListener,
public NodeFinishedListener
{
+
protected:
/**
- * Depth of last found white InnerNode in Depth First Search tree
+ * Depth of last found white HMscNode in Depth First Search tree
*/
size_t m_current_depth;
@@ -61,40 +76,39 @@
std::string m_depth_attribute;
- InnerNodePList m_modified;
+ HMscNodePList m_modified;
- bool& get_deadlock_free(InnerNode* node);
+ size_t& get_depth(HMscNode* node);
- size_t& get_depth(InnerNode* node);
+ DFSBHMscTraverser m_marker_traverser;
+ DeadlockFreeMarker m_marker;
+
public:
DeadlockListener(
const std::string& deadlock_free_attribute ="dl:deadlock_free",
- const std::string& depth_attribute ="dl:depth")
- {
- m_current_depth = 0;
- m_deadlock_free_attribute = deadlock_free_attribute;
- m_depth_attribute = depth_attribute;
- }
+ const std::string& depth_attribute ="dl:depth");
- void on_white_node_found(InnerNode* node);
+ void on_white_node_found(HMscNode* node);
- void on_node_finished(InnerNode* node);
+ void on_node_finished(HMscNode* node);
- void on_gray_node_found(InnerNode* node);
+ void on_gray_node_found(HMscNode* node);
- void mark_deadlock_free(InnerNode* node);
+ void mark_deadlock_free(HMscNode* node);
void cleanup_attributes();
+ bool& get_deadlock_free(HMscNode* node);
+
~DeadlockListener()
{
cleanup_attributes();
}
};
-class DeadlockChecker: public HMscChecker
+class DeadlockChecker: public Checker, public HMscChecker
{
protected:
@@ -106,7 +120,7 @@
DeadlockChecker(){};
- HMscPtr create_counter_example(const InnerNodePListList& path);
+ HMscPtr create_counter_example(const MscElementPListList& path);
public:
Modified: trunk/src/check/dfs_bmsc_graph_traverser.cpp
===================================================================
--- trunk/src/check/dfs_bmsc_graph_traverser.cpp 2008-10-12 15:02:42 UTC (rev 112)
+++ trunk/src/check/dfs_bmsc_graph_traverser.cpp 2008-10-19 15:53:21 UTC (rev 113)
@@ -20,6 +20,39 @@
#include "check/dfs_bmsc_graph_traverser.h"
+void DFSListenersContainer::white_node_found(HMscNode* n)
+{
+ WhiteNodeFoundListenerPList::iterator l;
+ for(l=m_white_node_found_listeners.begin();l!=m_white_node_found_listeners.end();l++)
+ (*l)->on_white_node_found(n);
+}
+
+void DFSListenersContainer::gray_node_found(HMscNode* n)
+{
+ GrayNodeFoundListenerPList::iterator l;
+ for(l=m_gray_node_found_listeners.begin();l!=m_gray_node_found_listeners.end();l++)
+ (*l)->on_gray_node_found(n);
+}
+
+void DFSListenersContainer::black_node_found(HMscNode* n)
+{
+ BlackNodeFoundListenerPList::iterator l;
+ for(l=m_black_node_found_listeners.begin();l!=m_black_node_found_listeners.end();l++)
+ (*l)->on_black_node_found(n);
+}
+
+void DFSListenersContainer::node_finished(HMscNode* n)
+{
+ NodeFinishedListenerPList::iterator l;
+ for(l=m_node_finished_listeners.begin();l!=m_node_finished_listeners.end();l++)
+ (*l)->on_node_finished(n);
+}
+
+DFSListenersContainer::~DFSListenersContainer()
+{
+
+}
+
DFSBMscGraphTraverser::~DFSBMscGraphTraverser()
{
cleanup_traversing_attributes();
@@ -137,33 +170,25 @@
void DFSBMscGraphTraverser::white_node_found(HMscNode* n)
{
- WhiteNodeFoundListenerPList::iterator l;
- for(l=m_white_node_found_listeners.begin();l!=m_white_node_found_listeners.end();l++)
- (*l)->on_white_node_found(n);
+ DFSListenersContainer::white_node_found(n);
set_color(n,GRAY);
}
void DFSBMscGraphTraverser::gray_node_found(HMscNode* n)
{
- GrayNodeFoundListenerPList::iterator l;
- for(l=m_gray_node_found_listeners.begin();l!=m_gray_node_found_listeners.end();l++)
- (*l)->on_gray_node_found(n);
+ DFSListenersContainer::gray_node_found(n);
m_reached_elements.back().pop_back();
}
void DFSBMscGraphTraverser::black_node_found(HMscNode* n)
{
- BlackNodeFoundListenerPList::iterator l;
- for(l=m_black_node_found_listeners.begin();l!=m_black_node_found_listeners.end();l++)
- (*l)->on_black_node_found(n);
+ DFSListenersContainer::black_node_found(n);
m_reached_elements.back().pop_back();
}
void DFSBMscGraphTraverser::node_finished(HMscNode* n)
{
- NodeFinishedListenerPList::iterator l;
- for(l=m_node_finished_listeners.begin();l!=m_node_finished_listeners.end();l++)
- (*l)->on_node_finished(n);
+ DFSListenersContainer::node_finished(n);
m_reached_elements.back().pop_back();
set_color(n,BLACK);
}
Modified: trunk/src/check/dfs_bmsc_graph_traverser.h
===================================================================
--- trunk/src/check/dfs_bmsc_graph_traverser.h 2008-10-12 15:02:42 UTC (rev 112)
+++ trunk/src/check/dfs_bmsc_graph_traverser.h 2008-10-19 15:53:21 UTC (rev 113)
@@ -199,60 +199,10 @@
typedef BlackNodeFoundListener* BlackNodeFoundListenerP;
typedef std::list<BlackNodeFoundListenerP> BlackNodeFoundListenerPList;
-/**
- * Traverses all accessible HMscNodes in HMsc and referenced HMsc in depth
- * first search manner.
- *
- * HMsc is traversed like BMsc-graph (flattened version of HMsc - each
- * ReferenceNode references only BMsc not HMsc), i.e. each HMsc is traversed as
- * many times as it is referenced. If ReferenceNode references HMsc, this HMsc
- * is traversed before successors of referencing node are processed.
- *
- * HMscNodes of HMsc are during traversing in different states - with different
- * color. WHITE color means that node wasn't traversed before. GRAY nodes
- * are those which have been already traversed and they are just on the stack -
- * not all successors of these events were processed. BLACK nodes are those
- * which have been already traversed but aren't yet on the stack - all
- * successors have been processed.
- *
- * Note that not all HMscNodes must be traversed by this DFSBMscGraphTraverser,
- * imagine HMscNode B which is accessible only from ReferenceNode A but A's
- * HMsc hasn't got any end node.
- *
- * @warning Non-recursive HMsc is expected.
- */
-class DFSBMscGraphTraverser
+class DFSListenersContainer
{
-
public:
-
/**
- * To change default name of attribute which holds color of HMscNodes use
- * color_attribute parameter.
- */
- DFSBMscGraphTraverser(const std::string& color_attribute = "msc_graph_traverse_color")
- {
- m_color_attribute = color_attribute;
- }
-
- /**
- * Calls cleanup_traversing_attributes
- */
- virtual ~DFSBMscGraphTraverser();
-
- /**
- * Trigger of traversing
- */
- virtual void traverse(HMscPtr hmsc);
-
- virtual void traverse(HMscNode* node);
-
- /**
- * Cleans up traversing attributes
- */
- virtual void cleanup_traversing_attributes();
-
- /**
* Adds NodeFinishedListener
*/
void add_node_finished_listener(NodeFinishedListenerP l)
@@ -316,7 +266,112 @@
remove_black_node_found_listeners();
}
+ virtual ~DFSListenersContainer();
+
+protected:
+
/**
+ * Holds listeners
+ */
+ NodeFinishedListenerPList m_node_finished_listeners;
+
+ /**
+ * Holds listeners
+ */
+ WhiteNodeFoundListenerPList m_white_node_found_listeners;
+
+ /**
+ * Holds listeners
+ */
+ GrayNodeFoundListenerPList m_gray_node_found_listeners;
+
+ /**
+ * Holds listeners
+ */
+ BlackNodeFoundListenerPList m_black_node_found_listeners;
+
+ /**
+ * Holds listeners
+ */
+ GrayNodeFoundListenerPList m_grey_node_found_listeners;
+
+ /**
+ * Called when white HMscNode is found.
+ */
+ virtual void white_node_found(HMscNode* n);
+
+ /**
+ * Called when gray HMscNode is found.
+ */
+ virtual void gray_node_found(HMscNode* n);
+
+ /**
+ * Called when black HMscNode is found.
+ */
+ virtual void black_node_found(HMscNode* n);
+
+ /**
+ * Called when all successors of e are processed.
+ */
+ virtual void node_finished(HMscNode* n);
+};
+
+/**
+ * Traverses all accessible HMscNodes in HMsc and referenced HMsc in depth
+ * first search manner.
+ *
+ * HMsc is traversed like BMsc-graph (flattened version of HMsc - each
+ * ReferenceNode references only BMsc not HMsc), i.e. each HMsc is traversed as
+ * many times as it is referenced. If ReferenceNode references HMsc, this HMsc
+ * is traversed before successors of referencing node are processed.
+ *
+ * HMscNodes of HMsc are during traversing in different states - with different
+ * color. WHITE color means that node wasn't traversed before. GRAY nodes
+ * are those which have been already traversed and they are just on the stack -
+ * not all successors of these events were processed. BLACK nodes are those
+ * which have been already traversed but aren't yet on the stack - all
+ * successors have been processed.
+ *
+ * Note that not all HMscNodes must be traversed by this DFSBMscGraphTraverser,
+ * imagine HMscNode B which is accessible only from ReferenceNode A but A's
+ * HMsc hasn't got any end node.
+ *
+ * @warning Non-recursive HMsc is expected.
+ */
+class DFSBMscGraphTraverser:public DFSListenersContainer
+{
+
+public:
+
+ /**
+ * To change default name of attribute which holds color of HMscNodes use
+ * color_attribute parameter.
+ */
+ DFSBMscGraphTraverser(const std::string& color_attribute = "msc_graph_traverse_color")
+ {
+ m_color_attribute = color_attribute;
+ }
+
+ /**
+ * Calls cleanup_traversing_attributes
+ */
+ virtual ~DFSBMscGraphTraverser();
+
+ /**
+ * Trigger of traversing
+ */
+ virtual void traverse(HMscPtr hmsc);
+
+ virtual void traverse(HMscNode* node);
+
+ /**
+ * Cleans up traversing attributes
+ */
+ virtual void cleanup_traversing_attributes();
+
+
+
+ /**
* Returns reached HMscNodes in particular phase of traversing.
*
* The result corresponds to call stack on particular HMscNodes.
@@ -361,38 +416,33 @@
virtual bool is_processed(HMscNode* node);
virtual bool traverse_node(ReferenceNode* node);
-
- /**
- * Holds listeners
- */
- NodeFinishedListenerPList m_node_finished_listeners;
/**
- * Holds listeners
+ * Color attribute's name
*/
- WhiteNodeFoundListenerPList m_white_node_found_listeners;
+ std::string m_color_attribute;
/**
- * Holds listeners
+ * Sets color attribute of e to c value .
*/
- GrayNodeFoundListenerPList m_gray_node_found_listeners;
+ void set_color(HMscNode* n, Color c)
+ {
+ n->set_attribute<Color>(m_color_attribute,c);
+ }
/**
- * Holds listeners
+ * Returns value of color attribute.
+ *
+ * If attribute isn't set it is set to default value WHITE.
*/
- BlackNodeFoundListenerPList m_black_node_found_listeners;
+ Color get_color(HMscNode* n)
+ {
+ return n->get_attribute<Color>(m_color_attribute,WHITE);
+ }
- /**
- * Holds listeners
- */
- GrayNodeFoundListenerPList m_grey_node_found_listeners;
+ virtual void push_top_attributes();
/**
- * Color attribute's name
- */
- std::string m_color_attribute;
-
- /**
* Called when white HMscNode is found.
*/
virtual void white_node_found(HMscNode* n);
@@ -411,28 +461,6 @@
* Called when all successors of e are processed.
*/
virtual void node_finished(HMscNode* n);
-
- /**
- * Sets color attribute of e to c value .
- */
- void set_color(HMscNode* n, Color c)
- {
- n->set_attribute<Color>(m_color_attribute,c);
- }
-
- /**
- * Returns value of color attribute.
- *
- * If attribute isn't set it is set to default value WHITE.
- */
- Color get_color(HMscNode* n)
- {
- return n->get_attribute<Color>(m_color_attribute,WHITE);
- }
-
- virtual void push_top_attributes();
-
-
};
Added: trunk/src/check/dfsb_hmsc_traverser.cpp
===================================================================
--- trunk/src/check/dfsb_hmsc_traverser.cpp (rev 0)
+++ trunk/src/check/dfsb_hmsc_traverser.cpp 2008-10-19 15:53:21 UTC (rev 113)
@@ -0,0 +1,125 @@
+/*
+ * 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 <stack>
+
+#include "check/dfs_bmsc_graph_traverser.h"
+
+DFSBMscGraphTraverser::~DFSBMscGraphTraverser()
+{
+ cleanup_traversing_attributes();
+}
+
+void DFSBMscGraphTraverser::traverse(HMscPtr hmsc)
+{
+ HMscNodePtrSet::const_iterator n;
+ const HMscNodePtrSet& nodes;
+ for(n=nodes.begin();n!=nodes.end();n++)
+ {
+ if(dynamic_cast<EndNode*>((*n).get()))
+ {
+ traverse_node((*n).get());
+ }
+ }
+ cleanup_traversing_attributes();
+}
+
+void DFSBMscGraphTraverser::traverse(HMscNode* node)
+{
+ traverse_node(node);
+ cleanup_traversing_attributes();
+}
+
+bool DFSBMscGraphTraverser::traverse_node(HMscNode* node)
+{
+ m_reached_elements.push_back(node);
+ if(is_processed(node))
+ {
+ return;
+ }
+ white_node_found(node);
+ SuccessorNode* succ = dynamic_cast<SuccessorNode*>(node);
+ if(succ!=NULL)
+ {
+ traverse_predecessors(succ);
+ }
+ node_finished(node);
+}
+
+void DFSBMscGraphTraverser::traverse_predecessors(SuccessorNode* predecessor)
+{
+ NodeRelationPtrSet::const_iterator relation;
+ for(relation=predecessor->get_predecessors().begin();
+ relation!=predecessor->get_predecessors().end();relation++)
+ {
+ const NodeRelationPtr& rel = *relation;
+ m_reached_elements.push_back(rel.get());
+ traverse_node((HMscNode*)rel->get_predecessor());
+ m_reached_elements.pop_back();
+ }
+}
+
+bool DFSBMscGraphTraverser::is_processed(HMscNode* node)
+{
+ Color c = get_color(node);
+ if(c==BLACK)
+ {
+ black_node_found(node);
+ return true;
+ }
+ if(c==GRAY)
+ {
+ gray_node_found(node);
+ return true;
+ }
+ return false;
+}
+
+void DFSBMscGraphTraverser::cleanup_traversing_attributes()
+{
+ for(HMscNode* n=m_colored_nodes.begin();n!=m_colored_nodes.end();n++)
+ (*n)->remove_attribute<Color>(m_color_attribute);
+ m_colored_nodes.erase(m_colored_nodes.begin(),m_colored_nodes.end());
+ m_reached_elements.erase(m_reached_nodes.begin(),m_reached_nodes.end());
+}
+
+void DFSBMscGraphTraverser::white_node_found(HMscNode* n)
+{
+ super.white_node_found(n);
+ set_color(n,GRAY);
+}
+
+void DFSBMscGraphTraverser::gray_node_found(HMscNode* n)
+{
+ super.gray_node_found(n);
+ m_reached_elements.pop_back();
+}
+
+void DFSBMscGraphTraverser::black_node_found(HMscNode* n)
+{
+ super.black_node_found(n);
+ m_reached_elements.pop_back();
+}
+
+void DFSBMscGraphTraverser::node_finished(HMscNode* n)
+{
+ super.node_finished(n);
+ m_reached_elements.back().pop_back();
+ set_color(n,BLACK);
+}
+
Property changes on: trunk/src/check/dfsb_hmsc_traverser.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/src/check/dfsb_hmsc_traverser.h
===================================================================
--- trunk/src/check/dfsb_hmsc_traverser.h (rev 0)
+++ trunk/src/check/dfsb_hmsc_traverser.h 2008-10-19 15:53:21 UTC (rev 113)
@@ -0,0 +1,128 @@
+/*
+ * 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 _DFSB_HMSC_TRAVERSER_H
+#define _DFSB_HMSC_TRAVERSER_H
+
+#include<stack>
+
+#include "data/msc.h"
+#include "check/dfs_bmsc_graph_traverser.h"
+
+/**
+ * Traverses all accessible HMscNodes in single HMsc in depth
+ * first search manner in backward (B in class name) direction.
+ */
+class DFSBHMscTraverser:public DFSListenersContainer
+{
+
+public:
+
+ /**
+ * To change default name of attribute which holds color of HMscNodes use
+ * color_attribute parameter.
+ */
+ DFSBHMscTraverser(const std::string& color_attribute = "dfsb:color")
+ {
+ m_color_attribute = color_attribute;
+ }
+
+ /**
+ * Calls cleanup_traversing_attributes
+ */
+ virtual ~DFSBHMscTraverser();
+
+ /**
+ * Trigger of traversing
+ */
+ virtual void traverse(HMscPtr hmsc);
+
+ virtual void traverse(HMscNode* node);
+
+ /**
+ * Cleans up traversing attributes
+ */
+ virtual void cleanup_traversing_attributes();
+
+ /**
+ * Returns reached HMscNodes in particular phase of traversing.
+ *
+ * The result corresponds to call stack on particular HMscNodes.
+ *
+ * Warning: The result is emptied when cleanup_traversing_attributes() is called
+ */
+ const MscElementPList& ...
[truncated message content] |
|
From: <got...@us...> - 2008-11-12 17:12:25
|
Revision: 116
http://scstudio.svn.sourceforge.net/scstudio/?rev=116&view=rev
Author: gotthardp
Date: 2008-11-12 17:12:14 +0000 (Wed, 12 Nov 2008)
Log Message:
-----------
Added CTest support.
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/tests/CMakeLists.txt
Added Paths:
-----------
trunk/CTestConfig.cmake
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2008-11-12 17:10:25 UTC (rev 115)
+++ trunk/CMakeLists.txt 2008-11-12 17:12:14 UTC (rev 116)
@@ -5,8 +5,12 @@
PROJECT(scstudio C CXX)
#SET(CMAKE_VERBOSE_MAKEFILE ON)
+CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
+INCLUDE(${CMAKE_ROOT}/Modules/Dart.cmake)
+
INCLUDE_DIRECTORIES(src)
ADD_SUBDIRECTORY(src .)
#ADD_SUBDIRECTORY(tests .)
+# $Id: CMakeLists.txt,v 1.7 2008/11/06 15:16:29 gotthardp Exp $
Added: trunk/CTestConfig.cmake
===================================================================
--- trunk/CTestConfig.cmake (rev 0)
+++ trunk/CTestConfig.cmake 2008-11-12 17:12:14 UTC (rev 116)
@@ -0,0 +1,13 @@
+SET(CTEST_PROJECT_NAME "scstudio")
+SET(CTEST_NIGHTLY_START_TIME "00:00:00 EST")
+
+IF(NOT DEFINED CTEST_DROP_METHOD)
+ SET(CTEST_DROP_METHOD "http")
+ENDIF(NOT DEFINED CTEST_DROP_METHOD)
+
+IF(CTEST_DROP_METHOD STREQUAL "http")
+ SET(CTEST_DROP_SITE "www.cdash.org")
+ SET(CTEST_DROP_LOCATION "/CDashPublic/submit.php?project=scstudio")
+ SET(CTEST_TRIGGER_SITE "")
+ set(CTEST_DROP_SITE_CDASH TRUE)
+ENDIF(CTEST_DROP_METHOD STREQUAL "http")
Property changes on: trunk/CTestConfig.cmake
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2008-11-12 17:10:25 UTC (rev 115)
+++ trunk/tests/CMakeLists.txt 2008-11-12 17:12:14 UTC (rev 116)
@@ -1,4 +1,7 @@
+ENABLE_TESTING()
+
ADD_EXECUTABLE(deadlock_checker_test deadlock_checker_test.cpp)
+ADD_TEST(deadlock_checker deadlock_checker_test)
ADD_EXECUTABLE(fifo_checker_test fifo_checker_test.cpp)
TARGET_LINK_LIBRARIES(
@@ -6,6 +9,7 @@
msc fifo_checker
dfs_events_traverser
visual_closure_initiator)
+ADD_TEST(fifo_checker fifo_checker_test)
#ADD_EXECUTABLE(livelock_checker_test livelock_checker_test.cpp)
#TARGET_LINK_LIBRARIES(
@@ -14,4 +18,7 @@
#msc
#dfs_hmsc_traverser
#dfs_msc_graph_traverser)
+ADD_TEST(livelock_checker_checker livelock_checker_test)
+# $Id: CMakeLists.txt,v 1.1 2008/10/28 21:13:20 gotthardp Exp $
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ba...@us...> - 2008-11-16 20:19:40
|
Revision: 117
http://scstudio.svn.sourceforge.net/scstudio/?rev=117&view=rev
Author: babicaj
Date: 2008-11-16 20:19:35 +0000 (Sun, 16 Nov 2008)
Log Message:
-----------
fifo_checker_test and deadlock_checker_test are able to be to compiled and run, livelock_checker_test is comming soon -- tomorrow :)
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/Makefile
trunk/src/check/CMakeLists.txt
trunk/src/check/acyclic_checker.h
trunk/src/check/deadlock_checker.cpp
trunk/src/check/deadlock_checker.h
trunk/src/check/dfs_bmsc_graph_traverser.cpp
trunk/src/check/dfs_bmsc_graph_traverser.h
trunk/src/check/dfs_events_traverser.cpp
trunk/src/check/dfs_hmsc_traverser.cpp
trunk/src/check/dfs_hmsc_traverser.h
trunk/src/check/dfsb_hmsc_traverser.cpp
trunk/src/check/dfsb_hmsc_traverser.h
trunk/src/check/fifo_checker.cpp
trunk/src/check/fifo_checker.h
trunk/src/data/msc.cpp
trunk/src/data/msc.h
trunk/tests/CMakeLists.txt
trunk/tests/deadlock_checker_test.cpp
trunk/tests/fifo_checker_test.cpp
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/CMakeLists.txt 2008-11-16 20:19:35 UTC (rev 117)
@@ -1,6 +1,6 @@
# Process this file with cmake to produce a Makefile.
# cmake .
-# cmake . -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/local
+#cmake . -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/local
PROJECT(scstudio C CXX)
#SET(CMAKE_VERBOSE_MAKEFILE ON)
@@ -10,7 +10,7 @@
INCLUDE_DIRECTORIES(src)
ADD_SUBDIRECTORY(src .)
-#ADD_SUBDIRECTORY(tests .)
+ADD_SUBDIRECTORY(tests .)
# $Id: CMakeLists.txt,v 1.7 2008/11/06 15:16:29 gotthardp Exp $
Modified: trunk/Makefile
===================================================================
--- trunk/Makefile 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/Makefile 2008-11-16 20:19:35 UTC (rev 117)
@@ -67,6 +67,16 @@
rebuild_cache/fast: rebuild_cache
.PHONY : rebuild_cache/fast
+# Special rule for the target test
+test:
+ @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..."
+ /usr/bin/ctest.exe --force-new-ctest-process $(ARGS)
+.PHONY : test
+
+# Special rule for the target test
+test/fast: test
+.PHONY : test/fast
+
# The main all target
all: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /cygdrive/d/projekty/scstudio/CMakeFiles /cygdrive/d/projekty/scstudio/CMakeFiles/progress.make
@@ -98,14 +108,81 @@
$(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend
+# Convenience name for target.
+CMakeFiles/deadlock_checker_test.dir/rule:
+ $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/deadlock_checker_test.dir/rule
+.PHONY : CMakeFiles/deadlock_checker_test.dir/rule
+
+# Convenience name for target.
+deadlock_checker_test: CMakeFiles/deadlock_checker_test.dir/rule
+.PHONY : deadlock_checker_test
+
+# fast build rule for target.
+deadlock_checker_test/fast:
+ $(MAKE) -f CMakeFiles/deadlock_checker_test.dir/build.make CMakeFiles/deadlock_checker_test.dir/build
+.PHONY : deadlock_checker_test/fast
+
+# Convenience name for target.
+CMakeFiles/fifo_checker_test.dir/rule:
+ $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/fifo_checker_test.dir/rule
+.PHONY : CMakeFiles/fifo_checker_test.dir/rule
+
+# Convenience name for target.
+fifo_checker_test: CMakeFiles/fifo_checker_test.dir/rule
+.PHONY : fifo_checker_test
+
+# fast build rule for target.
+fifo_checker_test/fast:
+ $(MAKE) -f CMakeFiles/fifo_checker_test.dir/build.make CMakeFiles/fifo_checker_test.dir/build
+.PHONY : fifo_checker_test/fast
+
+# target to build an object file
+deadlock_checker_test.o:
+ $(MAKE) -f CMakeFiles/deadlock_checker_test.dir/build.make CMakeFiles/deadlock_checker_test.dir/deadlock_checker_test.o
+.PHONY : deadlock_checker_test.o
+
+# target to preprocess a source file
+deadlock_checker_test.i:
+ $(MAKE) -f CMakeFiles/deadlock_checker_test.dir/build.make CMakeFiles/deadlock_checker_test.dir/deadlock_checker_test.i
+.PHONY : deadlock_checker_test.i
+
+# target to generate assembly for a file
+deadlock_checker_test.s:
+ $(MAKE) -f CMakeFiles/deadlock_checker_test.dir/build.make CMakeFiles/deadlock_checker_test.dir/deadlock_checker_test.s
+.PHONY : deadlock_checker_test.s
+
+# target to build an object file
+fifo_checker_test.o:
+ $(MAKE) -f CMakeFiles/fifo_checker_test.dir/build.make CMakeFiles/fifo_checker_test.dir/fifo_checker_test.o
+.PHONY : fifo_checker_test.o
+
+# target to preprocess a source file
+fifo_checker_test.i:
+ $(MAKE) -f CMakeFiles/fifo_checker_test.dir/build.make CMakeFiles/fifo_checker_test.dir/fifo_checker_test.i
+.PHONY : fifo_checker_test.i
+
+# target to generate assembly for a file
+fifo_checker_test.s:
+ $(MAKE) -f CMakeFiles/fifo_checker_test.dir/build.make CMakeFiles/fifo_checker_test.dir/fifo_checker_test.s
+.PHONY : fifo_checker_test.s
+
# Help Target
help:
@echo "The following are some of the valid targets for this Makefile:"
@echo "... all (the default if no target is provided)"
@echo "... clean"
@echo "... depend"
+ @echo "... deadlock_checker_test"
@echo "... edit_cache"
+ @echo "... fifo_checker_test"
@echo "... rebuild_cache"
+ @echo "... test"
+ @echo "... deadlock_checker_test.o"
+ @echo "... deadlock_checker_test.i"
+ @echo "... deadlock_checker_test.s"
+ @echo "... fifo_checker_test.o"
+ @echo "... fifo_checker_test.i"
+ @echo "... fifo_checker_test.s"
.PHONY : help
Modified: trunk/src/check/CMakeLists.txt
===================================================================
--- trunk/src/check/CMakeLists.txt 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/check/CMakeLists.txt 2008-11-16 20:19:35 UTC (rev 117)
@@ -2,18 +2,19 @@
#ADD_LIBRARY(dfs_area_traverser STATIC dfs_area_traverser.cpp)
ADD_LIBRARY(dfs_events_traverser STATIC dfs_events_traverser.cpp)
ADD_LIBRARY(dfs_hmsc_traverser STATIC dfs_hmsc_traverser.cpp)
+ADD_LIBRARY(dfsb_hmsc_traverser STATIC dfsb_hmsc_traverser.cpp)
ADD_LIBRARY(dfs_instance_events_traverser STATIC dfs_instance_events_traverser.cpp)
ADD_LIBRARY(dfs_bmsc_graph_traverser STATIC dfs_bmsc_graph_traverser.cpp)
-ADD_LIBRARY(refnode_finder STATIC refnode_finder.cpp)
+#ADD_LIBRARY(refnode_finder STATIC refnode_finder.cpp)
#order relation
-ADD_LIBRARY(causal_closure_initiator STATIC causal_closure_initiator.cpp)
+#ADD_LIBRARY(causal_closure_initiator STATIC causal_closure_initiator.cpp)
ADD_LIBRARY(visual_closure_initiator STATIC visual_closure_initiator.cpp)
#checkers
#ADD_LIBRARY(acyclic_checker STATIC acyclic_checker.cpp)
ADD_LIBRARY(deadlock_checker STATIC deadlock_checker.cpp)
-#ADD_LIBRARY(fifo_checker STATIC fifo_checker.cpp)
+ADD_LIBRARY(fifo_checker STATIC fifo_checker.cpp)
#ADD_LIBRARY(livelock_checker STATIC livelock_checker.cpp)
#ADD_LIBRARY(race_checker STATIC race_checker.cpp)
Modified: trunk/src/check/acyclic_checker.h
===================================================================
--- trunk/src/check/acyclic_checker.h 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/check/acyclic_checker.h 2008-11-16 20:19:35 UTC (rev 117)
@@ -59,7 +59,7 @@
};
-class AcyclicChecker: public BMscChecker
+class AcyclicChecker: public Checker, public BMscChecker
{
protected:
Modified: trunk/src/check/deadlock_checker.cpp
===================================================================
--- trunk/src/check/deadlock_checker.cpp 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/check/deadlock_checker.cpp 2008-11-16 20:19:35 UTC (rev 117)
@@ -39,9 +39,9 @@
const std::string& depth_attribute):
m_current_depth(0),
m_deadlock_free_attribute(deadlock_free_attribute),
- m_depth_attribute(depth_attribute),
- m_marker(this)
+ m_depth_attribute(depth_attribute)
{
+ m_marker = DeadlockFreeMarker(this);
m_marker_traverser.add_white_node_found_listener(&m_marker);
}
@@ -80,10 +80,10 @@
void DeadlockListener::on_node_finished(HMscNode* node)
{
- if (dynamic_cast<ReferenceNode*> (node))
+ if (dynamic_cast<ReferenceNode*> (node) ||
+ dynamic_cast<StartNode*> (node))
{
- bool& deadlock_free = get_deadlock_free(node);
- if (!deadlock_free)
+ if (!get_deadlock_free(node))
{
throw DeadlockException();
}
Modified: trunk/src/check/deadlock_checker.h
===================================================================
--- trunk/src/check/deadlock_checker.h 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/check/deadlock_checker.h 2008-11-16 20:19:35 UTC (rev 117)
@@ -24,6 +24,7 @@
#include "data/msc.h"
#include "data/counted_ptr.h"
#include "check/dfs_hmsc_traverser.h"
+#include "check/dfsb_hmsc_traverser.h"
class DeadlockChecker;
class DeadlockListener;
@@ -48,7 +49,7 @@
public:
- DeadlockFreeMarker(DeadlockListener* dl);
+ DeadlockFreeMarker(DeadlockListener* dl=NULL);
void on_white_node_found(HMscNode* n);
@@ -78,12 +79,12 @@
HMscNodePList m_modified;
- size_t& get_depth(HMscNode* node);
-
DFSBHMscTraverser m_marker_traverser;
DeadlockFreeMarker m_marker;
+ size_t& get_depth(HMscNode* node);
+
public:
DeadlockListener(
Modified: trunk/src/check/dfs_bmsc_graph_traverser.cpp
===================================================================
--- trunk/src/check/dfs_bmsc_graph_traverser.cpp 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/check/dfs_bmsc_graph_traverser.cpp 2008-11-16 20:19:35 UTC (rev 117)
@@ -83,7 +83,7 @@
ReferenceNode* ref_node = dynamic_cast<ReferenceNode*>(node);
if(ref_node!=NULL)
{
- return traverse_node(ref_node);
+ return traverse_reference_node(ref_node);
}
else
{
@@ -111,7 +111,7 @@
}
}
-bool DFSBMscGraphTraverser::traverse_node(ReferenceNode* ref_node)
+bool DFSBMscGraphTraverser::traverse_reference_node(ReferenceNode* ref_node)
{
HMscPtr hmsc = ref_node->get_hmsc();
bool inner = true;
@@ -121,7 +121,7 @@
//as it is referenced
push_top_attributes();
//node's successors aren't traversed if end node wasn't found in hmsc
- inner = traverse_successors(hmsc->get_start().get());
+ inner = traverse_node(hmsc->get_start().get());
//this line ensures (yet another one) that HMsc will traversed as many times
//as it is referenced
cleanup_top_attributes();
@@ -138,7 +138,7 @@
{
const NodeRelationPtr& rel = *relation;
m_reached_elements.back().push_back(rel.get());
- end_found = traverse_node((HMscNode*)rel->get_successor()) || end_found;
+ end_found = traverse_node(dynamic_cast<HMscNode*>(rel->get_successor())) || end_found;
m_reached_elements.back().pop_back();
}
return end_found;
Modified: trunk/src/check/dfs_bmsc_graph_traverser.h
===================================================================
--- trunk/src/check/dfs_bmsc_graph_traverser.h 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/check/dfs_bmsc_graph_traverser.h 2008-11-16 20:19:35 UTC (rev 117)
@@ -415,7 +415,7 @@
*/
virtual bool is_processed(HMscNode* node);
- virtual bool traverse_node(ReferenceNode* node);
+ virtual bool traverse_reference_node(ReferenceNode* node);
/**
* Color attribute's name
Modified: trunk/src/check/dfs_events_traverser.cpp
===================================================================
--- trunk/src/check/dfs_events_traverser.cpp 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/check/dfs_events_traverser.cpp 2008-11-16 20:19:35 UTC (rev 117)
@@ -39,6 +39,7 @@
void DFSEventsTraverser::traverse_area(EventArea* area)
{
+ if(!area) return;
StrictOrderArea* strict = dynamic_cast<StrictOrderArea*>(area);
if(strict)
{
@@ -65,9 +66,9 @@
void DFSEventsTraverser::traverse_strict_event(StrictEvent* event)
{
+ m_reached_elements.push_back(event);
if(!is_processed(event))
{
- m_reached_elements.push_back(event);
traverse_matching_event(event);
if(event->get_successor().get())
traverse_strict_event(event->get_successor().get());
Modified: trunk/src/check/dfs_hmsc_traverser.cpp
===================================================================
--- trunk/src/check/dfs_hmsc_traverser.cpp 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/check/dfs_hmsc_traverser.cpp 2008-11-16 20:19:35 UTC (rev 117)
@@ -18,13 +18,13 @@
#include "check/dfs_hmsc_traverser.h"
-bool DFSHMscTraverser::traverse_node(ReferenceNode* ref_node)
+bool DFSHMscTraverser::traverse_reference_node(ReferenceNode* ref_node)
{
HMscPtr hmsc = ref_node->get_hmsc();
if(hmsc.get()!=NULL)
{
m_reached_elements.push_back(MscElementPList());
- traverse_successors(hmsc->get_start().get());
+ traverse_node(hmsc->get_start().get());
m_reached_elements.pop_back();
}
Modified: trunk/src/check/dfs_hmsc_traverser.h
===================================================================
--- trunk/src/check/dfs_hmsc_traverser.h 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/check/dfs_hmsc_traverser.h 2008-11-16 20:19:35 UTC (rev 117)
@@ -36,7 +36,7 @@
protected:
- bool traverse_node(ReferenceNode* node);
+ bool traverse_reference_node(ReferenceNode* node);
public:
Modified: trunk/src/check/dfsb_hmsc_traverser.cpp
===================================================================
--- trunk/src/check/dfsb_hmsc_traverser.cpp 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/check/dfsb_hmsc_traverser.cpp 2008-11-16 20:19:35 UTC (rev 117)
@@ -18,17 +18,17 @@
#include <stack>
-#include "check/dfs_bmsc_graph_traverser.h"
+#include "check/dfsb_hmsc_traverser.h"
-DFSBMscGraphTraverser::~DFSBMscGraphTraverser()
+DFSBHMscTraverser::~DFSBHMscTraverser()
{
cleanup_traversing_attributes();
}
-void DFSBMscGraphTraverser::traverse(HMscPtr hmsc)
+void DFSBHMscTraverser::traverse(HMscPtr hmsc)
{
HMscNodePtrSet::const_iterator n;
- const HMscNodePtrSet& nodes;
+ const HMscNodePtrSet& nodes = hmsc->get_nodes();
for(n=nodes.begin();n!=nodes.end();n++)
{
if(dynamic_cast<EndNode*>((*n).get()))
@@ -39,18 +39,18 @@
cleanup_traversing_attributes();
}
-void DFSBMscGraphTraverser::traverse(HMscNode* node)
+void DFSBHMscTraverser::traverse(HMscNode* node)
{
traverse_node(node);
cleanup_traversing_attributes();
}
-bool DFSBMscGraphTraverser::traverse_node(HMscNode* node)
+bool DFSBHMscTraverser::traverse_node(HMscNode* node)
{
m_reached_elements.push_back(node);
if(is_processed(node))
{
- return;
+ return false;
}
white_node_found(node);
SuccessorNode* succ = dynamic_cast<SuccessorNode*>(node);
@@ -59,22 +59,23 @@
traverse_predecessors(succ);
}
node_finished(node);
+ return false;
}
-void DFSBMscGraphTraverser::traverse_predecessors(SuccessorNode* predecessor)
+void DFSBHMscTraverser::traverse_predecessors(SuccessorNode* succ)
{
NodeRelationPtrSet::const_iterator relation;
- for(relation=predecessor->get_predecessors().begin();
- relation!=predecessor->get_predecessors().end();relation++)
+ for(relation=succ->get_predecessors().begin();
+ relation!=succ->get_predecessors().end();relation++)
{
const NodeRelationPtr& rel = *relation;
m_reached_elements.push_back(rel.get());
- traverse_node((HMscNode*)rel->get_predecessor());
+ traverse_node(dynamic_cast<HMscNode*>(rel->get_predecessor()));
m_reached_elements.pop_back();
}
}
-bool DFSBMscGraphTraverser::is_processed(HMscNode* node)
+bool DFSBHMscTraverser::is_processed(HMscNode* node)
{
Color c = get_color(node);
if(c==BLACK)
@@ -90,36 +91,37 @@
return false;
}
-void DFSBMscGraphTraverser::cleanup_traversing_attributes()
+void DFSBHMscTraverser::cleanup_traversing_attributes()
{
- for(HMscNode* n=m_colored_nodes.begin();n!=m_colored_nodes.end();n++)
+ HMscNodePList::const_iterator n;
+ for(n=m_colored_nodes.begin();n!=m_colored_nodes.end();n++)
(*n)->remove_attribute<Color>(m_color_attribute);
m_colored_nodes.erase(m_colored_nodes.begin(),m_colored_nodes.end());
- m_reached_elements.erase(m_reached_nodes.begin(),m_reached_nodes.end());
+ m_reached_elements.erase(m_reached_elements.begin(),m_reached_elements.end());
}
-void DFSBMscGraphTraverser::white_node_found(HMscNode* n)
+void DFSBHMscTraverser::white_node_found(HMscNode* n)
{
- super.white_node_found(n);
+ DFSListenersContainer::white_node_found(n);
set_color(n,GRAY);
}
-void DFSBMscGraphTraverser::gray_node_found(HMscNode* n)
+void DFSBHMscTraverser::gray_node_found(HMscNode* n)
{
- super.gray_node_found(n);
+ DFSListenersContainer::gray_node_found(n);
m_reached_elements.pop_back();
}
-void DFSBMscGraphTraverser::black_node_found(HMscNode* n)
+void DFSBHMscTraverser::black_node_found(HMscNode* n)
{
- super.black_node_found(n);
+ DFSListenersContainer::black_node_found(n);
m_reached_elements.pop_back();
}
-void DFSBMscGraphTraverser::node_finished(HMscNode* n)
+void DFSBHMscTraverser::node_finished(HMscNode* n)
{
- super.node_finished(n);
- m_reached_elements.back().pop_back();
+ DFSListenersContainer::node_finished(n);
+ m_reached_elements.pop_back();
set_color(n,BLACK);
}
Modified: trunk/src/check/dfsb_hmsc_traverser.h
===================================================================
--- trunk/src/check/dfsb_hmsc_traverser.h 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/check/dfsb_hmsc_traverser.h 2008-11-16 20:19:35 UTC (rev 117)
@@ -76,7 +76,7 @@
/**
* Holds nodes with set color attribute
*/
- HMscNodePListList m_colored_nodes;
+ HMscNodePList m_colored_nodes;
/**
* Holds currently reached HMscElements.
@@ -89,9 +89,9 @@
virtual bool traverse_node(HMscNode* node);
/**
- * Traverses successors
+ * Traverses predecessors of succ
*/
- virtual bool traverse_predecessors(SuccessorNode* predecessor);
+ virtual void traverse_predecessors(SuccessorNode* succ);
/**
* Returns true iff node is already processed false otherwise
@@ -120,6 +120,14 @@
{
return n->get_attribute<Color>(m_color_attribute,WHITE);
}
+
+ void white_node_found(HMscNode* n);
+
+ void gray_node_found(HMscNode* n);
+
+ void black_node_found(HMscNode* n);
+
+ void node_finished(HMscNode* n);
};
Modified: trunk/src/check/fifo_checker.cpp
===================================================================
--- trunk/src/check/fifo_checker.cpp 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/check/fifo_checker.cpp 2008-11-16 20:19:35 UTC (rev 117)
@@ -25,7 +25,7 @@
BMsc* FifoChecker::create_counter_example(Event* receive_1, Event* receive_2)
{
BMsc* bmsc = new BMsc(receive_1->get_instance()->get_bmsc());
- InstancePtr send_instance(new Instance(bmsc,receive_1->get_matching_event()->get_instance()));
+/* InstancePtr send_instance(new Instance(bmsc,receive_1->get_matching_event()->get_instance()));
InstancePtr receive_instance(new Instance(bmsc,receive_1->get_instance()));
bmsc->add_instance(send_instance);
bmsc->add_instance(receive_instance);
@@ -44,7 +44,7 @@
send_area->set_first(send1);
send1->set_successor(send2);
send_area->set_first(receive2);
- receive2->set_successor(receive1);
+ receive2->set_successor(receive1);*/
return bmsc;
}
Modified: trunk/src/check/fifo_checker.h
===================================================================
--- trunk/src/check/fifo_checker.h 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/check/fifo_checker.h 2008-11-16 20:19:35 UTC (rev 117)
@@ -58,8 +58,7 @@
{
BoolVector& e1_closure = initiator.get_visual_closure(e1);
size_t e2_index = initiator.get_topology_index(e2);
- if(!e1_closure[e2_index]) return false;
- return true;
+ return e1_closure[e2_index];
}
public:
Modified: trunk/src/data/msc.cpp
===================================================================
--- trunk/src/data/msc.cpp 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/data/msc.cpp 2008-11-16 20:19:35 UTC (rev 117)
@@ -21,11 +21,12 @@
#include "data/msc.h"
-void SuccessorNode::add_predecessor(NodeRelationPtr& n)
+NodeRelationPtr SuccessorNode::add_predecessor(PredecessorNode* pred)
{
- n->set_successor(this);
+ NodeRelationPtr n(new NodeRelation(pred,this));
m_predecessors.insert(n);
- n->get_predecessor()->m_successors.insert(n);
+ pred->m_successors.insert(n);
+ return n;
}
void SuccessorNode::remove_predecessor(NodeRelationPtr& n)
@@ -34,11 +35,12 @@
n->get_predecessor()->m_successors.erase(n);
}
-void PredecessorNode::add_successor(NodeRelationPtr& n)
+NodeRelationPtr PredecessorNode::add_successor(SuccessorNode* succ)
{
- n->set_predecessor(this);
+ NodeRelationPtr n(new NodeRelation(this,succ));
m_successors.insert(n);
- n->get_successor()->m_predecessors.insert(n);
+ succ->m_predecessors.insert(n);
+ return n;
}
void PredecessorNode::remove_successor(NodeRelationPtr& n)
@@ -56,23 +58,15 @@
return m_owner->find_ptr(this);
}
-inline StrictOrderArea* StrictEvent::get_strict_order_area()
+/*inline StrictOrderArea* StrictEvent::get_strict_order_area()
{
return dynamic_cast<StrictOrderArea*>(m_area);
-}
+}*/
CoregionArea::~CoregionArea()
{
}
-void CoregionArea::add_event(CoregionEventPtr e)
-{
- //TODO: check whether it is possible to insert e
- m_events.insert(e);
- add_minimal_event(e.get());
- add_maximal_event(e.get());
-}
-
CoregionEvent::~CoregionEvent()
{
@@ -112,3 +106,23 @@
{
return m_receive_event->get_instance();
}
+
+void BMsc::add_instance(InstancePtr& i)
+{
+ m_instances.push_back(i);
+ i->set_bmsc(this);
+}
+
+void Instance::add_area(EventAreaPtr& area)
+{
+ if(!is_empty())
+ {
+ m_last->set_next(area);
+ }
+ else
+ {
+ m_first = area;
+ }
+ m_last = area;
+ area->set_instance(this);
+}
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2008-11-12 17:12:14 UTC (rev 116)
+++ trunk/src/data/msc.h 2008-11-16 20:19:35 UTC (rev 117)
@@ -130,8 +130,6 @@
m_marked = marked;
}
- virtual ~MscElement();
-
public:
/**
@@ -260,6 +258,11 @@
{
m_marked = marked;
}
+
+ virtual ~MscElement()
+ {
+
+ }
};
template <class T>
@@ -309,6 +312,11 @@
{
m_original = e;
}
+
+ virtual ~MscElementTmpl()
+ {
+
+ }
};
/**
@@ -324,22 +332,20 @@
*/
std::string m_label;
- Msc(Msc* original=NULL):MscElementTmpl<Msc>(original)
+ Msc(const std::string& label=""):m_label(label)
{
-
}
- /**
- * Initializes m_label.
- */
- Msc(const std::string& label)
+ Msc(Msc* original):MscElementTmpl<Msc>(original)
{
- m_label = label;
}
public:
- virtual ~Msc();
+ virtual ~Msc()
+ {
+
+ }
/**
* Getter for m_label
@@ -376,12 +382,10 @@
BMsc(const std::string& label=""):Msc(label)
{
}
-
- /**
- * Creates BMsc referencing original version of BMsc.
- */
- BMsc(BMsc* original=NULL):Msc(original)
+
+ BMsc(BMsc* original):Msc(original)
{
+
}
virtual ~BMsc()
@@ -392,10 +396,7 @@
/**
* Adds instance.
*/
- void add_instance(InstancePtr& i)
- {
- m_instances.push_back(i);
- }
+ void add_instance(InstancePtr& i);
/**
* Getter for m_instances.
@@ -461,7 +462,9 @@
HMscNodePtr my_ptr();
- virtual ~HMscNode();
+ virtual ~HMscNode()
+ {
+ }
};
@@ -477,12 +480,11 @@
public:
- NodeRelation(SuccessorNode* successor, PredecessorNode* predecessor,
- const PolyLine& line):MscElementTmpl<NodeRelation>()
+ NodeRelation(PredecessorNode* predecessor,SuccessorNode* successor)
+ :MscElementTmpl<NodeRelation>()
{
m_successor = successor;
m_predecessor = predecessor;
- m_line = line;
}
SuccessorNode* get_successor()
@@ -537,7 +539,7 @@
return m_predecessors;
}
- void add_predecessor(NodeRelationPtr& n);
+ NodeRelationPtr add_predecessor(PredecessorNode* pred);
void remove_predecessor(NodeRelationPtr& n);
@@ -582,7 +584,7 @@
/**
* Adds successor.
*/
- void add_successor(NodeRelationPtr& n);
+ NodeRelationPtr add_successor(SuccessorNode* succ);
/**
* Removes successor.
@@ -610,8 +612,6 @@
{
public:
- EndNode()
- {}
EndNode(EndNode* original=NULL):HMscNode(original),SuccessorNode()
{}
@@ -663,28 +663,23 @@
public:
- /**
- * Initializes mandatory m_start
- */
+ HMsc(const std::string& label=""):Msc(label)
+ {
+ // Creating start for new HMsc, setting its original and owner
+ m_start = new StartNode();
+ m_start->set_owner(this);
+ }
+
HMsc(HMsc* original):Msc(original)
{
// Creating start for new HMsc, setting its original and owner
m_start = new StartNode(original->get_start().get());
m_start->set_owner(this);
}
-
- /**
- * Initializes m_label
- */
- HMsc(const std::string& label):Msc(label)
+
+ virtual ~HMsc()
{
- m_start = new StartNode;
- m_start->set_owner(this);
}
- /**
- * Removes all nodes inside
- */
- virtual ~HMsc();
/**
* Getter for m_start.
@@ -831,6 +826,8 @@
*/
class Instance:public MscElementTmpl<Instance>
{
+
+protected:
/**
* Label of instance -- name of concrete instance
@@ -853,6 +850,11 @@
EventAreaPtr m_first;
/**
+ * EventAreas which occure at instance as first one.
+ */
+ EventAreaPtr m_last;
+
+ /**
* BMsc whic this instance belongs to
*
* @warning counted_ptr mustn't be used because of possible cyclic dependency
@@ -866,24 +868,13 @@
public:
/**
- * @param msc - BMsc which Instance will occure in
* @param label - label of instance
*/
- Instance(BMsc* msc, const std::string& label)
+ Instance(const std::string& label, const std::string& kind="", Instance* original=NULL):
+ MscElementTmpl<Instance>(original),m_label(label),m_kind(kind)
{
- m_bmsc = msc;
- m_label = label;
}
- /**
- * @param msc - BMsc which Instance will occure in
- * @param original - original Instance, used when creating counter example
- */
- Instance(BMsc* msc, Instance* original):MscElementTmpl<Instance>(original)
- {
- m_bmsc = msc;
- }
-
virtual ~Instance()
{
@@ -912,23 +903,45 @@
return m_label;
}
+ void set_last(EventAreaPtr a)
+ {
+ m_last = a;
+ }
+
+ EventAreaPtr get_last()
+ {
+ return m_last;
+ }
+
/**
* Getter for m_bmsc
*/
- BMsc* get_bmsc()
+ BMsc* get_bmsc() const
{
return m_bmsc;
}
- Size get_height()
+ void set_bmsc(BMsc* bmsc)
{
+ m_bmsc = bmsc;
+ }
+
+ Size get_height() const
+ {
return m_height;
}
- void set_height(Size height)
+ void set_height(const Size& height)
{
m_height = height;
}
+
+ void add_area(EventAreaPtr& area);
+
+ bool is_empty()
+ {
+ return !m_last.get();
+ }
};
@@ -967,6 +980,11 @@
{
return m_label;
}
+
+ void set_label(const std::string& label)
+ {
+ m_label = label;
+ }
};
@@ -994,8 +1012,8 @@
* @param receiver - receiving event
* @param label - label of message
*/
- CompleteMessage(const std::string& label):
- MscMessage(label),m_send_event(NULL),m_receive_event(NULL)
+ CompleteMessage(Event* sender, Event* receiver, const std::string& label=""):
+ MscMessage(label),m_send_event(sender),m_receive_event(receiver)
{
}
@@ -1099,6 +1117,13 @@
typedef counted_ptr<IncompleteMessage> IncompleteMessagePtr;
+typedef enum
+{
+ BEFORE,
+ AFTER
+}
+EventPosition;
+
/**
* \brief Event which occurs in EventArea.
*/
@@ -1149,6 +1174,11 @@
}
}
}
+
+ void set_message(MscMessagePtr& message)
+ {
+ m_message = message;
+ }
/**
* Getter for m_message.
@@ -1285,6 +1315,34 @@
}
}
}
+
+ CompleteMessagePtr send_message(
+ Event* receive_event, const std::string& message_label="")
+ {
+ if(!receive_event) return CompleteMessagePtr();
+ MscMessagePtr message(new CompleteMessage(this,receive_event,message_label));
+ set_message(message);
+ receive_event->set_message(message);
+ return message;
+ }
+
+ IncompleteMessagePtr lose_message(
+ const std::string& message_label="", const std::string& instance_label="")
+ {
+ MscMessagePtr message(
+ new IncompleteMessage(LOST,message_label,instance_label));
+ set_message(message);
+ return message;
+ }
+
+ IncompleteMessagePtr find_message(
+ const std::string& message_label="", const std::string& instance_label="")
+ {
+ MscMessagePtr message(
+ new IncompleteMessage(FOUND,message_label,instance_label));
+ set_message(message);
+ return message;
+ }
};
@@ -1324,11 +1382,16 @@
m_area = area;
}
- Instance* get_instance()
+ Instance* get_instance() const
{
return m_area->get_instance();
}
+ EventArea* get_general_area()
+ {
+ return m_area;
+ }
+
};
/**
@@ -1406,11 +1469,6 @@
{
return m_successor==NULL;
}
-
- /**
- * Returns overcasted m_area
- */
- StrictOrderArea* get_strict_order_area();
};
class CoregionEventRelation:public MscElementTmpl<CoregionEventRelation>
@@ -1426,7 +1484,7 @@
public:
CoregionEventRelation(CoregionEvent* predecessor, CoregionEvent* successor,
- const PolyLine& line = NULL):MscElementTmpl<CoregionEventRelation>()
+ const PolyLine& line = PolyLine()):MscElementTmpl<CoregionEventRelation>()
{
m_predecessor = predecessor;
m_successor = successor;
@@ -1572,22 +1630,14 @@
*/
Instance* m_instance;
- EventArea()
- {
- m_previous = NULL;
- }
-
/**
* @param instance - Instance which this EventArea will occure at
*/
- EventArea(Instance* instance)
+ EventArea(EventArea* original):MscElementTmpl<EventArea>(original),
+ m_previous(NULL),m_instance(NULL),m_next()
{
- m_previous = NULL;
- m_instance = instance;
}
-
-
public:
virtual ~EventArea(){}
@@ -1611,10 +1661,15 @@
/**
* Getter for m_instance
*/
- Instance* get_instance()
+ Instance* get_instance() const
{
return m_instance;
}
+
+ void set_instance(Instance* instance)
+ {
+ m_instance = instance;
+ }
/**
* Getter for m_previous
@@ -1646,6 +1701,11 @@
{
m_height=height;
}
+
+ /**
+ * Adds event into this area....
[truncated message content] |
|
From: <ba...@us...> - 2008-11-17 19:46:28
|
Revision: 119
http://scstudio.svn.sourceforge.net/scstudio/?rev=119&view=rev
Author: babicaj
Date: 2008-11-17 19:46:26 +0000 (Mon, 17 Nov 2008)
Log Message:
-----------
livelock_checker_test should be able to be compiled, memory leaks found in regress tests should be removed, new dfs_refnode_hmsc_traverser was added - see comments in header file for details, fifo_checker_test was modified to comply with tests
Modified Paths:
--------------
trunk/src/check/CMakeLists.txt
trunk/src/check/dfs_bmsc_graph_traverser.cpp
trunk/src/check/dfs_bmsc_graph_traverser.h
trunk/src/check/livelock_checker.cpp
trunk/src/check/livelock_checker.h
trunk/src/check/refnode_finder.cpp
trunk/src/check/refnode_finder.h
trunk/src/check/visual_closure_initiator.cpp
trunk/src/check/visual_closure_initiator.h
trunk/tests/CMakeLists.txt
trunk/tests/fifo_checker_test.cpp
trunk/tests/livelock_checker_test.cpp
Added Paths:
-----------
trunk/src/check/dfs_refnode_hmsc_traverser.cpp
trunk/src/check/dfs_refnode_hmsc_traverser.h
Modified: trunk/src/check/CMakeLists.txt
===================================================================
--- trunk/src/check/CMakeLists.txt 2008-11-16 21:58:38 UTC (rev 118)
+++ trunk/src/check/CMakeLists.txt 2008-11-17 19:46:26 UTC (rev 119)
@@ -5,7 +5,7 @@
ADD_LIBRARY(dfsb_hmsc_traverser STATIC dfsb_hmsc_traverser.cpp)
ADD_LIBRARY(dfs_instance_events_traverser STATIC dfs_instance_events_traverser.cpp)
ADD_LIBRARY(dfs_bmsc_graph_traverser STATIC dfs_bmsc_graph_traverser.cpp)
-#ADD_LIBRARY(refnode_finder STATIC refnode_finder.cpp)
+ADD_LIBRARY(refnode_finder STATIC refnode_finder.cpp)
#order relation
#ADD_LIBRARY(causal_closure_initiator STATIC causal_closure_initiator.cpp)
@@ -15,7 +15,7 @@
#ADD_LIBRARY(acyclic_checker STATIC acyclic_checker.cpp)
ADD_LIBRARY(deadlock_checker STATIC deadlock_checker.cpp)
ADD_LIBRARY(fifo_checker STATIC fifo_checker.cpp)
-#ADD_LIBRARY(livelock_checker STATIC livelock_checker.cpp)
+ADD_LIBRARY(livelock_checker STATIC livelock_checker.cpp)
#ADD_LIBRARY(race_checker STATIC race_checker.cpp)
#other
Modified: trunk/src/check/dfs_bmsc_graph_traverser.cpp
===================================================================
--- trunk/src/check/dfs_bmsc_graph_traverser.cpp 2008-11-16 21:58:38 UTC (rev 118)
+++ trunk/src/check/dfs_bmsc_graph_traverser.cpp 2008-11-17 19:46:26 UTC (rev 119)
@@ -209,3 +209,14 @@
m_reached_elements.push_back(MscElementPList());
}
+Color DFSBMscGraphTraverser::get_color(HMscNode* n)
+{
+ bool just_set;
+ Color c = n->get_attribute<Color>(m_color_attribute,WHITE,just_set);
+ if(just_set)
+ {
+ m_colored_nodes.back().push_back(n);
+ }
+ return c;
+}
+
Modified: trunk/src/check/dfs_bmsc_graph_traverser.h
===================================================================
--- trunk/src/check/dfs_bmsc_graph_traverser.h 2008-11-16 21:58:38 UTC (rev 118)
+++ trunk/src/check/dfs_bmsc_graph_traverser.h 2008-11-17 19:46:26 UTC (rev 119)
@@ -435,10 +435,7 @@
*
* If attribute isn't set it is set to default value WHITE.
*/
- Color get_color(HMscNode* n)
- {
- return n->get_attribute<Color>(m_color_attribute,WHITE);
- }
+ Color get_color(HMscNode* n);
virtual void push_top_attributes();
Added: trunk/src/check/dfs_refnode_hmsc_traverser.cpp
===================================================================
--- trunk/src/check/dfs_refnode_hmsc_traverser.cpp (rev 0)
+++ trunk/src/check/dfs_refnode_hmsc_traverser.cpp 2008-11-17 19:46:26 UTC (rev 119)
@@ -0,0 +1,34 @@
+/*
+ * 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: dfs_hmsc_traverser.h 117 2008-11-16 20:19:35Z babicaj $
+ */
+
+#include "dfs_refnode_hmsc_traverser.h"
+
+bool DFSRefNodeHMscTraverser::traverse_successors(PredecessorNode* predecessor)
+{
+ bool end_found = false;
+ HMscNodePListPtr successors = m_finder.find_successors(dynamic_cast<HMscNode*>(predecessor));
+ m_finder.cleanup_traversing_attributes();
+ //TODO: m_reached_elements should contain path to succ
+ HMscNodePList::const_iterator succ;
+ for(succ=successors->begin();succ!=successors->end();succ++)
+ {
+ end_found = traverse_node(*succ) || end_found;
+ }
+ return end_found;
+}
+
Added: trunk/src/check/dfs_refnode_hmsc_traverser.h
===================================================================
--- trunk/src/check/dfs_refnode_hmsc_traverser.h (rev 0)
+++ trunk/src/check/dfs_refnode_hmsc_traverser.h 2008-11-17 19:46:26 UTC (rev 119)
@@ -0,0 +1,61 @@
+/*
+ * 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: dfs_hmsc_traverser.h 117 2008-11-16 20:19:35Z babicaj $
+ */
+
+#ifndef _DFS_REFNODE_HMSC_TRAVERSER_H
+#define _DFS_REFNODE_HMSC_TRAVERSER_H
+
+#include "check/dfs_bmsc_graph_traverser.h"
+#include "check/refnode_finder.h"
+
+
+/**
+ * Traverses nodes in HMsc and referenced HMsc in depth first
+ * search manner like DFSBMscGraphTraverser. Unlike DFSBMscGraphTraverser
+ * this traverser handles ConnectionNodes like it would be
+ * 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 DFSRefNodeHMscTraverser:
+ public DFSBMscGraphTraverser,public WhiteNodeFoundListener,
+ public GrayNodeFoundListener,public BlackNodeFoundListener,
+ public NodeFinishedListener
+{
+
+protected:
+
+ bool traverse_successors(PredecessorNode* predecessor);
+ ReferenceNodeFinder m_finder;
+
+public:
+
+ DFSRefNodeHMscTraverser(
+ const std::string& color_attribute = "DFSRNHMT_color"):
+ DFSBMscGraphTraverser(color_attribute)
+ {
+
+ }
+
+ void cleanup_traversing_attributes();
+
+};
+
+
+#endif /* _DFS_REFNODE_HMSC_TRAVERSER_H */
+
Modified: trunk/src/check/livelock_checker.cpp
===================================================================
--- trunk/src/check/livelock_checker.cpp 2008-11-16 21:58:38 UTC (rev 118)
+++ trunk/src/check/livelock_checker.cpp 2008-11-17 19:46:26 UTC (rev 119)
@@ -18,95 +18,117 @@
#include "check/livelock_checker.h"
-const std::string LivelockListener::m_reachable_attribute = "livelock_reachable";
+const std::string ATTRIBUTE_REACHABLE = "LL_reachable";
+
LivelockCheckerPtr LivelockChecker::m_instance;
-void LivelockListener::mark_reachable(InnerNode* node){
- set_reachable(node);
- const InnerNodePSet& pre = node->get_predecessors();
+LivelockReachableMarker::LivelockReachableMarker(LivelockListener* ll):
+ m_ll(ll)
+{
+}
- InnerNodePSet::const_iterator it;
- for(it = pre.begin(); it != pre.end(); it++)
+void LivelockReachableMarker::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(!get_reachable(node))
- mark_reachable(*it);
+ HMscNode* p = m_marked_elements.back();
+ p->remove_attribute<bool>(ATTRIBUTE_REACHABLE);
+ m_marked_elements.pop_back();
}
}
-void LivelockListener::find_refnode(InnerNode* n){
- InnerNodePListList path = m_traverser.get_reached_nodes();
- InnerNodePListList::reverse_iterator hmsc_it;
- InnerNodePList::reverse_iterator node_rit;
-
- hmsc_it = path.rbegin();
+void LivelockListener::on_white_node_found(HMscNode* node)
+{
+ if(dynamic_cast<EndNode*>(node))
+ {
+ mark_reachable(node);
+ }
+}
- for(node_rit=hmsc_it->rbegin(); *node_rit!=n; ++node_rit){
- ReferenceNode* ref = dynamic_cast<ReferenceNode*>(*node_rit);
- if(ref!=NULL)
- {
- throw LivelockException();
- }
+void LivelockListener::on_gray_node_found(HMscNode* n)
+{
+ if(dynamic_cast<ReferenceNode*>(n) && !get_reachable(n)){
+ throw LivelockException();
}
}
+LivelockListener::~LivelockListener()
+{
+ cleanup_attributes();
+}
-
-HMscPtr LivelockChecker::create_counter_example(const InnerNodePListList& path)
+bool& LivelockListener::get_reachable(HMscNode* node)
{
- InnerNodePListList::const_iterator hmscs_it;
- HMscPtr result;
- for(hmscs_it=path.begin();hmscs_it!=path.end();hmscs_it++)
+ bool just_set;
+ return node->get_attribute<bool>(ATTRIBUTE_REACHABLE,false,just_set);
+ if(just_set)
{
- HMscPtr current_hmsc;
- InnerNode* last_node = NULL;
- InnerNodePList::const_iterator nodes_it;
- for(nodes_it=hmscs_it->begin();nodes_it!=hmscs_it->end();nodes_it++)
- {
- if(last_node==NULL)
- {
- if(dynamic_cast<ReferenceNode*>(*nodes_it)!=NULL)
- last_node = new ReferenceNode((ReferenceNode*)*nodes_it);
- else
- last_node = new ConnectionNode((ConnectionNode*)*nodes_it);
- current_hmsc = new HMsc((*nodes_it)->get_owner());
- current_hmsc->get_start()->add_successor(last_node);
- if(!result.get())
- result = current_hmsc;
- }
- else
- {
- last_node->add_successor(*nodes_it);
- last_node = *nodes_it;
- }
- }
+ m_marked_elements.push_back(node);
}
- return result;
}
HMscPtr LivelockChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
{
HMscPtr p;
- DFSHMscTraverser traverser;
+ DFSHMscTraverser traverser("LC_color");
LivelockListener listener;
- listener.set_traverser(traverser);
traverser.add_white_node_found_listener(&listener);
- traverser.traverse(hmsc);
- traverser.remove_white_node_found_listeners();
-
traverser.add_gray_node_found_listener(&listener);
try
{
- traverser.traverse(hmsc);
+ traverser.traverse(hmsc);
}
catch(LivelockException& e)
{
- p = create_counter_example(traverser.get_reached_nodes());
- traverser.cleanup_traversing_attributes();
+ p = create_counter_example(traverser.get_reached_elements());
}
-
return p;
}
+
+LivelockChecker::LivelockChecker()
+{
+}
+
+HMscPtr LivelockChecker::create_counter_example(const MscElementPListList& path)
+{
+ HMscPtr e = HMscPtr(new HMsc("Erroneous path"));
+ return e;
+}
+
+LivelockCheckerPtr LivelockChecker::instance()
+{
+ if(!m_instance.get())
+ m_instance = new LivelockChecker();
+ return m_instance;
+}
+
+bool LivelockChecker::is_supported(ChannelMapperPtr chm)
+{
+ return true;
+}
+
+LivelockChecker::~LivelockChecker()
+{
+};
+void LivelockChecker::cleanup_attributes()
+{
+};
-
-
Modified: trunk/src/check/livelock_checker.h
===================================================================
--- trunk/src/check/livelock_checker.h 2008-11-16 21:58:38 UTC (rev 118)
+++ trunk/src/check/livelock_checker.h 2008-11-17 19:46:26 UTC (rev 119)
@@ -20,6 +20,7 @@
#include "data/msc.h"
#include "data/counted_ptr.h"
#include "check/dfs_hmsc_traverser.h"
+#include "check/dfsb_hmsc_traverser.h"
#include <string>
#include <stack>
@@ -46,84 +47,44 @@
}
};
-class LivelockListener:public WhiteRefNodeFoundListener, public GrayRefNodeFoundListener
+class LivelockReachableMarker:public WhiteNodeFoundListener
{
+
+ LivelockListener* m_ll;
+
+public:
+
+ LivelockReachableMarker(LivelockListener* ll=NULL);
+
+ void on_white_node_found(HMscNode* n);
+
+};
+
+class LivelockListener:public WhiteNodeFoundListener, public GrayNodeFoundListener
+{
private:
- // stack of InnerNodes with reachable element to be clean up
- InnerNodePStack m_reachable_elements;
- // actual traverser
- DFSHMscTraverser m_traverser;
- /**
- * recursive function, marking node as reachable and calling itself on node's predecessors
- * \param node to be mark
- */
- void mark_reachable(InnerNode* node);
+ HMscNodePList m_marked_elements;
- bool get_reachable(InnerNode* node)
- {
- return node->get_attribute<bool>(m_reachable_attribute,false);
- }
-
- void set_reachable(InnerNode* node)
- {
- node->set_attribute<bool>(m_reachable_attribute,true);
- m_reachable_elements.push(node);
- }
+ LivelockReachableMarker m_marker;
- void cleanup_attribute(){
- while(!m_reachable_elements.empty())
- {
- InnerNode* p = m_reachable_elements.top();
- p->remove_attribute<bool>(m_reachable_attribute);
- m_reachable_elements.pop();
- }
- }
- // goes throw the path trying to find reference node in the cyrcle
- void find_refnode(InnerNode* n);
+ DFSBHMscTraverser m_traverser;
+
+ void mark_reachable(HMscNode* node);
+
+ void cleanup_attributes();
-protected:
- static const std::string m_reachable_attribute;
public:
- void check(HMscPtr hmsc);
- void set_traverser(DFSHMscTraverser traverser)
- {
- m_traverser = traverser;
- }
+ LivelockListener();
- void on_white_node_found(InnerNode* node)
- {
- if(node->is_end_node() && !get_reachable(node))
- {
- mark_reachable(node);
- }
- }
+ ~LivelockListener();
- void on_white_node_found(ReferenceNode* node){}
+ void on_white_node_found(HMscNode* node);
- virtual void on_gray_node_found(InnerNode* n)
- {
- if(!get_reachable(n)){
- // if its false, attribute has been set, so its pushed for clean up
- m_reachable_elements.push(n);
- ReferenceNode* ref = dynamic_cast<ReferenceNode*>(n);
- if(ref!=NULL)
- {
- throw LivelockException();
- }
- else find_refnode(n);
- }
- }
+ virtual void on_gray_node_found(HMscNode* n);
- void on_gray_node_found(ReferenceNode* node)
- {
- }
-
- ~LivelockListener()
- {
- cleanup_attribute();
- }
+ bool& get_reachable(HMscNode* node);
};
@@ -140,27 +101,20 @@
*/
static LivelockCheckerPtr m_instance;
- LivelockChecker(){};
- HMscPtr create_counter_example(const InnerNodePListList& path);
+ LivelockChecker();
+ HMscPtr create_counter_example(const MscElementPListList& path);
public:
- static LivelockCheckerPtr instance()
- {
- if(!m_instance.get())
- m_instance = new LivelockChecker();
- return m_instance;
- }
+
+ static LivelockCheckerPtr instance();
- bool is_supported(ChannelMapperPtr chm)
- {
- return true;
- }
+ bool is_supported(ChannelMapperPtr chm);
- ~LivelockChecker(){};
+ ~LivelockChecker();
HMscPtr check(HMscPtr h, ChannelMapperPtr chm);
- void cleanup_attributes(){};
+ void cleanup_attributes();
};
Modified: trunk/src/check/refnode_finder.cpp
===================================================================
--- trunk/src/check/refnode_finder.cpp 2008-11-16 21:58:38 UTC (rev 118)
+++ trunk/src/check/refnode_finder.cpp 2008-11-17 19:46:26 UTC (rev 119)
@@ -41,3 +41,13 @@
//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);
+ traverse_node(node);
+ remove_white_node_found_listeners();
+ return successors;
+}
Modified: trunk/src/check/refnode_finder.h
===================================================================
--- trunk/src/check/refnode_finder.h 2008-11-16 21:58:38 UTC (rev 118)
+++ trunk/src/check/refnode_finder.h 2008-11-17 19:46:26 UTC (rev 119)
@@ -19,8 +19,51 @@
#ifndef _REFNODE_FINDER_H
#define _REFNODE_FINDER_H
+#include <list>
#include "check/dfs_bmsc_graph_traverser.h"
+typedef std::list<HMscNode*> HMscNodePList;
+typedef counted_ptr<HMscNodePList> HMscNodePListPtr;
+
+class ReferenceNodeFinderListener:
+ public WhiteNodeFoundListener,public GrayNodeFoundListener
+{
+
+ HMscNodePList* m_successors;
+ bool m_first;
+
+ void insert_successor(HMscNode* n)
+ {
+ //Don not insert the first one node and ConnectionNode
+ //The first one is strarting node of traversing
+ if(!dynamic_cast<ConnectionNode*>(n) && !m_first)
+ {
+ m_successors->push_back(n);
+ }
+ m_first = false;
+ }
+
+public:
+
+ ReferenceNodeFinderListener(HMscNodePList* successors):
+ WhiteNodeFoundListener(),GrayNodeFoundListener(),
+ m_successors(successors),m_first(true)
+ {
+ }
+
+ 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.
*/
@@ -34,9 +77,20 @@
{
}
+
+ /**
+ * \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);
protected:
+ /**
+ * \brief Traverses from node to nearest StartNode,EndNodes or ReferenceNodes.
+ */
bool traverse_node(HMscNode* node);
};
Modified: trunk/src/check/visual_closure_initiator.cpp
===================================================================
--- trunk/src/check/visual_closure_initiator.cpp 2008-11-16 21:58:38 UTC (rev 118)
+++ trunk/src/check/visual_closure_initiator.cpp 2008-11-17 19:46:26 UTC (rev 119)
@@ -86,6 +86,7 @@
event_closure.resize(event_topology.size(),false);
set_topology_index(event,i);
closure[i] = &event_closure;
+ m_modified_events.push_back(event);
}
//compute visual closures of events' ordering
make_closure(closure,event_topology);
@@ -140,3 +141,13 @@
}
}
}
+
+size_t VisualClosureInitiator::get_topology_index(Event* e)
+{
+ return e->get_attribute<size_t>(m_topology_index_attribute,0);
+}
+
+void VisualClosureInitiator::set_topology_index(Event* e,size_t i)
+{
+ e->set_attribute<size_t>(m_topology_index_attribute,i);
+}
Modified: trunk/src/check/visual_closure_initiator.h
===================================================================
--- trunk/src/check/visual_closure_initiator.h 2008-11-16 21:58:38 UTC (rev 118)
+++ trunk/src/check/visual_closure_initiator.h 2008-11-17 19:46:26 UTC (rev 119)
@@ -133,18 +133,12 @@
/**
* Getter of topology index attribute of e.
*/
- size_t get_topology_index(Event* e)
- {
- return e->get_attribute<size_t>(m_topology_index_attribute,0);
- }
+ size_t get_topology_index(Event* e);
/**
* Setter of topology index attribute of e.
*/
- void set_topology_index(Event* e,size_t i)
- {
- e->set_attribute<size_t>(m_topology_index_attribute,i);
- }
+ void set_topology_index(Event* e,size_t i);
/**
* Cleans up set attributes.
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2008-11-16 21:58:38 UTC (rev 118)
+++ trunk/tests/CMakeLists.txt 2008-11-17 19:46:26 UTC (rev 119)
@@ -17,13 +17,14 @@
visual_closure_initiator)
ADD_TEST(fifo_checker fifo_checker_test)
-#ADD_EXECUTABLE(livelock_checker_test livelock_checker_test.cpp)
-#TARGET_LINK_LIBRARIES(
-#livelock_checker_test
-#livelock_checker
-#msc
-#dfs_hmsc_traverser
-#dfs_msc_graph_traverser)
+ADD_EXECUTABLE(livelock_checker_test livelock_checker_test.cpp)
+TARGET_LINK_LIBRARIES(
+livelock_checker_test
+livelock_checker
+msc
+dfs_bmsc_graph_traverser
+dfs_hmsc_traverser
+dfsb_hmsc_traverser)
ADD_TEST(livelock_checker_checker livelock_checker_test)
# $Id: CMakeLists.txt,v 1.1 2008/10/28 21:13:20 gotthardp Exp $
Modified: trunk/tests/fifo_checker_test.cpp
===================================================================
--- trunk/tests/fifo_checker_test.cpp 2008-11-16 21:58:38 UTC (rev 118)
+++ trunk/tests/fifo_checker_test.cpp 2008-11-17 19:46:26 UTC (rev 119)
@@ -21,77 +21,93 @@
#include <iostream>
-void BMscA();
-void BMscB();
-void BMscC();
-void BMscD();
-void BMscE();
-void BMscF();
-void BMscG();
-void BMscH(); //BMscA
-void BMscI(); //BMscB
-void BMscJ(); //BMscC
-void BMscK(); //BMscD
-void BMscL(); //BMscE
-void BMscM(); //BMscF
-void BMscN(); //BMscG
-void BMscO(); //BMscK
-void BMscP(); //BMscL
-void BMscR(); //BMscM
+bool BMscA();
+bool BMscB();
+bool BMscC();
+bool BMscD();
+bool BMscE();
+bool BMscF();
+bool BMscG();
+bool BMscH(); //BMscA
+bool BMscI(); //BMscB
+bool BMscJ(); //BMscC
+bool BMscK(); //BMscD
+bool BMscL(); //BMscE
+bool BMscM(); //BMscF
+bool BMscN(); //BMscG
+bool BMscO(); //BMscK
+bool BMscP(); //BMscL
+bool BMscR(); //BMscM
+#define RETURN_IF_FAILED(res) if(!(res)) return 1;
+
/*
*
*/
int main(int argc, char** argv) {
- BMscA();
- BMscB();
- BMscC();
- BMscD();
- BMscE();
- BMscF();
- BMscG();
- BMscH();
- BMscI();
- BMscJ();
- BMscK();
- BMscL();
- BMscM();
- BMscN();
- BMscO();
- BMscP();
- BMscR();
+ RETURN_IF_FAILED(BMscA());
+ RETURN_IF_FAILED(BMscB());
+ RETURN_IF_FAILED(BMscC());
+ RETURN_IF_FAILED(BMscD());
+ RETURN_IF_FAILED(BMscE());
+ RETURN_IF_FAILED(BMscF());
+ RETURN_IF_FAILED(BMscG());
+ RETURN_IF_FAILED(BMscH());
+ RETURN_IF_FAILED(BMscI());
+ RETURN_IF_FAILED(BMscJ());
+ RETURN_IF_FAILED(BMscK());
+ RETURN_IF_FAILED(BMscL());
+ RETURN_IF_FAILED(BMscM());
+ RETURN_IF_FAILED(BMscN());
+ RETURN_IF_FAILED(BMscO());
+ RETURN_IF_FAILED(BMscP());
+ RETURN_IF_FAILED(BMscR());
return 0;
}
-void print_result(const BMscPtr bmsc,const bool is_fifo,const std::string& mapper_name)
+bool print_result(const BMscPtr bmsc,const bool is_fifo,const std::string& mapper_name)
{
+ bool result;
if(is_fifo)
if(bmsc.get())
+ {
+ result =false;
std::cout << "ERROR: BMsc is supposed to satisfy fifo for " << mapper_name
<< " channels but it doesn't satisfy it" << std::endl;
+ }
else
+ {
+ result = true;
std::cout << "OK: BMsc is supposed to satisfy fifo for " << mapper_name
<< " channels and it does so" << std::endl;
+ }
else
if(bmsc.get())
+ {
+ result = true;
std::cout << "OK: BMsc is supposed not to satisfy fifo for " << mapper_name
<< " channels and it doesn't so" << std::endl;
+ }
else
+ {
+ result =false;
std::cout << "ERROR: BMsc is supposed not to satisfy fifo for " << mapper_name
<< " channels but it satisfies it" << std::endl;
+ }
std::cout << std::endl;
+ return result;
}
-void check(BMscPtr bmsc,const bool is_sr_fifo,const bool is_srl_fifo)
+bool check(BMscPtr bmsc,const bool is_sr_fifo,const bool is_srl_fifo)
{
FifoCheckerPtr checker = FifoChecker::instance();
SRChannelMapperPtr srm = SRChannelMapper::instance();
SRLChannelMapperPtr srlm = SRLChannelMapper::instance();
- print_result(checker->check(bmsc,srm),is_sr_fifo,"sender-receiver");
- print_result(checker->check(bmsc,srlm),is_srl_fifo,"sender-receiver-label");
+ return (print_result(checker->check(bmsc,srm),is_sr_fifo,"sender-receiver") &&
+ print_result(checker->check(bmsc,srlm),is_srl_fifo,"sender-receiver-label"));
}
-void BMscA() {
+bool BMscA() {
std::cout << "Checking:" << std::endl;
std::cout << " p1 p2 " << std::endl;
std::cout << " | | " << std::endl;
@@ -120,10 +136,10 @@
e1->send_message(e3.get(),"a");
e4->send_message(e2.get(),"a");
- check(myBmsc,true,true);
+ return check(myBmsc,true,true);
}
-void BMscB() {
+bool BMscB() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "e1 O-----a----->O e3" << std::endl;
@@ -151,10 +167,10 @@
e1->send_message(e3.get(),"a");
e2->send_message(e4.get(),"a");
- check(myBmsc,true,true);
+ return check(myBmsc,true,true);
}
-void BMscC() {
+bool BMscC() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "e1 O --a->O e3" << std::endl;
@@ -185,10 +201,10 @@
e1->send_message(e4.get(),"a");
e2->send_message(e3.get(),"a");
- check(myBmsc,false,false);
+ return check(myBmsc,false,false);
}
-void BMscD() {
+bool BMscD() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "<coregion> <coregion> " << std::endl;
@@ -220,10 +236,10 @@
e1->send_message(e3.get(),"a");
e2->send_message(e4.get(),"a");
- check(myBmsc,false,false);
+ return check(myBmsc,false,false);
}
-void BMscE() {
+bool BMscE() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "<coregion> | " << std::endl;
@@ -255,10 +271,10 @@
e1->send_message(e3.get(),"a");
e2->send_message(e4.get(),"a");
- check(myBmsc,false,false);
+ return check(myBmsc,false,false);
}
-void BMscF() {
+bool BMscF() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "<coregion> | " << std::endl;
@@ -290,10 +306,10 @@
e3->send_message(e1.get(),"a");
e4->send_message(e2.get(),"a");
- check(myBmsc,false,false);
+ return check(myBmsc,false,false);
}
-void BMscG() {
+bool BMscG() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "<coregion> | " << std::endl;
@@ -325,10 +341,10 @@
e3->send_message(e1.get(),"a");
e2->send_message(e4.get(),"a");
- check(myBmsc,true,true);
+ return check(myBmsc,true,true);
}
-void BMscH() {
+bool BMscH() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "e1 O-----b----->O e3" << std::endl;
@@ -356,10 +372,10 @@
e1->send_message(e3.get(),"b");
e4->send_message(e2.get(),"a");
- check(myBmsc,true,true);
+ return check(myBmsc,true,true);
}
-void BMscI() {
+bool BMscI() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "e1 O-----a----->O e3" << std::endl;
@@ -387,10 +403,10 @@
e1->send_message(e3.get(),"a");
e2->send_message(e4.get(),"b");
- check(myBmsc,true,true);
+ return check(myBmsc,true,true);
}
-void BMscJ() {
+bool BMscJ() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "e1 O --a->O e3" << std::endl;
@@ -421,10 +437,10 @@
e2->send_message(e3.get(),"a");
e1->send_message(e4.get(),"b");
- check(myBmsc,false,true);
+ return check(myBmsc,false,true);
}
-void BMscK() {
+bool BMscK() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "<coregion> <coregion> " << std::endl;
@@ -456,10 +472,10 @@
e1->send_message(e3.get(),"a");
e2->send_message(e4.get(),"b");
- check(myBmsc,false,true);
+ return check(myBmsc,false,true);
}
-void BMscL() {
+bool BMscL() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "<coregion> | " << std::endl;
@@ -491,11 +507,11 @@
e1->send_message(e3.get(),"a");
e2->send_message(e4.get(),"b");
- check(myBmsc,false,true);
+ return check(myBmsc,false,true);
}
-void BMscM() {
+bool BMscM() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "<coregion> | " << std::endl;
@@ -527,10 +543,10 @@
e3->send_message(e1.get(),"a");
e4->send_message(e2.get(),"b");
- check(myBmsc,false,true);
+ return check(myBmsc,false,true);
}
-void BMscN() {
+bool BMscN() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "<coregion> | " << std::endl;
@@ -562,10 +578,10 @@
e3->send_message(e1.get(),"a");
e2->send_message(e4.get(),"b");
- check(myBmsc,true,true);
+ return check(myBmsc,true,true);
}
-void BMscO() {
+bool BMscO() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "<coregion> <coregion> " << std::endl;
@@ -602,10 +618,10 @@
e2->send_message(e4.get(),"b");
e5->send_message(e6.get(),"a");
- check(myBmsc,false,false);
+ return check(myBmsc,false,false);
}
-void BMscP() {
+bool BMscP() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "<coregion> | " << std::endl;
@@ -642,10 +658,10 @@
e2->send_message(e4.get(),"b");
e5->send_message(e6.get(),"a");
- check(myBmsc,false,false);
+ return check(myBmsc,false,false);
}
-void BMscR() {
+bool BMscR() {
std::cout << "Checking:" << std::endl;
std::cout << " | | " << std::endl;
std::cout << "<coregion> | " << std::endl;
@@ -682,5 +698,5 @@
e4->send_message(e2.get(),"b");
e6->send_message(e5.get(),"a");
- check(myBmsc,false,false);
+ return check(myBmsc,fals...
[truncated message content] |
|
From: <ba...@us...> - 2008-11-23 20:43:34
|
Revision: 120
http://scstudio.svn.sourceforge.net/scstudio/?rev=120&view=rev
Author: babicaj
Date: 2008-11-23 20:43:27 +0000 (Sun, 23 Nov 2008)
Log Message:
-----------
msc_presser replaced by msc_duplicator, new acyclic_checker_test added (not included in build yet), bug in dfs_bmsc_graph_traverser fixed
Modified Paths:
--------------
trunk/src/check/dfs_area_traverser.cpp
trunk/src/check/dfs_area_traverser.h
trunk/src/check/dfs_bmsc_graph_traverser.cpp
trunk/src/check/dfs_events_traverser.cpp
trunk/src/check/dfs_events_traverser.h
trunk/src/check/dfs_instance_events_traverser.cpp
trunk/src/check/dfs_instance_events_traverser.h
trunk/src/data/msc.cpp
trunk/src/data/msc.h
Added Paths:
-----------
trunk/src/check/msc_duplicators.cpp
trunk/src/check/msc_duplicators.h
trunk/tests/acyclic_checker_test.cpp
Removed Paths:
-------------
trunk/src/check/msc_presser.cpp
trunk/src/check/msc_presser.h
Modified: trunk/src/check/dfs_area_traverser.cpp
===================================================================
--- trunk/src/check/dfs_area_traverser.cpp 2008-11-17 19:46:26 UTC (rev 119)
+++ trunk/src/check/dfs_area_traverser.cpp 2008-11-23 20:43:27 UTC (rev 120)
@@ -16,56 +16,74 @@
* $Id$
*/
-#include <stack>
+#include "check/dfs_area_traverser.h"
+DFSAreaTraverser::DFSAreaTraverser(const std::string& color):
+DFSEventsTraverser(color)
+{
-#include "check/dfs_area_traverser.h"
+}
-void DFSAreaTraverser::traverse_area(EventAreaPtr area)
+void DFSAreaTraverser::traverse_area(EventArea* area)
{
- if(area.get())
+ if(!area) return;
+ StrictOrderArea* strict = dynamic_cast<StrictOrderArea*>(area);
+ if(strict)
{
- try
+ if(!strict->is_empty())
+ traverse_strict_event(strict->get_first().get());
+ }
+ else
+ {
+ CoregionArea* coregion = dynamic_cast<CoregionArea*>(area);
+ const CoregionEventPSet& minimals = coregion->get_minimal_events();
+ CoregionEventPSet::const_iterator min;
+ for(min=minimals.begin(); min!=minimals.end(); min++)
+ traverse_coregion_event(*min);
+ }
+}
+
+void DFSAreaTraverser::traverse(BMscPtr bmsc)
+{
+ InstancePtrList::const_iterator instance;
+ const InstancePtrList& instances = bmsc->get_instances();
+ for(instance=instances.begin(); instance!=instances.end(); instance++)
+ {
+ EventArea* area = (*instance)->get_first().get();
+ while(area)
{
- EventPStack stack;
- StrictOrderAreaPtr strict = area;
- StrictEvent* e = strict->get_first().get();
- while(e)
- {
- stack.push(e);
- white_event_found(e);
- e = e->get_successor().get();
- }
- //neccessary to keep semantic of DFS
- while(!stack.empty())
- {
- event_finished(stack.top());
- stack.pop();
- }
-
+ traverse_area(area);
+ area = area->get_next().get();
}
- catch(std::bad_cast& bd)
- {
- CoregionAreaPtr coregion = area;
- const CoregionEventPSet& minimals = coregion->get_minimal_events();
- CoregionEventPSet::const_iterator min;
- for(min=minimals.begin(); min!=minimals.end(); min++)
- traverse_coregion_event(*min);
- }
- traverse_area(area->get_next());
}
+ cleanup_traversing_attributes();
}
void DFSAreaTraverser::traverse_coregion_event(CoregionEvent* event)
{
+ m_reached_elements.push_back(event);
if(!is_processed(event))
{
- const CoregionEventPSet& successors = event->get_successors();
- CoregionEventPSet::const_iterator successor;
+ const CoregEventRelPtrSet& successors = event->get_successors();
+ CoregEventRelPtrSet::const_iterator successor;
for(successor=successors.begin(); successor!=successors.end(); successor++)
- traverse_coregion_event(*successor);
- set_color(event,BLACK);
+ {
+ m_reached_elements.push_back((*successor).get());
+ traverse_coregion_event((*successor)->get_successor());
+ m_reached_elements.pop_back();
+ }
event_finished(event);
}
}
+void DFSAreaTraverser::traverse_strict_event(StrictEvent* event)
+{
+ m_reached_elements.push_back(event);
+ if(!is_processed(event))
+ {
+ if(event->get_successor().get())
+ traverse_strict_event(event->get_successor().get());
+ event_finished(event);
+ }
+}
+
Modified: trunk/src/check/dfs_area_traverser.h
===================================================================
--- trunk/src/check/dfs_area_traverser.h 2008-11-17 19:46:26 UTC (rev 119)
+++ trunk/src/check/dfs_area_traverser.h 2008-11-23 20:43:27 UTC (rev 120)
@@ -21,35 +21,32 @@
#include "check/dfs_instance_events_traverser.h"
-typedef std::stack<Event*> EventPStack;
-
/**
* Processes EventAreas' events in sequence and do not follow matching events
* during traversing.
*
* Single EventAreas are traversed in depth first search manner.
*/
-class DFSAreaTraverser:public DFSInstanceEventsTraverser
+class DFSAreaTraverser:public DFSEventsTraverser
{
public:
- DFSAreaTraverser()
- {
- }
+ DFSAreaTraverser(const std::string& color="color");
+
+ void traverse(BMscPtr bmsc);
protected:
- /**
- * More effective traversing of StrictOrderArea
- */
- void traverse_area(EventAreaPtr area);
+ void traverse_area(EventArea* area);
/**
* Doesn't continue in traversing next EventArea in case of event hasn't got
* any successors.
*/
void traverse_coregion_event(CoregionEvent* event);
+
+ void traverse_strict_event(StrictEvent* event);
};
Modified: trunk/src/check/dfs_bmsc_graph_traverser.cpp
===================================================================
--- trunk/src/check/dfs_bmsc_graph_traverser.cpp 2008-11-17 19:46:26 UTC (rev 119)
+++ trunk/src/check/dfs_bmsc_graph_traverser.cpp 2008-11-23 20:43:27 UTC (rev 120)
@@ -81,13 +81,13 @@
}
white_node_found(node);
ReferenceNode* ref_node = dynamic_cast<ReferenceNode*>(node);
+ bool ending_successors;
if(ref_node!=NULL)
{
- return traverse_reference_node(ref_node);
+ ending_successors = traverse_reference_node(ref_node);
}
else
{
- bool ending_successors;
ConnectionNode* conn_node = dynamic_cast<ConnectionNode*>(node);
if(conn_node)
{
@@ -106,9 +106,9 @@
ending_successors = true;
}
}
- node_finished(node);
- return ending_successors;
}
+ node_finished(node);
+ return ending_successors;
}
bool DFSBMscGraphTraverser::traverse_reference_node(ReferenceNode* ref_node)
Modified: trunk/src/check/dfs_events_traverser.cpp
===================================================================
--- trunk/src/check/dfs_events_traverser.cpp 2008-11-17 19:46:26 UTC (rev 119)
+++ trunk/src/check/dfs_events_traverser.cpp 2008-11-23 20:43:27 UTC (rev 120)
@@ -19,7 +19,10 @@
#include "check/dfs_events_traverser.h"
#include "check/utils.h"
-const std::string DFSEventsTraverser::color_attribute = "events_traverse_color";
+DFSEventsTraverser::DFSEventsTraverser(const std::string& color)
+{
+ m_color = color;
+}
DFSEventsTraverser::~DFSEventsTraverser()
{
@@ -141,7 +144,7 @@
{
EventPList::iterator event;
for(event=m_colored_events.begin();event!=m_colored_events.end();event++)
- (*event)->remove_attribute<Color>(color_attribute);
+ (*event)->remove_attribute<Color>(m_color);
m_colored_events.erase(m_colored_events.begin(),m_colored_events.end());
}
@@ -189,3 +192,37 @@
return topology;
}
+Color DFSEventsTraverser::get_color(Event* e)
+{
+ return e->get_attribute<Color>(m_color,WHITE);
+}
+
+void DFSEventsTraverser::remove_white_event_found_listeners()
+{
+ white_event_found_listeners.clear();
+}
+
+void DFSEventsTraverser::remove_gray_event_found_listeners()
+{
+ gray_event_found_listeners.clear();
+}
+
+void DFSEventsTraverser::remove_black_event_found_listeners()
+{
+ black_event_found_listeners.clear();
+}
+
+void DFSEventsTraverser::remove_event_finished_listeners()
+{
+ event_finished_listeners.clear();
+}
+
+void DFSEventsTraverser::remove_all_listeners()
+{
+ remove_white_event_found_listeners();
+ remove_gray_event_found_listeners();
+ remove_black_event_found_listeners();
+ remove_event_finished_listeners();
+}
+
+
Modified: trunk/src/check/dfs_events_traverser.h
===================================================================
--- trunk/src/check/dfs_events_traverser.h 2008-11-17 19:46:26 UTC (rev 119)
+++ trunk/src/check/dfs_events_traverser.h 2008-11-23 20:43:27 UTC (rev 120)
@@ -107,9 +107,7 @@
public:
- DFSEventsTraverser()
- {
- }
+ DFSEventsTraverser(const std::string& color="color");
virtual ~DFSEventsTraverser();
@@ -118,7 +116,7 @@
*
* Events are traversed in depth first search manner.
*/
- void traverse(BMscPtr bmsc);
+ virtual void traverse(BMscPtr bmsc);
/**
* Adds EventFinishedListener
@@ -163,6 +161,12 @@
}
static EventPList* topology_order(BMscPtr b);
+
+ void remove_white_event_found_listeners();
+ void remove_gray_event_found_listeners();
+ void remove_black_event_found_listeners();
+ void remove_event_finished_listeners();
+ void remove_all_listeners();
protected:
@@ -175,6 +179,8 @@
* List of colored events during traversing.
*/
EventPList m_colored_events;
+
+ std::string m_color;
/**
* Holds listeners
@@ -200,11 +206,6 @@
* Holds listeners
*/
GrayEventFoundListenerPList grey_event_found_listeners;
-
- /**
- * Color attribute's name
- */
- static const std::string color_attribute;
virtual void traverse_area(EventArea* area);
@@ -241,7 +242,7 @@
*/
void set_color(Event* e, Color c)
{
- e->set_attribute<Color>(color_attribute,c);
+ e->set_attribute<Color>(m_color,c);
}
/**
@@ -249,10 +250,7 @@
*
* If attribute isn't set it is set to default value WHITE.
*/
- Color get_color(Event* e)
- {
- return e->get_attribute<Color>(color_attribute,WHITE);
- }
+ Color get_color(Event* e);
};
Modified: trunk/src/check/dfs_instance_events_traverser.cpp
===================================================================
--- trunk/src/check/dfs_instance_events_traverser.cpp 2008-11-17 19:46:26 UTC (rev 119)
+++ trunk/src/check/dfs_instance_events_traverser.cpp 2008-11-23 20:43:27 UTC (rev 120)
@@ -19,6 +19,13 @@
#include "check/dfs_instance_events_traverser.h"
#include "check/utils.h"
+#include <string>
+
+DFSInstanceEventsTraverser::DFSInstanceEventsTraverser(const std::string& color):DFSEventsTraverser(color)
+{
+
+}
+
void DFSInstanceEventsTraverser::traverse_strict_event(StrictEvent* event)
{
m_reached_elements.push_back(event);
Modified: trunk/src/check/dfs_instance_events_traverser.h
===================================================================
--- trunk/src/check/dfs_instance_events_traverser.h 2008-11-17 19:46:26 UTC (rev 119)
+++ trunk/src/check/dfs_instance_events_traverser.h 2008-11-23 20:43:27 UTC (rev 120)
@@ -31,11 +31,11 @@
public:
- DFSInstanceEventsTraverser()
- {
- }
+ DFSInstanceEventsTraverser(const std::string& color="color");
void traverse(Instance* instance);
+
+ using DFSEventsTraverser::traverse;
static EventPList* topology_order(Instance* i);
Added: trunk/src/check/msc_duplicators.cpp
===================================================================
--- trunk/src/check/msc_duplicators.cpp (rev 0)
+++ trunk/src/check/msc_duplicators.cpp 2008-11-23 20:43:27 UTC (rev 120)
@@ -0,0 +1,469 @@
+/*
+ * 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 "check/msc_duplicators.h"
+#include "check/dfs_instance_events_traverser.h"
+
+const std::string BMSC_DUPLICATOR_TRAVERSING_ATTR = "BDcolor";
+const std::string BMSC_DUPLICATOR_COPY_ATTR = "BDcopy";
+const std::string BMSC_GRAPH_DUPLICATOR_COPY_ATTR = "BGDcopy";
+const std::string BMSC_GRAPH_DUPLICATOR_REF_ATTR = "BGDreferencing";
+const std::string BMSC_GRAPH_DUPLICATOR_ENDLIST_ATTR = "BGDendlist";
+
+BMscDuplicator::BMscDuplicator()
+{
+}
+
+BMscPtr BMscDuplicator::duplicate_bmsc(BMscPtr &bmsc)
+{
+ BMscPtr new_bmsc;
+ if(bmsc.get())
+ {
+ new_bmsc = new BMsc(bmsc.get());
+ DFSAreaTraverser traverser(BMSC_DUPLICATOR_TRAVERSING_ATTR);
+ EventsCreatorListener events_creator(this,&traverser,new_bmsc.get());
+ traverser.add_white_event_found_listener(&events_creator);
+ traverser.add_black_event_found_listener(&events_creator);
+ traverser.add_gray_event_found_listener(&events_creator);
+ traverser.traverse(bmsc);
+ traverser.remove_all_listeners();
+ MessagesCreatorListener messages_creator(this);
+ traverser.add_white_event_found_listener(&messages_creator);
+ traverser.traverse(bmsc);
+ }
+ return new_bmsc;
+}
+
+Event*& BMscDuplicator::get_copy(Event* e)
+{
+ bool just_set;
+ Event*& copy = e->get_attribute<Event*>(BMSC_DUPLICATOR_COPY_ATTR,NULL,just_set);
+ if(just_set)
+ {
+ m_modified_elements.push_back(e);
+ }
+ return copy;
+}
+
+BMscDuplicator::~BMscDuplicator()
+{
+ EventPList::const_iterator i;
+ for(i=m_modified_elements.begin();i!=m_modified_elements.end();i++)
+ {
+ (*i)->remove_attribute<Event*>(BMSC_DUPLICATOR_COPY_ATTR);
+ }
+}
+
+BMscPtr BMscDuplicator::duplicate(BMscPtr& bmsc)
+{
+ BMscDuplicator duplicator;
+ return duplicator.duplicate_bmsc(bmsc);
+}
+
+EventsCreatorListener::EventsCreatorListener(BMscDuplicator* duplicator, DFSAreaTraverser* traverser, BMsc* bmsc):
+ m_duplicator(duplicator),
+ m_traverser(traverser),
+ m_bmsc(bmsc),
+ m_last_instance(NULL),
+ m_last_area(NULL),
+ m_last_new_instance(NULL),
+ m_last_new_area(NULL)
+{
+
+}
+
+void EventsCreatorListener::on_white_event_found(Event* e)
+{
+ if(m_last_instance!=e->get_instance())
+ {
+ InstancePtr new_instance = new Instance(e->get_instance());
+ m_bmsc->add_instance(new_instance);
+ m_last_instance = e->get_instance();
+ m_last_new_instance = new_instance.get();
+ }
+ if(m_last_area!=e->get_general_area())
+ {
+ StrictOrderArea* strict = dynamic_cast<StrictOrderArea*>(e->get_general_area());
+ EventAreaPtr area;
+ if(strict)
+ {
+ area = new StrictOrderArea(strict);
+ }
+ else
+ {
+ area = new CoregionArea(dynamic_cast<CoregionArea*>(e->get_general_area()));
+ }
+ m_last_new_area = area.get();
+ m_last_new_instance->add_area(area);
+ m_last_area = e->get_general_area();
+ }
+ EventPtr new_event = m_last_new_area->add_event();
+ new_event->set_original(e);
+ Event*& copy = m_duplicator->get_copy(e);
+ copy = new_event.get();
+ create_successor(e);
+}
+
+CoregionEvent* EventsCreatorListener::get_preceding_event()
+{
+ const MscElementPList& elements = m_traverser->get_reached_elements();
+ if(elements.size()>1)
+ {
+ //in this case currently traversed event isn't alone in elements
+ MscElementPList::const_iterator i = elements.end();
+ i--; i--;
+ return dynamic_cast<CoregionEvent*>(*i);
+ }
+ return NULL;
+}
+
+void EventsCreatorListener::on_gray_event_found(Event* e)
+{
+ create_successor(e);
+}
+
+void EventsCreatorListener::on_black_event_found(Event* e)
+{
+ create_successor(e);
+}
+
+void EventsCreatorListener::create_successor(Event* e)
+{
+ CoregionEvent* coreg_new_event = dynamic_cast<CoregionEvent*>(e);
+ if(coreg_new_event)
+ {
+ CoregionEvent* preceding = get_preceding_event();
+ if(preceding)
+ {
+ preceding->add_successor(coreg_new_event);
+ }
+ }
+}
+
+MessagesCreatorListener::MessagesCreatorListener(BMscDuplicator* duplicator):
+m_duplicator(duplicator)
+{
+
+}
+
+void MessagesCreatorListener::on_white_event_found(Event* e)
+{
+ Event* event_copy = m_duplicator->get_copy(e);
+ if(e->is_matched())
+ {
+ if(e->is_send())
+ {
+ MscMessagePtr complete = new CompleteMessage(e,NULL,e->get_complete_message().get());
+ event_copy->set_message(complete);
+ Event* matching_copy = m_duplicator->get_copy(e->get_matching_event());
+ matching_copy->set_message(complete);
+ }
+ }
+ else
+ {
+ MscMessagePtr incomplete = new IncompleteMessage(e->get_incomplete_message().get());
+ event_copy->set_message(incomplete);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+GraphCreatorListener::GraphCreatorListener(HMsc* hmsc):
+m_hmsc(hmsc)
+{
+}
+
+void GraphCreatorListener::on_white_node_found(HMscNode *n)
+{
+ HMscNodePtr node;
+ ReferenceNode* reference = dynamic_cast<ReferenceNode*>(n);
+ if(reference)
+ {
+ on_white_node_found(reference);
+ }
+ else
+ {
+ ConnectionNode* connection = dynamic_cast<ConnectionNode*>(n);
+ if(connection)
+ {
+ on_white_node_found(connection);
+ }
+ else
+ {
+ EndNode* end = dynamic_cast<EndNode*>(n);
+ if(end)
+ {
+ on_white_node_found(end);
+ }
+ else
+ {
+ StartNode* start = dynamic_cast<StartNode*>(n);
+ on_white_node_found(start);
+ }
+ }
+ }
+}
+
+
+void GraphCreatorListener::on_white_node_found(ReferenceNode* n)
+{
+ BMscPtr bmsc = n->get_bmsc();
+ HMscNodePtr new_node;
+ if(bmsc.get())
+ {
+ BMscPtr new_bmsc = BMscDuplicator::duplicate(bmsc);
+ ReferenceNode* reference = new ReferenceNode(n);
+ reference->set_msc(new_bmsc);
+ new_node = reference;
+ }
+ else
+ {
+ ConnectionNode* connection = new ConnectionNode(n);
+ new_node = connection;
+ ReferenceNode*& attribute = get_referencing_node(n->get_hmsc().get());
+ attribute = n;
+ }
+ process_new_node(n,new_node);
+}
+
+void GraphCreatorListener::on_white_node_found(StartNode* n)
+{
+ if(is_root_element(n))
+ {
+ //in this case duplicated Startnode was already created
+ m_new_nodes.push_back(m_hmsc->get_start().get());
+ set_copy(n,m_hmsc->get_start().get());
+ }
+}
+
+void GraphCreatorListener::on_white_node_found(EndNode* n)
+{
+ HMscNodePtr new_node;
+ if(is_root_element(n))
+ {
+ EndNode* end = new EndNode(n);
+ new_node = end;
+ }
+ else
+ {
+ ConnectionNode* connection = new ConnectionNode(n);
+ new_node = connection;
+ add_to_end_list(connection);
+ }
+ process_new_node(n,new_node);
+}
+
+ConnectionNodePList& GraphCreatorListener::get_end_list(ReferenceNode* reference)
+{
+ static ConnectionNodePList empty;
+ //attribute is removed when reference is finished in traversing
+ return reference->get_attribute<ConnectionNodePList>(BMSC_GRAPH_DUPLICATOR_ENDLIST_ATTR,empty);
+}
+
+void GraphCreatorListener::add_to_end_list(ConnectionNode* new_end)
+{
+ HMsc* original_hmsc = new_end->get_original()->get_owner();
+ ReferenceNode* original_reference = get_referencing_node(original_hmsc);
+ ConnectionNodePList& end_list = get_end_list(original_reference);
+ end_list.push_back(new_end);
+}
+
+void GraphCreatorListener::on_white_node_found(ConnectionNode* n)
+{
+ PredecessorNode* predecessor = get_predecessor();
+ HMscNodePtr new_node = new ConnectionNode(n);
+ process_new_node(n,new_node);
+}
+
+void GraphCreatorListener::process_new_node(HMscNode* old_node, HMscNodePtr& new_node)
+{
+ m_hmsc->add_node(new_node);
+ add_new_successor(new_node.get());
+ m_new_nodes.push_back(new_node.get());
+ set_copy(old_node,new_node.get());
+}
+
+bool GraphCreatorListener::is_root_element(HMscNode* n)
+{
+ return n->get_owner()==m_hmsc->get_original();
+}
+
+void GraphCreatorListener::set_copy(HMscNode* n, HMscNode* copy)
+{
+ HMscNode*& attribute = get_copy(n);
+ attribute = copy;
+}
+
+HMscNode*& GraphCreatorListener::get_copy(HMscNode* n)
+{
+ bool just_set;
+ HMscNode*& copy = n->get_attribute<HMscNode*>(BMSC_DUPLICATOR_COPY_ATTR,NULL,just_set);
+ if(just_set)
+ {
+ m_modified_elements.push_back(n);
+ }
+ return copy;
+}
+
+PredecessorNode* GraphCreatorListener::get_predecessor()
+{
+ return dynamic_cast<PredecessorNode*>(m_new_nodes.back());
+}
+
+void GraphCreatorListener::process_nonwhite_node(HMscNode* n)
+{
+ HMscNode* copy = get_copy(n);
+ add_new_successor(copy);
+}
+
+void GraphCreatorListener::on_gray_node_found(HMscNode* n)
+{
+ process_nonwhite_node(n);
+}
+
+void GraphCreatorListener::on_black_node_found(HMscNode* n)
+{
+ process_nonwhite_node(n);
+}
+
+void GraphCreatorListener::on_node_finished(HMscNode* n)
+{
+ HMscNodePtr node;
+ ReferenceNode* reference = dynamic_cast<ReferenceNode*>(n);
+ if(reference)
+ {
+ on_node_finished(reference);
+ }
+ else
+ {
+ ConnectionNode* connection = dynamic_cast<ConnectionNode*>(n);
+ if(connection)
+ {
+ on_node_finished(connection);
+ }
+ else
+ {
+ EndNode* end = dynamic_cast<EndNode*>(n);
+ if(end)
+ {
+ on_node_finished(end);
+ }
+ else
+ {
+ StartNode* start = dynamic_cast<StartNode*>(n);
+ on_node_finished(start);
+ }
+ }
+ }
+}
+
+void GraphCreatorListener::on_node_finished(ReferenceNode* n)
+{
+ n->remove_attribute<ConnectionNodePList>(BMSC_GRAPH_DUPLICATOR_ENDLIST_ATTR);
+ m_new_nodes.pop_back();
+}
+
+void GraphCreatorListener::on_node_finished(StartNode* n)
+{
+ if(is_root_element(n))
+ {
+ m_new_nodes.pop_back();
+ }
+}
+
+void GraphCreatorListener::on_node_finished(EndNode* n)
+{
+ m_new_nodes.pop_back();
+}
+
+void GraphCreatorListener::on_node_finished(ConnectionNode* n)
+{
+ m_new_nodes.pop_back();
+}
+
+ReferenceNode*& GraphCreatorListener::get_referencing_node(HMsc* hmsc)
+{
+ bool just_set;
+ ReferenceNode*& reference = hmsc->get_attribute<ReferenceNode*>(BMSC_GRAPH_DUPLICATOR_REF_ATTR,NULL,just_set);
+ if(just_set)
+ {
+ m_modified_hmscs.push_back(hmsc);
+ }
+ return reference;
+}
+
+void GraphCreatorListener::add_new_successor(HMscNode* new_successor)
+{
+ SuccessorNode* new_succ = dynamic_cast<SuccessorNode*>(new_successor);
+ PredecessorNode* predecessor = get_predecessor();
+ ConnectionNode* connection = dynamic_cast<ConnectionNode*>(predecessor);
+ if(connection)
+ {
+ ReferenceNode* original_reference = dynamic_cast<ReferenceNode*>(connection->get_original());
+ if(original_reference &&
+ new_successor->get_original()->get_owner()==original_reference->get_owner())
+ {
+ //connection was transformed from ReferenceNode and probably contains end_list,
+ //elements of the end_list must become predecessors of new_successor which
+ //must be from same HMsc as original_reference
+ ConnectionNodePList& end_list = get_end_list(original_reference);
+ ConnectionNodePList::const_iterator i;
+ for(i=end_list.begin();i!=end_list.end();i++)
+ {
+ (*i)->add_successor(new_succ);
+ }
+ return;
+ }
+ }
+ predecessor->add_successor(new_succ);
+}
+
+GraphCreatorListener::~GraphCreatorListener()
+{
+ while(!m_modified_elements.empty())
+ {
+ MscElement* e = m_modified_elements.back();
+ e->remove_attribute<HMscNode*>(BMSC_DUPLICATOR_COPY_ATTR);
+ m_modified_elements.pop_back();
+ }
+ while(!m_modified_hmscs.empty())
+ {
+ HMsc* h = m_modified_hmscs.back();
+ h->remove_attribute<ReferenceNode*>(BMSC_GRAPH_DUPLICATOR_REF_ATTR);
+ m_modified_hmscs.pop_back();
+ }
+}
+
+HMscPtr BMscGraphDuplicator::duplicate(HMscPtr& hmsc)
+{
+ HMscPtr new_hmsc;
+ if(hmsc.get())
+ {
+ new_hmsc = new HMsc(hmsc.get());
+ GraphCreatorListener listener(new_hmsc.get());
+ DFSBMscGraphTraverser traverser;
+ traverser.add_black_node_found_listener(&listener);
+ traverser.add_gray_node_found_listener(&listener);
+ traverser.add_node_finished_listener(&listener);
+ traverser.add_white_node_found_listener(&listener);
+ traverser.traverse(hmsc);
+ }
+ return new_hmsc;
+}
+
+
Property changes on: trunk/src/check/msc_duplicators.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: trunk/src/check/msc_duplicators.h
===================================================================
--- trunk/src/check/msc_duplicators.h (rev 0)
+++ trunk/src/check/msc_duplicators.h 2008-11-23 20:43:27 UTC (rev 120)
@@ -0,0 +1,186 @@
+/*
+ * 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/msc.h"
+#include "check/dfs_area_traverser.h"
+#include "check/dfs_bmsc_graph_traverser.h"
+
+typedef std::list<Event*> EventPList;
+typedef std::list<ReferenceNode*> ReferenceNodePList;
+typedef std::list<HMsc*> HMscPList;
+typedef std::list<ConnectionNode*> ConnectionNodePList;
+
+class BMscDuplicator;
+
+class EventsCreatorListener:
+ public WhiteEventFoundListener,public GrayEventFoundListener,
+ public BlackEventFoundListener
+{
+protected:
+
+ BMscDuplicator* m_duplicator;
+
+ Instance* m_last_instance;
+
+ Instance* m_last_new_instance;
+
+ EventArea* m_last_area;
+
+ EventArea* m_last_new_area;
+
+ BMsc* m_bmsc;
+
+ DFSAreaTraverser* m_traverser;
+
+ void create_successor(Event* e);
+
+ CoregionEvent* get_preceding_event();
+
+public:
+
+ EventsCreatorListener(BMscDuplicator* duplicator, DFSAreaTraverser* traverser, BMsc* bmsc);
+
+ void on_white_event_found(Event* e);
+ void on_gray_event_found(Event* e);
+ void on_black_event_found(Event* e);
+
+};
+
+class MessagesCreatorListener:public WhiteEventFoundListener
+{
+protected:
+
+ BMscDuplicator* m_duplicator;
+
+public:
+
+ MessagesCreatorListener(BMscDuplicator* duplicator);
+
+ void on_white_event_found(Event* e);
+
+};
+
+
+/**
+ * \brief Duplicates BMsc
+ *
+ * Duplicated BMsc's elemenents have set attribute original to the original
+ * BMsc's elements.
+ */
+class BMscDuplicator
+{
+protected:
+
+ EventPList m_modified_elements;
+
+ BMscPtr duplicate_bmsc(BMscPtr& bmsc);
+
+ BMscDuplicator();
+
+public:
+
+ static BMscPtr duplicate(BMscPtr& bmsc);
+
+ ~BMscDuplicator();
+
+ Event*& get_copy(Event* e);
+};
+
+///////////////////////////////////////////////////////////
+
+class GraphCreatorListener: public WhiteNodeFoundListener,public GrayNodeFoundListener,
+ public BlackNodeFoundListener,public NodeFinishedListener
+{
+protected:
+
+ MscElementPList m_modified_elements;
+ HMscPList m_modified_hmscs;
+
+ MscElementPList m_new_nodes;
+
+ HMsc* m_hmsc;
+
+ bool is_root_element(HMscNode* n);
+
+ HMscNode*& get_copy(HMscNode* n);
+
+ void set_copy(HMscNode* n, HMscNode* copy);
+
+ void process_new_node(HMscNode* old_node, HMscNodePtr& new_node);
+
+ void process_nonwhite_node(HMscNode* n);
+
+ PredecessorNode* get_predecessor();
+
+ ReferenceNode*& get_referencing_node(HMsc* hmsc);
+
+ ConnectionNodePList& get_end_list(ReferenceNode* reference);
+
+ void add_to_end_list(ConnectionNode* new_end);
+
+ void add_new_successor(HMscNode* new_successor);
+
+public:
+
+ GraphCreatorListener(HMsc* hmsc);
+
+ ~GraphCreatorListener();
+
+ void on_white_node_found(HMscNode* n);
+ void on_white_node_found(ReferenceNode* n);
+ void on_white_node_found(StartNode* n);
+ void on_white_node_found(EndNode* n);
+ void on_white_node_found(ConnectionNode* n);
+
+ void on_gray_node_found(HMscNode* n);
+
+ void on_black_node_found(HMscNode* n);
+
+ void on_node_finished(HMscNode* n);
+ void on_node_finished(ReferenceNode* n);
+ void on_node_finished(StartNode* n);
+ void on_node_finished(EndNode* n);
+ void on_node_finished(ConnectionNode* n);
+
+};
+
+/**
+ * \brief Duplicates HMsc like it would be BMsc graph.
+ *
+ * Result of this duplicator is flattened version of HMsc (BMsc graph)
+ * without unreachable HMscNodes and nodes which
+ * man isn't able to get to EndNode from.
+ *
+ * All ReferenceNodes reference only BMsc, moreover each BMsc is
+ * referenced only one time -- each BMsc is duplicated too. Kept elements
+ * references to its original element via attribute m_original.
+ *
+ * Original ReferenceNodes which references HMsc are transformed into
+ * ConnectionNodes referencing the ReferenceNode by m_original. StartNodes
+ * which don't occure in HMsc to be duplicated are removed. EndNodes
+ * of the same kind are transformed into ConnectionNodes referencing original
+ * EndNodes.
+ */
+class BMscGraphDuplicator
+{
+
+public:
+
+ static HMscPtr duplicate(HMscPtr& hmsc);
+
+};
\ No newline at end of file
Property changes on: trunk/src/check/msc_duplicators.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Deleted: trunk/src/check/msc_presser.cpp
===================================================================
--- trunk/src/check/msc_presser.cpp 2008-11-17 19:46:26 UTC (rev 119)
+++ trunk/src/check/msc_presser.cpp 2008-11-23 20:43:27 UTC (rev 120)
@@ -1,93 +0,0 @@
-/*
- * 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 Gene...
[truncated message content] |
|
From: <got...@us...> - 2008-11-28 23:40:01
|
Revision: 123
http://scstudio.svn.sourceforge.net/scstudio/?rev=123&view=rev
Author: gotthardp
Date: 2008-11-28 23:39:47 +0000 (Fri, 28 Nov 2008)
Log Message:
-----------
Directory structure reorganized.
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/README
trunk/src/CMakeLists.txt
trunk/src/check/CMakeLists.txt
trunk/src/data/CMakeLists.txt
trunk/src/data/Z120/Z120.cpp
trunk/src/data/Z120/Z120.h
trunk/src/data/counted_ptr.h
trunk/src/data/msc.cpp
trunk/src/data/msc.h
trunk/src/data/msc_modifications.h
trunk/src/data/msc_visual.h
trunk/tests/CMakeLists.txt
trunk/tests/acyclic_checker_test.cpp
trunk/tests/deadlock_checker_test.cpp
trunk/tests/dot_writer.h
trunk/tests/fifo_checker_test.cpp
trunk/tests/livelock_checker_test.cpp
Added Paths:
-----------
trunk/src/check/liveness/
trunk/src/check/liveness/CMakeLists.txt
trunk/src/check/liveness/deadlock_checker.cpp
trunk/src/check/liveness/deadlock_checker.h
trunk/src/check/liveness/livelock_checker.cpp
trunk/src/check/liveness/livelock_checker.h
trunk/src/check/order/
trunk/src/check/order/CMakeLists.txt
trunk/src/check/order/acyclic_checker.cpp
trunk/src/check/order/acyclic_checker.h
trunk/src/check/order/fifo_checker.cpp
trunk/src/check/order/fifo_checker.h
trunk/src/check/pseudocode/
trunk/src/check/pseudocode/CMakeLists.txt
trunk/src/check/pseudocode/causal_closure_initiator.cpp
trunk/src/check/pseudocode/causal_closure_initiator.h
trunk/src/check/pseudocode/msc_duplicators.cpp
trunk/src/check/pseudocode/msc_duplicators.h
trunk/src/check/pseudocode/refnode_finder.cpp
trunk/src/check/pseudocode/refnode_finder.h
trunk/src/check/pseudocode/utils.h
trunk/src/check/pseudocode/visual_closure_initiator.cpp
trunk/src/check/pseudocode/visual_closure_initiator.h
trunk/src/check/race/
trunk/src/check/race/CMakeLists.txt
trunk/src/check/race/bmsc_race_checker.cpp
trunk/src/check/race/bmsc_race_checker.h
trunk/src/check/race/footprint.cpp
trunk/src/check/race/footprint.h
trunk/src/check/race/race_checker.cpp
trunk/src/check/race/race_checker.h
trunk/src/data/checker.h
trunk/src/data/dfs_area_traverser.cpp
trunk/src/data/dfs_area_traverser.h
trunk/src/data/dfs_bmsc_graph_traverser.cpp
trunk/src/data/dfs_bmsc_graph_traverser.h
trunk/src/data/dfs_events_traverser.cpp
trunk/src/data/dfs_events_traverser.h
trunk/src/data/dfs_hmsc_traverser.cpp
trunk/src/data/dfs_hmsc_traverser.h
trunk/src/data/dfs_inner_hmsc_traverser.cpp
trunk/src/data/dfs_inner_hmsc_traverser.h
trunk/src/data/dfs_instance_events_traverser.cpp
trunk/src/data/dfs_instance_events_traverser.h
trunk/src/data/dfs_refnode_hmsc_traverser.cpp
trunk/src/data/dfs_refnode_hmsc_traverser.h
trunk/src/data/dfsb_hmsc_traverser.cpp
trunk/src/data/dfsb_hmsc_traverser.h
Removed Paths:
-------------
trunk/src/check/acyclic_checker.cpp
trunk/src/check/acyclic_checker.h
trunk/src/check/bmsc_race_checker.cpp
trunk/src/check/bmsc_race_checker.h
trunk/src/check/causal_closure_initiator.cpp
trunk/src/check/causal_closure_initiator.h
trunk/src/check/checker.h
trunk/src/check/deadlock_checker.cpp
trunk/src/check/deadlock_checker.h
trunk/src/check/dfs_area_traverser.cpp
trunk/src/check/dfs_area_traverser.h
trunk/src/check/dfs_bmsc_graph_traverser.cpp
trunk/src/check/dfs_bmsc_graph_traverser.h
trunk/src/check/dfs_events_traverser.cpp
trunk/src/check/dfs_events_traverser.h
trunk/src/check/dfs_hmsc_traverser.cpp
trunk/src/check/dfs_hmsc_traverser.h
trunk/src/check/dfs_inner_hmsc_traverser.cpp
trunk/src/check/dfs_inner_hmsc_traverser.h
trunk/src/check/dfs_instance_events_traverser.cpp
trunk/src/check/dfs_instance_events_traverser.h
trunk/src/check/dfs_refnode_hmsc_traverser.cpp
trunk/src/check/dfs_refnode_hmsc_traverser.h
trunk/src/check/dfsb_hmsc_traverser.cpp
trunk/src/check/dfsb_hmsc_traverser.h
trunk/src/check/fifo_checker.cpp
trunk/src/check/fifo_checker.h
trunk/src/check/footprint.cpp
trunk/src/check/footprint.h
trunk/src/check/livelock_checker.cpp
trunk/src/check/livelock_checker.h
trunk/src/check/msc_duplicators.cpp
trunk/src/check/msc_duplicators.h
trunk/src/check/race_checker.cpp
trunk/src/check/race_checker.h
trunk/src/check/refnode_finder.cpp
trunk/src/check/refnode_finder.h
trunk/src/check/utils.h
trunk/src/check/visual_closure_initiator.cpp
trunk/src/check/visual_closure_initiator.h
Property Changed:
----------------
trunk/CMakeLists.txt
trunk/src/CMakeLists.txt
trunk/src/check/CMakeLists.txt
trunk/src/data/CMakeLists.txt
trunk/src/data/Z120/CMakeLists.txt
trunk/src/data/Z120/Z120.cpp
trunk/src/data/Z120/Z120.h
trunk/src/data/Z120/main.cpp
trunk/src/data/msc_modifications.h
trunk/tests/CMakeLists.txt
trunk/tests/acyclic_checker_test.cpp
trunk/tests/deadlock_checker_test.cpp
trunk/tests/dot_writer.h
trunk/tests/fifo_checker_test.cpp
trunk/tests/livelock_checker_test.cpp
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2008-11-28 20:26:06 UTC (rev 122)
+++ trunk/CMakeLists.txt 2008-11-28 23:39:47 UTC (rev 123)
@@ -9,8 +9,8 @@
INCLUDE(${CMAKE_ROOT}/Modules/Dart.cmake)
INCLUDE_DIRECTORIES(src)
-ADD_SUBDIRECTORY(src .)
-ADD_SUBDIRECTORY(tests .)
+ADD_SUBDIRECTORY(src)
+ADD_SUBDIRECTORY(tests)
-# $Id: CMakeLists.txt,v 1.7 2008/11/06 15:16:29 gotthardp Exp $
+# $Id$
Property changes on: trunk/CMakeLists.txt
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/README
===================================================================
--- trunk/README 2008-11-28 20:26:06 UTC (rev 122)
+++ trunk/README 2008-11-28 23:39:47 UTC (rev 123)
@@ -16,6 +16,7 @@
view/ Applications.
visio/ Microsoft Visio plug-in.
test/ Console application for tests under Unix/Linux.
+ tests/ Automated regression tests.
To get the latest sources
svn co https://scstudio.svn.sourceforge.net/svnroot/scstudio/trunk scstudio
Modified: trunk/src/CMakeLists.txt
===================================================================
--- trunk/src/CMakeLists.txt 2008-11-28 20:26:06 UTC (rev 122)
+++ trunk/src/CMakeLists.txt 2008-11-28 23:39:47 UTC (rev 123)
@@ -1,3 +1,4 @@
ADD_SUBDIRECTORY(data)
ADD_SUBDIRECTORY(check)
+# $Id$
Property changes on: trunk/src/CMakeLists.txt
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/check/CMakeLists.txt
===================================================================
--- trunk/src/check/CMakeLists.txt 2008-11-28 20:26:06 UTC (rev 122)
+++ trunk/src/check/CMakeLists.txt 2008-11-28 23:39:47 UTC (rev 123)
@@ -1,22 +1,8 @@
-#traversers
-#ADD_LIBRARY(dfs_area_traverser STATIC dfs_area_traverser.cpp)
-ADD_LIBRARY(dfs_events_traverser STATIC dfs_events_traverser.cpp)
-ADD_LIBRARY(dfs_hmsc_traverser STATIC dfs_hmsc_traverser.cpp)
-ADD_LIBRARY(dfsb_hmsc_traverser STATIC dfsb_hmsc_traverser.cpp)
-ADD_LIBRARY(dfs_instance_events_traverser STATIC dfs_instance_events_traverser.cpp)
-ADD_LIBRARY(dfs_bmsc_graph_traverser STATIC dfs_bmsc_graph_traverser.cpp)
-ADD_LIBRARY(refnode_finder STATIC refnode_finder.cpp)
+ADD_SUBDIRECTORY(pseudocode)
-#order relation
-#ADD_LIBRARY(causal_closure_initiator STATIC causal_closure_initiator.cpp)
-ADD_LIBRARY(visual_closure_initiator STATIC visual_closure_initiator.cpp)
+# plug-ins
+ADD_SUBDIRECTORY(liveness)
+ADD_SUBDIRECTORY(order)
+# ADD_SUBDIRECTORY(race)
-#checkers
-#ADD_LIBRARY(acyclic_checker STATIC acyclic_checker.cpp)
-ADD_LIBRARY(deadlock_checker STATIC deadlock_checker.cpp)
-ADD_LIBRARY(fifo_checker STATIC fifo_checker.cpp)
-ADD_LIBRARY(livelock_checker STATIC livelock_checker.cpp)
-#ADD_LIBRARY(race_checker STATIC race_checker.cpp)
-
-#other
-#ADD_LIBRARY(footprint STATIC footprint.cpp)
+# $Id$
Property changes on: trunk/src/check/CMakeLists.txt
___________________________________________________________________
Added: svn:keywords
+ Id
Deleted: trunk/src/check/acyclic_checker.cpp
===================================================================
--- trunk/src/check/acyclic_checker.cpp 2008-11-28 20:26:06 UTC (rev 122)
+++ trunk/src/check/acyclic_checker.cpp 2008-11-28 23:39:47 UTC (rev 123)
@@ -1,53 +0,0 @@
-/*
- * 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 "check/acyclic_checker.h"
-
-AcyclicCheckerPtr AcyclicChecker::m_instance;
-
-BMsc* AcyclicChecker::create_counter_example(const EventPList& path)
-{
- BMsc* bmsc = new BMsc(path.front()->get_instance()->get_bmsc());
- //TODO: construction of counter example
- return bmsc;
-}
-
-BMscPtr AcyclicChecker::check(BMscPtr bmsc, ChannelMapperPtr chm)
-{
- AcyclicCheckerListener listener;
- DFSEventsTraverser traverser;
- traverser.add_white_event_found_listener(&listener);
- traverser.add_gray_event_found_listener(&listener);
- traverser.add_event_finished_listener(&listener);
- BMscPtr result;
- try
- {
- traverser.traverse(bmsc);
- }
- catch(CycleDetectedException& cde)
- {
- result = create_counter_example(listener.get_path());
- traverser.cleanup_traversing_attributes();
- }
- return result;
-}
-
-void AcyclicChecker::cleanup_attributes()
-{
-
-}
Deleted: trunk/src/check/acyclic_checker.h
===================================================================
--- trunk/src/check/acyclic_checker.h 2008-11-28 20:26:06 UTC (rev 122)
+++ trunk/src/check/acyclic_checker.h 2008-11-28 23:39:47 UTC (rev 123)
@@ -1,110 +0,0 @@
-/*
- * 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 "check/checker.h"
-#include "data/msc.h"
-#include "check/dfs_events_traverser.h"
-
-class AcyclicChecker;
-
-typedef counted_ptr<AcyclicChecker> AcyclicCheckerPtr;
-
-class AcyclicCheckerListener:
-public WhiteEventFoundListener,
-public GrayEventFoundListener,
-public EventFinishedListener
-{
-
-protected:
-
- EventPList m_path;
-
-public:
-
- void on_white_event_found(Event* e)
- {
- m_path.push_back(e);
- }
-
- void on_gray_event_found(Event* e)
- {
- m_path.push_back(e);
- throw CycleDetectedException();
- }
-
- void on_event_finished(Event* e)
- {
- m_path.pop_back();
- }
-
- const EventPList& get_path()
- {
- return m_path;
- }
-
-};
-
-class AcyclicChecker: public Checker, public BMscChecker
-{
-
-protected:
-
- /**
- * Common instance.
- */
- static AcyclicCheckerPtr m_instance;
-
- BMsc* create_counter_example(const EventPList& path);
-
- AcyclicChecker()
- {
- }
-
-public:
-
- ~AcyclicChecker()
- {
- }
-
- /**
- * Checks whether bmsc has acyclic events' dependecy
- */
- BMscPtr check(BMscPtr bmsc, ChannelMapperPtr chm);
-
- /**
- * Cleans up no more needed attributes.
- */
- void cleanup_attributes();
-
- /**
- * Supports all mappers
- */
- bool is_supported(ChannelMapperPtr chm)
- {
- return true;
- }
-
- static AcyclicCheckerPtr instance()
- {
- if(!m_instance.get())
- m_instance = new AcyclicChecker();
- return m_instance;
- }
-
- };
-
Deleted: trunk/src/check/bmsc_race_checker.cpp
===================================================================
--- trunk/src/check/bmsc_race_checker.cpp 2008-11-28 20:26:06 UTC (rev 122)
+++ trunk/src/check/bmsc_race_checker.cpp 2008-11-28 23:39:47 UTC (rev 123)
@@ -1,172 +0,0 @@
-/*
- * 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 "check/bmsc_race_checker.h"
-
-void MinimalEventsInitiator::on_white_node_found(ReferenceNode* node)
-{
- BMscPtr b = node->get_bmsc();
- const InstancePtrList& instances = b->get_instances();
- //compute minimal Events of Instances
- EventPList minimal_events;
- InstancePtrList::const_iterator i;
- for(i=instances.begin();i!=instances.end();i++)
- {
- EventPList* events = DFSInstanceEventsTraverser::topology_order(*i);
- EventPList::const_iterator e1 = events->begin();
- while(e1!=events->end())
- {
- EventPList::const_iterator e2 = events->begin();
- while(e2!=events->end())
- {
- if(e1!=e2)
- {
- Event* e = *e2;
- BoolVector& e2_causal = m_caus_initiator->get_causal_closure(*e2);
- size_t e1_index = m_vis_initiator->get_topology_index(*e1);
- //e2<<e1 => e1 isn't minimal
- if(e2_causal[e1_index]) break;
- }
- e2++;
- }
- //'while loop' hasn't found any Event e2 to be less than e1
- if(e2==events.end())
- minimal_events.push_back(*e1);
- e1++;
- }
- delete events;
- }
- /*
- For the minimal_events find Instances containing less Events.
- Note that if there exists any less Event e1 at Instance i, e1 must be grater
- or equal to some Event e2 in minimal_events, therefore we will use only
- minimal_events to seek.
- */
- EventPList::const_iterator e;
- ExtremeEvents& extreme_events = get_minimal_events(b.get());
- for(e=minimal_events.begin();e!=minimal_events.end();e++)
- {
- EventDependentInstances e_instances(*e,m_instance_marker.get_count());
- size_t e_index = m_vis_initiator->get_topology_index(*e);
- EventPList::const_iterator f;
- for(f=minimal_events.begin();f!=minimal_events.end();f++)
- {
- //if f is less than e then Instance of f must be inserted
- BoolVector& closure = m_caus_initiator->get_causal_closure(*f);
- if(closure[e_index])
- e_instances.set_dependent(
- m_instance_marker->get_id((*f)->get_instance()));
- }
- extreme_events.add_extreme_event(e_instances);
- }
- m_modified_bmscs.push_back(b.get());
-}
-
-BMsc* BMscRaceChecker::create_counter_example(Event* e1, Event* e2)
-{
- BMsc* bmsc = new BMsc(e1->get_instance()->get_bmsc());
- InstancePtr common_instance = new Instance(bmsc,e1->get_instance());
- bmsc->add_instance(common_instance);
- BoolVector& e2_causal = m_causal_initiator.get_causal_closure(e2);
- size_t e1_index = m_visual_initiator.get_topology_index(e1);
- MscMessagePtr e1_message;
- if(e1->is_send())
- e1_message = new MscMessage(
- common_instance.get(),NULL,e1->get_message().get());
- else
- e1_message = new MscMessage(
- NULL,common_instance.get(),e1->get_message().get());
- MscMessagePtr e2_message;
- if(e2->is_send())
- e2_message = new MscMessage(
- common_instance.get(),NULL,e2->get_message().get());
- else
- e2_message = new MscMessage(
- NULL,common_instance.get(),e2->get_message().get());
- //e2 << e1
- if(e2_causal[e1_index])
- {
- StrictOrderAreaPtr common_strict = new StrictOrderArea(
- common_instance.get());
- StrictEventPtr e1_strict = new StrictEvent(common_strict.get(),e1_message,e1);
- StrictEventPtr e2_strict = new StrictEvent(common_strict.get(),e2_message,e2);
- common_strict->set_first(e1_strict);
- e1_strict->set_successor(e2_strict);
- common_instance->set_first(common_strict);
- }
- //e2 || e1
- else
- {
- CoregionAreaPtr common_coregion = new CoregionArea(common_instance.get());
- CoregionEvent* e1_coregion = new CoregionEvent(
- common_coregion.get(),e1_message,e1);
- CoregionEvent* e2_coregion = new CoregionEvent(
- common_coregion.get(),e2_message,e2);
- common_coregion->add_minimal_event(e1_coregion);
- common_coregion->add_minimal_event(e2_coregion);
- common_instance->set_first(common_coregion);
- }
- return bmsc;
-}
-
-BMscPtr BMscRaceChecker::check(BMscPtr bmsc, ChannelMapperPtr mapper)
-{
- DFSEventsTraverser traverser;
- TopologicalOrderListener topology_listener;
- traverser.add_event_finished_listener(this);
- traverser.traverse(bmsc);
- EventPVector topology(
- topology_listener.get_topology().begin(),
- topology_listener.get_topology().end()
- );
- m_visual_initiator.initialize(topology);
- m_causal_initiator.initialize(topology,m_visual_initiator,mapper);
- OrderCheckerListener order_checker_listener(&m_visual_initiator);
- DFSInstanceEventsTraverser instance_traverser;
- for(size_t i = 0; i < topology.size(); i++)
- {
- //in this block checkout whether there is any Event in race with topology[i]
- order_checker_listener.reset(
- topology[i],
- &m_visual_initiator.get_visual_closure(topology[i]),
- &m_causal_initiator.get_causal_closure(topology[i]));
- try
- {
- instance_traverser.traverse(topology[i]->get_instance());
- instance_traverser.cleanup_traversing_attributes();
- }
- catch(EventRaceException& e)
- {
- instance_traverser.cleanup_traversing_attributes();
- return create_counter_example(topology[i],e->get_event());
- }
- }
- return BMscPtr();
-}
-
-void BMscRaceChecker::cleanup_attributes()
-{
- m_visual_initiator.cleanup_attributes();
- m_causal_initiator.cleanup_attributes();
- while(!m_modified_instaces.empty())
- {
- Instance* i = m_modified_instaces.front();
- m_modified_instaces.pop_front();
- i->remove_attribute<EventPList>(m_instance_events_attribute);
- }
-}
Deleted: trunk/src/check/bmsc_race_checker.h
===================================================================
--- trunk/src/check/bmsc_race_checker.h 2008-11-28 20:26:06 UTC (rev 122)
+++ trunk/src/check/bmsc_race_checker.h 2008-11-28 23:39:47 UTC (rev 123)
@@ -1,74 +0,0 @@
-/*
- * 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 _BMSC_RACE_CHECKER_H
-#define _BMSC_RACE_CHECKER_H
-
-#include "data/msc.h"
-#include "check/dfs_events_traverser.h"
-#include "check/visual_closure_initiator.h"
-#include "check/causal_closure_initiator.h"
-
-typedef std::list<Instance*> InstancePList;
-
-class BMscRaceChecker:
-public BMscChecker,
-public TopologicalOrderListener
-{
-
-protected:
-
- VisualClosureInitiator m_visual_initiator;
-
- CausalClosureInitiator m_causal_initiator;
-
- static const std::string m_instance_events_attribute;
-
- InstancePList m_modified_instaces;
-
- EventPList& get_instance_events(Instance* i)
- {
- static EventPList empty;
- return i->get_attribute<EventPList>(m_instance_events_attribute,empty);
- }
-
- /**
- * It was found that e1<e2 but not e1<<e2
- */
- BMsc* create_counter_example(Event* e1, Event* e2);
-
-public:
-
- BMscRaceChecker()
- {
-
- }
-
- BMscPtr check(BMscPtr bmsc, ChannelMapperPtr mapper);
-
- virtual void on_event_finished(Event* event)
- {
- TopologicalOrderListener::on_event_finished(event);
- //used to compare only ordering of events at the same instance
- get_instance_events(event->get_instance()).push_front(event);
- }
-
- void cleanup_attributes();
-
-};
-#endif /* _BMSC_RACE_CHECKER_H */
Deleted: trunk/src/check/causal_closure_initiator.cpp
===================================================================
--- trunk/src/check/causal_closure_initiator.cpp 2008-11-28 20:26:06 UTC (rev 122)
+++ trunk/src/check/causal_closure_initiator.cpp 2008-11-28 23:39:47 UTC (rev 123)
@@ -1,106 +0,0 @@
-/*
- * 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 <stack>
-
-#include "check/causal_closure_initiator.h"
-
-void CausalClosureInitiator::cleanup_attributes()
-{
- while(!m_modified_events.empty())
- {
- Event* e = m_modified_events.top();
- e->remove_attribute<BoolVector>(m_causal_closure_attribute);
- m_modified_events.pop();
- }
-}
-
-void CausalClosureInitiator::initialize(const EventPVector& events,
- VisualClosureInitiator& visual_closure_init, ChannelMapperPtr mapper)
-{
- //initialize matrix
- size_t events_count = events.size();
- EventPList::const_iterator i;
- //closure[x][y]==true <=> x << y
- std::vector<BoolVector*> closure(events_count);
- for(size_t i=0;i<events_count;i++)
- {
- Event* i_event = events[i];
- BoolVector& causal_closure = get_causal_closure(i_event);
- causal_closure.resize(events_count,false);
- closure[i] = &causal_closure;
- m_modified_events.push(i_event);
- //for any event e: e << e
- causal_closure[i] = true;
- //send event << receive matching event
- if(i_event->is_send() && i_event->is_matched())
- causal_closure[visual_closure_init.get_topology_index(
- i_event->get_matching_event())] = true;
- }
- for(size_t i=0;i<events_count;i++)
- {
- Event* i_event = events[i];
- BoolVector& i_causal_closure = *closure[i];
- BoolVector& i_visual_closure = visual_closure_init.get_visual_closure(i_event);
- for(size_t j = 0; j < events_count; j++)
- {
- Event* j_event = events[j];
- //i_event and j_event are from the same instance, j_event is send event and
- //i_event < j_event
- if(i_event->get_instance()==j_event->get_instance() &&
- j_event->is_send() && i_visual_closure[j])
- {
- i_causal_closure[j] = true;
- }
- //i_event and j_event are send events of the same channel and i_event<j_event
- else if(i_event->is_send() && i_event->is_matched() &&
- j_event->is_matched() && mapper->same_channel(i_event,j_event) &&
- i_visual_closure[j])
- {
- get_causal_closure(i_event->get_matching_event())[
- visual_closure_init.get_topology_index(j_event->get_matching_event())
- ] = true;
- }
- }
- }
- square_closure(closure);
-}
-
-void CausalClosureInitiator::square_closure(std::vector<BoolVector*>& closure)
-{
- size_t events_count = closure.size();
- bool changed = false;
- do
- {
- for(size_t i=0; i<events_count; i++)
- for(size_t j=0; j<events_count; j++)
- if(!(*closure[i])[j] && multiply(closure,i,j))
- (*closure[i])[j] = changed = true;
- }
- while(changed);
-}
-
-bool CausalClosureInitiator::multiply(std::vector<BoolVector*>& closure, size_t row, size_t column)
-{
- for(size_t index=0;index<closure.size();index++)
- {
- if((*closure[row])[index] && (*closure[index])[column])
- return true;
- }
- return false;
-}
Deleted: trunk/src/check/causal_closure_initiator.h
===================================================================
--- trunk/src/check/causal_closure_initiator.h 2008-11-28 20:26:06 UTC (rev 122)
+++ trunk/src/check/causal_closure_initiator.h 2008-11-28 23:39:47 UTC (rev 123)
@@ -1,103 +0,0 @@
-/*
- * 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 _CAUSAL_CLOSURE_INITIATOR_H
-#define _CAUSAL_CLOSURE_INITIATOR_H
-
-#include <stack>
-#include <vector>
-
-#include "data/msc.h"
-#include "check/dfs_instance_events_traverser.h"
-#include "check/visual_closure_initiator.h"
-
-typedef std::stack<Event*> EventPStack;
-
-class CausalClosureInitiator
-{
-
-protected:
-
- /**
- * Used for cleaning up attributes.
- */
- EventPStack m_modified_events;
-
- /**
- * Name of causal closure attribute.
- */
- std::string m_causal_closure_attribute;
-
- /**
- * Logically multiply closure by itself.
- */
- void square_closure(std::vector<BoolVector*>& closure);
-
- /**
- * Logical multiplication of row and column (indeces) of square matrix closure.
- */
- bool multiply(std::vector<BoolVector*>& closure, size_t row, size_t column);
-
-public:
-
- /**
- * Sets explicit names of attributes
- */
- CausalClosureInitiator(
- const std::string& causal_closure_attribute = "causal_closure")
- {
- m_causal_closure_attribute = causal_closure_attribute;
- }
-
-
- /**
- * Cleans up set attributes.
- */
- ~CausalClosureInitiator()
- {
- cleanup_attributes();
- }
-
- /**
- * Getter of causal closure attribute of e.
- */
- BoolVector& get_causal_closure(Event* e)
- {
- static BoolVector empty(1,false);
- return e->get_attribute<BoolVector>(m_causal_closure_attribute,empty);
- }
-
- /**
- * Computes causal closure.
- *
- * A visual_closure_init must be initialized - initialize method must be
- * called before.
- *
- * @param events - topologically sorted events used for visual_closure_init's initialization
- * @param visual_closure_init - initialized VisualClosureInitiator
- */
- void initialize(const EventPVector& events,
- VisualClosureInitiator& visual_closure_init, ChannelMapperPtr mapper);
-
- /**
- * Cleans up set attributes.
- */
- void cleanup_attributes();
-
-};
-#endif /* _CAUSAL_CLOSURE_INITIATOR_H */
Deleted: trunk/src/check/checker.h
===================================================================
--- trunk/src/check/checker.h 2008-11-28 20:26:06 UTC (rev 122)
+++ trunk/src/check/checker.h 2008-11-28 23:39:47 UTC (rev 123)
@@ -1,389 +0,0 @@
-/*
-* 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 _CHECKER_H
-#define _CHECKER_H
-
-#include <exception>
-#include <map>
-
-#include "data/msc.h"
-#include "data/counted_ptr.h"
-
-class ChannelMapper;
-class Checker;
-class HMscChecker;
-class BMscChecker;
-
-typedef counted_ptr<ChannelMapper> ChannelMapperPtr;
-typedef counted_ptr<Checker> CheckerPtr;
-typedef counted_ptr<HMscChecker> HMscCheckerPtr;
-typedef counted_ptr<BMscChecker> BMscCheckerPtr;
-
-/**
- * Basic abstract class for all checking algorithms.
- */
-class Checker
-{
-
-public:
-
- /**
- * Removes no more needed attributes.
- *
- * Descendat of this class should remove attributes of MscElements that are no
- * more needed. This method should be called after finish of algorithm.
- */
- virtual void cleanup_attributes()=0;
-
- /**
- * Checks whether Checker supports given ChannelMapper.
- *
- * Deafult behaviour is false for all mappers, but it is neccessary to check
- * out this behaviour in individual checkers.
- */
- virtual bool is_supported(ChannelMapperPtr chm)=0;
-
- virtual ~Checker()
- {
-
- }
-};
-
-/**
-* Basic abstract class for checking algorithms of HMsc.
-*/
-class HMscChecker
-{
-
-protected:
-
- /**
- * Hidden constructor.
- */
- HMscChec...
[truncated message content] |
|
From: <got...@us...> - 2008-11-29 11:22:35
|
Revision: 124
http://scstudio.svn.sourceforge.net/scstudio/?rev=124&view=rev
Author: gotthardp
Date: 2008-11-29 11:22:31 +0000 (Sat, 29 Nov 2008)
Log Message:
-----------
Win32 build fixed (added __declspec keywords).
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/src/check/liveness/CMakeLists.txt
trunk/src/check/liveness/deadlock_checker.h
trunk/src/check/liveness/livelock_checker.h
trunk/src/check/order/CMakeLists.txt
trunk/src/check/order/acyclic_checker.h
trunk/src/check/order/fifo_checker.h
trunk/src/check/pseudocode/CMakeLists.txt
trunk/src/check/pseudocode/causal_closure_initiator.h
trunk/src/check/pseudocode/visual_closure_initiator.h
trunk/src/data/CMakeLists.txt
trunk/src/data/checker.h
trunk/src/data/dfs_area_traverser.h
trunk/src/data/dfs_bmsc_graph_traverser.h
trunk/src/data/dfs_events_traverser.h
trunk/src/data/dfs_hmsc_traverser.h
trunk/src/data/dfs_inner_hmsc_traverser.h
trunk/src/data/dfs_instance_events_traverser.h
trunk/src/data/dfs_refnode_hmsc_traverser.h
trunk/src/data/dfsb_hmsc_traverser.h
trunk/src/data/msc.h
Added Paths:
-----------
trunk/src/check/liveness/export.h
trunk/src/check/order/export.h
trunk/src/check/pseudocode/export.h
trunk/src/data/export.h
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/CMakeLists.txt 2008-11-29 11:22:31 UTC (rev 124)
@@ -9,6 +9,12 @@
INCLUDE(${CMAKE_ROOT}/Modules/Dart.cmake)
INCLUDE_DIRECTORIES(src)
+
+IF (WIN32)
+ SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
+ SET(LIBRARY_OUTPUT_PATH ${EXECUTABLE_OUTPUT_PATH})
+ENDIF(WIN32)
+
ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(tests)
Modified: trunk/src/check/liveness/CMakeLists.txt
===================================================================
--- trunk/src/check/liveness/CMakeLists.txt 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/check/liveness/CMakeLists.txt 2008-11-29 11:22:31 UTC (rev 124)
@@ -5,6 +5,10 @@
livelock_checker.h
)
+TARGET_LINK_LIBRARIES(scliveness
+ scmsc
+)
+
INSTALL(TARGETS scliveness
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
Modified: trunk/src/check/liveness/deadlock_checker.h
===================================================================
--- trunk/src/check/liveness/deadlock_checker.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/check/liveness/deadlock_checker.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -25,6 +25,7 @@
#include "data/counted_ptr.h"
#include "data/dfs_hmsc_traverser.h"
#include "data/dfsb_hmsc_traverser.h"
+#include "check/liveness/export.h"
class DeadlockChecker;
class DeadlockListener;
@@ -109,7 +110,7 @@
}
};
-class DeadlockChecker: public Checker, public HMscChecker
+class SCLIVENESS_EXPORT DeadlockChecker: public Checker, public HMscChecker
{
protected:
Added: trunk/src/check/liveness/export.h
===================================================================
--- trunk/src/check/liveness/export.h (rev 0)
+++ trunk/src/check/liveness/export.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -0,0 +1,37 @@
+/*
+ * 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 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#ifndef _SCLIVENESS_EXPORT_H
+#define _SCLIVENESS_EXPORT_H
+
+#if defined(_MSC_VER)
+#pragma warning(disable: 4251)
+
+#if defined(scliveness_EXPORTS)
+#define SCLIVENESS_EXPORT __declspec(dllexport)
+#else
+#define SCLIVENESS_EXPORT __declspec(dllimport)
+#endif
+
+#else
+#define SCLIVENESS_EXPORT
+#endif
+
+#endif /* _SCLIVENESS_EXPORT_H */
+
+// $Id$
Property changes on: trunk/src/check/liveness/export.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/check/liveness/livelock_checker.h
===================================================================
--- trunk/src/check/liveness/livelock_checker.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/check/liveness/livelock_checker.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -21,6 +21,7 @@
#include "data/counted_ptr.h"
#include "data/dfs_hmsc_traverser.h"
#include "data/dfsb_hmsc_traverser.h"
+#include "check/liveness/export.h"
#include <string>
#include <stack>
@@ -93,7 +94,7 @@
* to maek all nodes on the way backwards reachable ( mark_reachable()).
* Then goes again looking for circle (gray listener) that is not reachable.
*/
-class LivelockChecker: public HMscChecker
+class SCLIVENESS_EXPORT LivelockChecker: public HMscChecker
{
protected:
/**
Modified: trunk/src/check/order/CMakeLists.txt
===================================================================
--- trunk/src/check/order/CMakeLists.txt 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/check/order/CMakeLists.txt 2008-11-29 11:22:31 UTC (rev 124)
@@ -5,6 +5,11 @@
fifo_checker.h
)
+TARGET_LINK_LIBRARIES(scorder
+ scmsc
+ scpseudocode
+)
+
INSTALL(TARGETS scorder
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
Modified: trunk/src/check/order/acyclic_checker.h
===================================================================
--- trunk/src/check/order/acyclic_checker.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/check/order/acyclic_checker.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -19,12 +19,13 @@
#include "data/checker.h"
#include "data/msc.h"
#include "data/dfs_events_traverser.h"
+#include "check/order/export.h"
class AcyclicChecker;
typedef counted_ptr<AcyclicChecker> AcyclicCheckerPtr;
-class AcyclicCheckerListener:
+class SCORDER_EXPORT AcyclicCheckerListener:
public WhiteEventFoundListener,
public GrayEventFoundListener,
public EventFinishedListener
Added: trunk/src/check/order/export.h
===================================================================
--- trunk/src/check/order/export.h (rev 0)
+++ trunk/src/check/order/export.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -0,0 +1,37 @@
+/*
+ * 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 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#ifndef _SCORDER_EXPORT_H
+#define _SCORDER_EXPORT_H
+
+#if defined(_MSC_VER)
+#pragma warning(disable: 4251)
+
+#if defined(scorder_EXPORTS)
+#define SCORDER_EXPORT __declspec(dllexport)
+#else
+#define SCORDER_EXPORT __declspec(dllimport)
+#endif
+
+#else
+#define SCORDER_EXPORT
+#endif
+
+#endif /* _SCORDER_EXPORT_H */
+
+// $Id$
Property changes on: trunk/src/check/order/export.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/check/order/fifo_checker.h
===================================================================
--- trunk/src/check/order/fifo_checker.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/check/order/fifo_checker.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -25,13 +25,14 @@
#include "data/msc.h"
#include "data/checker.h"
#include "check/pseudocode/visual_closure_initiator.h"
+#include "check/order/export.h"
class FifoChecker;
typedef std::stack<Event*> EventPStack;
typedef counted_ptr<FifoChecker> FifoCheckerPtr;
-class FifoChecker: public BMscChecker
+class SCORDER_EXPORT FifoChecker: public BMscChecker
{
protected:
Modified: trunk/src/check/pseudocode/CMakeLists.txt
===================================================================
--- trunk/src/check/pseudocode/CMakeLists.txt 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/check/pseudocode/CMakeLists.txt 2008-11-29 11:22:31 UTC (rev 124)
@@ -8,6 +8,10 @@
utils.h
)
+TARGET_LINK_LIBRARIES(scpseudocode
+ scmsc
+)
+
INSTALL(TARGETS scpseudocode
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
Modified: trunk/src/check/pseudocode/causal_closure_initiator.h
===================================================================
--- trunk/src/check/pseudocode/causal_closure_initiator.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/check/pseudocode/causal_closure_initiator.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -25,10 +25,11 @@
#include "data/msc.h"
#include "data/dfs_instance_events_traverser.h"
#include "check/pseudocode/visual_closure_initiator.h"
+#include "check/pseudocode/export.h"
typedef std::stack<Event*> EventPStack;
-class CausalClosureInitiator
+class SCPSEUDOCODE_EXPORT CausalClosureInitiator
{
protected:
Added: trunk/src/check/pseudocode/export.h
===================================================================
--- trunk/src/check/pseudocode/export.h (rev 0)
+++ trunk/src/check/pseudocode/export.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -0,0 +1,37 @@
+/*
+ * 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 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#ifndef _SCPSEUDOCODE_EXPORT_H
+#define _SCPSEUDOCODE_EXPORT_H
+
+#if defined(_MSC_VER)
+#pragma warning(disable: 4251)
+
+#if defined(scpseudocode_EXPORTS)
+#define SCPSEUDOCODE_EXPORT __declspec(dllexport)
+#else
+#define SCPSEUDOCODE_EXPORT __declspec(dllimport)
+#endif
+
+#else
+#define SCPSEUDOCODE_EXPORT
+#endif
+
+#endif /* _SCPSEUDOCODE_EXPORT_H */
+
+// $Id$
Property changes on: trunk/src/check/pseudocode/export.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/check/pseudocode/visual_closure_initiator.h
===================================================================
--- trunk/src/check/pseudocode/visual_closure_initiator.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/check/pseudocode/visual_closure_initiator.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -24,6 +24,7 @@
#include "data/msc.h"
#include "data/dfs_events_traverser.h"
+#include "check/pseudocode/export.h"
typedef std::list<Event*> EventPList;
typedef std::vector<Event*> EventPVector;
@@ -54,7 +55,7 @@
};
-class VisualClosureInitiator
+class SCPSEUDOCODE_EXPORT VisualClosureInitiator
{
protected:
Modified: trunk/src/data/CMakeLists.txt
===================================================================
--- trunk/src/data/CMakeLists.txt 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/data/CMakeLists.txt 2008-11-29 11:22:31 UTC (rev 124)
@@ -21,6 +21,7 @@
counted_ptr.h
msc.h
msc_visual.h
+ export.h
DESTINATION include/scstudio/data)
INSTALL(TARGETS scmsc
Modified: trunk/src/data/checker.h
===================================================================
--- trunk/src/data/checker.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/data/checker.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -38,7 +38,7 @@
/**
* Basic abstract class for all checking algorithms.
*/
-class Checker
+class SCMSC_EXPORT Checker
{
public:
@@ -68,7 +68,7 @@
/**
* Basic abstract class for checking algorithms of HMsc.
*/
-class HMscChecker
+class SCMSC_EXPORT HMscChecker
{
protected:
@@ -100,7 +100,7 @@
/**
* Basic abstract class for checking algorithms of BMsc.
*/
-class BMscChecker
+class SCMSC_EXPORT BMscChecker
{
protected:
Modified: trunk/src/data/dfs_area_traverser.h
===================================================================
--- trunk/src/data/dfs_area_traverser.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/data/dfs_area_traverser.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -27,7 +27,7 @@
*
* Single EventAreas are traversed in depth first search manner.
*/
-class DFSAreaTraverser:public DFSEventsTraverser
+class SCMSC_EXPORT DFSAreaTraverser:public DFSEventsTraverser
{
public:
Modified: trunk/src/data/dfs_bmsc_graph_traverser.h
===================================================================
--- trunk/src/data/dfs_bmsc_graph_traverser.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/data/dfs_bmsc_graph_traverser.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -199,7 +199,7 @@
typedef BlackNodeFoundListener* BlackNodeFoundListenerP;
typedef std::list<BlackNodeFoundListenerP> BlackNodeFoundListenerPList;
-class DFSListenersContainer
+class SCMSC_EXPORT DFSListenersContainer
{
public:
/**
@@ -338,7 +338,7 @@
*
* @warning Non-recursive HMsc is expected.
*/
-class DFSBMscGraphTraverser:public DFSListenersContainer
+class SCMSC_EXPORT DFSBMscGraphTraverser:public DFSListenersContainer
{
public:
Modified: trunk/src/data/dfs_events_traverser.h
===================================================================
--- trunk/src/data/dfs_events_traverser.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/data/dfs_events_traverser.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -102,7 +102,7 @@
*
* Listeners' methods are called at particular positions in code of traversing.
*/
-class DFSEventsTraverser
+class SCMSC_EXPORT DFSEventsTraverser
{
public:
Modified: trunk/src/data/dfs_hmsc_traverser.h
===================================================================
--- trunk/src/data/dfs_hmsc_traverser.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/data/dfs_hmsc_traverser.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -31,7 +31,7 @@
*
* @warning Non-recursive HMsc is expected.
*/
-class DFSHMscTraverser:public DFSBMscGraphTraverser
+class SCMSC_EXPORT DFSHMscTraverser:public DFSBMscGraphTraverser
{
protected:
Modified: trunk/src/data/dfs_inner_hmsc_traverser.h
===================================================================
--- trunk/src/data/dfs_inner_hmsc_traverser.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/data/dfs_inner_hmsc_traverser.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -48,7 +48,7 @@
typedef InnerHMscListener* InnerHMscListenerP;
typedef std::list<InnerHMscListenerP> InnerHMscListenerPList;
-class DFSInnerHMscTraverser:public DFSBMscGraphTraverser
+class SCMSC_EXPORT DFSInnerHMscTraverser:public DFSBMscGraphTraverser
{
protected:
Modified: trunk/src/data/dfs_instance_events_traverser.h
===================================================================
--- trunk/src/data/dfs_instance_events_traverser.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/data/dfs_instance_events_traverser.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -26,7 +26,7 @@
*
* I.e. this traverser doesn't follow matching events during traversing.
*/
-class DFSInstanceEventsTraverser:public DFSEventsTraverser
+class SCMSC_EXPORT DFSInstanceEventsTraverser:public DFSEventsTraverser
{
public:
Modified: trunk/src/data/dfs_refnode_hmsc_traverser.h
===================================================================
--- trunk/src/data/dfs_refnode_hmsc_traverser.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/data/dfs_refnode_hmsc_traverser.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -32,7 +32,7 @@
* consisting of StartNodes, EndNodes and ReferenceNodes.
* Moreover this traverser traverses each HMsc only one time.
*/
-class DFSRefNodeHMscTraverser:
+class SCMSC_EXPORT DFSRefNodeHMscTraverser:
public DFSBMscGraphTraverser,public WhiteNodeFoundListener,
public GrayNodeFoundListener,public BlackNodeFoundListener,
public NodeFinishedListener
Modified: trunk/src/data/dfsb_hmsc_traverser.h
===================================================================
--- trunk/src/data/dfsb_hmsc_traverser.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/data/dfsb_hmsc_traverser.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -28,7 +28,7 @@
* Traverses all accessible HMscNodes in single HMsc in depth
* first search manner in backward (B in class name) direction.
*/
-class DFSBHMscTraverser:public DFSListenersContainer
+class SCMSC_EXPORT DFSBHMscTraverser:public DFSListenersContainer
{
public:
Added: trunk/src/data/export.h
===================================================================
--- trunk/src/data/export.h (rev 0)
+++ trunk/src/data/export.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -0,0 +1,37 @@
+/*
+ * 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 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#ifndef _SCMSC_EXPORT_H
+#define _SCMSC_EXPORT_H
+
+#if defined(_MSC_VER)
+#pragma warning(disable: 4251)
+
+#if defined(scmsc_EXPORTS)
+#define SCMSC_EXPORT __declspec(dllexport)
+#else
+#define SCMSC_EXPORT __declspec(dllimport)
+#endif
+
+#else
+#define SCMSC_EXPORT
+#endif
+
+#endif /* _SCMSC_EXPORT_H */
+
+// $Id$
Property changes on: trunk/src/data/export.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2008-11-28 23:39:47 UTC (rev 123)
+++ trunk/src/data/msc.h 2008-11-29 11:22:31 UTC (rev 124)
@@ -28,6 +28,7 @@
#include "data/counted_ptr.h"
#include "data/msc_visual.h"
+#include "data/export.h"
class MscElement;
class HMscNode;
@@ -105,7 +106,7 @@
/**
* \brief Common basic abstract class for all elements of MSC
*/
-class MscElement
+class SCMSC_EXPORT MscElement
{
/**
* \brief Atributes of MscElement which may be dynamically created.
@@ -266,7 +267,7 @@
};
template <class T>
-class MscElementTmpl : public MscElement
+class SCMSC_EXPORT MscElementTmpl : public MscElement
{
protected:
@@ -322,7 +323,7 @@
/**
* \brief Represents virtual base class for BMsc and HMsc.
*/
-class Msc:public MscElementTmpl<Msc>
+class SCMSC_EXPORT Msc:public MscElementTmpl<Msc>
{
protected:
@@ -366,7 +367,7 @@
/**
* \brief Represents Basic MSC.
*/
-class BMsc:public Msc
+class SCMSC_EXPORT BMsc:public Msc
{
/**
@@ -410,7 +411,7 @@
/**
* \brief Base abstract class for node of HMsc
*/
-class HMscNode:public MscElementTmpl<HMscNode>
+class SCMSC_EXPORT HMscNode:public MscElementTmpl<HMscNode>
{
std::string m_label;
@@ -464,7 +465,7 @@
};
-class NodeRelation:public MscElementTmpl<NodeRelation>
+class SCMSC_EXPORT NodeRelation:public MscElementTmpl<NodeRelation>
{
protected:
@@ -508,7 +509,7 @@
typedef counted_ptr<NodeRelation> NodeRelationPtr;
typedef std::set<NodeRelationPtr> NodeRelationPtrSet;
-class SuccessorNode
+class SCMSC_EXPORT SuccessorNode
{
protected:
@@ -550,7 +551,7 @@
friend class PredecessorNode;
};
-class PredecessorNode
+class SCMSC_EXPORT PredecessorNode
{
protected:
@@ -604,7 +605,7 @@
*
* Represents end node as specified in Z.120
*/
-class EndNode:public SuccessorNode, public HMscNode
+class SCMSC_EXPORT EndNode:public SuccessorNode, public HMscNode
{
public:
@@ -625,7 +626,7 @@
* According to ITU-T standard, each HMsc has got exactly
* one start node.
*/
-class StartNode:public PredecessorNode, public HMscNode
+class SCMSC_EXPORT StartNode:public PredecessorNode, public HMscNode
{
public:
@@ -642,7 +643,7 @@
/**
* \brief Represents High-level MSC.
*/
-class HMsc:public Msc
+class SCMSC_EXPORT HMsc:public Msc
{
protected:
/**
@@ -717,7 +718,7 @@
*
* Represents reference node in Z.120.
*/
-class ReferenceNode:public PredecessorNode, public SuccessorNode, public HMscNode
+class SCMSC_EXPORT ReferenceNode:public PredecessorNode, public SuccessorNode, public HMscNode
{
private:
@@ -797,7 +798,7 @@
*
* Corresponds to ITU-T's connection node.
*/
-class ConnectionNode:public PredecessorNode, public SuccessorNode, public HMscNode
+class SCMSC_EXPORT ConnectionNode:public PredecessorNode, public SuccessorNode, public HMscNode
{
public:
@@ -823,7 +824,7 @@
* There isn't used std::list or something similar because it is necessary
* to have next EventArea accessible from the previous one.
*/
-class Instance:public MscElementTmpl<Instance>
+class SCMSC_EXPORT Instance:public MscElementTmpl<Instance>
{
protected:
@@ -947,7 +948,7 @@
/**
* \brief Message sent by Instances.
*/
-class MscMessage:public MscElementTmpl<MscMessage>
+class SCMSC_EXPORT MscMessage:public MscElementTmpl<MscMessage>
{
/**
* Label of message.
@@ -991,7 +992,7 @@
};
-class CompleteMessage:public MscMessage
+class SCMSC_EXPORT CompleteMessage:public MscMessage
{
/**
@@ -1073,7 +1074,7 @@
FOUND
} IncompleteMsgType;
-class IncompleteMessage: public MscMessage
+class SCMSC_EXPORT IncompleteMessage: public MscMessage
{
protected:
@@ -1133,7 +1134,7 @@
/**
* \brief Event which occurs in EventArea.
*/
-class Event:public MscElementTmpl<Event>
+class SCMSC_EXPORT Event:public MscElementTmpl<Event>
{
protected:
@@ -1408,7 +1409,7 @@
/**
* \brief Event occurring in StrictOrderArea
*/
-class StrictEvent: public EventTmpl<StrictOrderArea>
+class SCMSC_EXPORT StrictEvent: public EventTmpl<StrictOrderArea>
{
protected:
@@ -1484,7 +1485,7 @@
};
-class CoregionEventRelation:public MscElementTmpl<CoregionEventRelation>
+class SCMSC_EXPORT CoregionEventRelation:public MscElementTmpl<CoregionEventRelation>
{
private:
@@ -1532,7 +1533,7 @@
/**
* \brief Event occurring in CoregionArea
*/
-class CoregionEvent: public EventTmpl<CoregionArea>
+class SCMSC_EXPORT CoregionEvent: public EventTmpl<CoregionArea>
{
/**
* Successors of this event
@@ -1620,7 +1621,7 @@
*
* For details about EventArea organization at Instance see Instance.
*/
-class EventArea:public MscElementTmpl<EventArea>
+class SCMSC_EXPORT EventArea:public MscElementTmpl<EventArea>
{
protected:
@@ -1730,7 +1731,7 @@
* successors and predecessors defined directly in elements of this list
* (not using std::list).
*/
-class StrictOrderArea:public EventArea
+class SCMSC_EXPORT StrictOrderArea:public EventArea
{
/**
@@ -1833,7 +1834,7 @@
*
* Graph is organized by list of successors of particular element (CoregionEvent).
*/
-class CoregionArea:public EventArea
+class SCMSC_EXPORT CoregionArea:public EventArea
{
protected:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ba...@us...> - 2008-12-01 20:46:39
|
Revision: 126
http://scstudio.svn.sourceforge.net/scstudio/?rev=126&view=rev
Author: babicaj
Date: 2008-12-01 20:46:33 +0000 (Mon, 01 Dec 2008)
Log Message:
-----------
Many bugs in race checker found and still not working correctly. Hope this commit will resolve build errors
Modified Paths:
--------------
trunk/src/check/order/CMakeLists.txt
trunk/src/check/pseudocode/causal_closure_initiator.cpp
trunk/src/check/pseudocode/msc_duplicators.cpp
trunk/src/check/pseudocode/refnode_finder.cpp
trunk/src/check/pseudocode/refnode_finder.h
trunk/src/check/pseudocode/utils.cpp
trunk/src/check/pseudocode/utils.h
trunk/src/check/race/footprint.cpp
trunk/src/check/race/footprint.h
trunk/src/check/race/race_checker.cpp
trunk/src/check/race/race_checker.h
trunk/src/data/dfs_events_traverser.cpp
trunk/src/data/dfs_events_traverser.h
trunk/src/data/msc.cpp
trunk/src/data/msc.h
trunk/tests/CMakeLists.txt
Added Paths:
-----------
trunk/tests/race_checker_test.cpp
Modified: trunk/src/check/order/CMakeLists.txt
===================================================================
--- trunk/src/check/order/CMakeLists.txt 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/check/order/CMakeLists.txt 2008-12-01 20:46:33 UTC (rev 126)
@@ -1,6 +1,6 @@
ADD_LIBRARY(scorder SHARED
-# acyclic_checker.cpp
-# acyclic_checker.h
+ acyclic_checker.cpp
+ acyclic_checker.h
fifo_checker.cpp
fifo_checker.h
)
Modified: trunk/src/check/pseudocode/causal_closure_initiator.cpp
===================================================================
--- trunk/src/check/pseudocode/causal_closure_initiator.cpp 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/check/pseudocode/causal_closure_initiator.cpp 2008-12-01 20:46:33 UTC (rev 126)
@@ -68,9 +68,9 @@
i_causal_closure[j] = true;
}
//i_event and j_event are send events of the same channel and i_event<j_event
- else if(i_event->is_send() && i_event->is_matched() &&
- j_event->is_matched() && mapper->same_channel(i_event,j_event) &&
- i_visual_closure[j])
+ if(i_event->is_send() && i_event->is_matched() &&
+ j_event->is_send() && j_event->is_matched() &&
+ mapper->same_channel(i_event,j_event) && i_visual_closure[j])
{
get_causal_closure(i_event->get_matching_event())[
visual_closure_init.get_topology_index(j_event->get_matching_event())
@@ -84,9 +84,10 @@
void CausalClosureInitiator::square_closure(std::vector<BoolVector*>& closure)
{
size_t events_count = closure.size();
- bool changed = false;
+ bool changed;
do
{
+ changed = false;
for(size_t i=0; i<events_count; i++)
for(size_t j=0; j<events_count; j++)
if(!(*closure[i])[j] && multiply(closure,i,j))
Modified: trunk/src/check/pseudocode/msc_duplicators.cpp
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.cpp 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/check/pseudocode/msc_duplicators.cpp 2008-12-01 20:46:33 UTC (rev 126)
@@ -75,6 +75,8 @@
return duplicator.duplicate_bmsc(bmsc);
}
+/////////////////////////////////////////////////////////////////////////////
+
EventsCreatorListener::EventsCreatorListener(BMscDuplicator* duplicator, DFSAreaTraverser* traverser, BMsc* bmsc):
m_duplicator(duplicator),
m_traverser(traverser),
@@ -155,6 +157,8 @@
}
}
+/////////////////////////////////////////////////////////////////////////////
+
MessagesCreatorListener::MessagesCreatorListener(BMscDuplicator* duplicator):
m_duplicator(duplicator)
{
@@ -168,9 +172,9 @@
{
if(e->is_send())
{
- MscMessagePtr complete = new CompleteMessage(e,NULL,e->get_complete_message().get());
+ Event* matching_copy = m_duplicator->get_copy(e->get_matching_event());
+ MscMessagePtr complete = new CompleteMessage(event_copy,matching_copy,e->get_complete_message().get());
event_copy->set_message(complete);
- Event* matching_copy = m_duplicator->get_copy(e->get_matching_event());
matching_copy->set_message(complete);
}
}
Modified: trunk/src/check/pseudocode/refnode_finder.cpp
===================================================================
--- trunk/src/check/pseudocode/refnode_finder.cpp 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/check/pseudocode/refnode_finder.cpp 2008-12-01 20:46:33 UTC (rev 126)
@@ -17,6 +17,12 @@
*/
#include "check/pseudocode/refnode_finder.h"
+
+ReferenceNodeFinder::ReferenceNodeFinder(const std::string& color_attribute)
+ :DFSBMscGraphTraverser(color_attribute)
+{
+
+}
bool ReferenceNodeFinder::traverse_node(HMscNode* node)
{
@@ -33,7 +39,7 @@
if(dynamic_cast<ConnectionNode*>(node)||
dynamic_cast<StartNode*>(node))
{
- traverse_successors((PredecessorNode*)node);
+ traverse_successors(dynamic_cast<PredecessorNode*>(node));
}
//else node is supposed to be EndNode
}
Modified: trunk/src/check/pseudocode/refnode_finder.h
===================================================================
--- trunk/src/check/pseudocode/refnode_finder.h 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/check/pseudocode/refnode_finder.h 2008-12-01 20:46:33 UTC (rev 126)
@@ -73,11 +73,7 @@
public:
- ReferenceNodeFinder(const std::string& color_attribute = "rnf_color")
- :DFSBMscGraphTraverser(color_attribute)
- {
-
- }
+ ReferenceNodeFinder(const std::string& color_attribute = "rnf_color");
/**
* \brief Finds successors of node which aren't ConnectionNodes.
Modified: trunk/src/check/pseudocode/utils.cpp
===================================================================
--- trunk/src/check/pseudocode/utils.cpp 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/check/pseudocode/utils.cpp 2008-12-01 20:46:33 UTC (rev 126)
@@ -61,3 +61,61 @@
(*n)->get_owner()->remove_node(*n);
}
}
+
+///////////////////////////////////////////////////////////////
+
+void InstanceIdMarker::set_instance_id(Instance* i)
+{
+ StringSizeTMap::iterator it = m_identifiers.find(i->get_label());
+ if(it!=m_identifiers.end())
+ {
+ i->set_attribute<size_t>(m_instance_id_attribute,(*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;
+ }
+ m_modified_instances.push_back(i);
+}
+
+InstanceIdMarker::InstanceIdMarker(const std::string& instance_id_attribute)
+{
+ m_instance_id_attribute = instance_id_attribute;
+}
+
+void InstanceIdMarker::on_white_node_found(ReferenceNode* node)
+{
+ BMscPtr bmsc = node->get_bmsc();
+ if(bmsc.get())
+ {
+ InstancePtrList::const_iterator i;
+ const InstancePtrList& instances = bmsc->get_instances();
+ for(i=instances.begin();i!=instances.end();i++)
+ {
+ InstancePtr instance = *i;
+ set_instance_id(instance.get());
+ }
+ }
+}
+
+size_t InstanceIdMarker::get_instance_id(Instance* i)
+{
+ return i->get_attribute<size_t>(m_instance_id_attribute,0);
+}
+
+void InstanceIdMarker::cleanup_attributes()
+{
+ while(!m_modified_instances.empty())
+ {
+ m_modified_instances.front()->remove_attribute<size_t>(m_instance_id_attribute);
+ m_modified_instances.pop_front();
+ }
+ m_identifiers.clear();
+}
+
+size_t InstanceIdMarker::get_count()
+{
+ return m_identifiers.size();
+}
Modified: trunk/src/check/pseudocode/utils.h
===================================================================
--- trunk/src/check/pseudocode/utils.h 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/check/pseudocode/utils.h 2008-12-01 20:46:33 UTC (rev 126)
@@ -13,7 +13,7 @@
/**
* Marks Instances with apropriate identifiers
*/
-class InstanceIdMarker:public WhiteRefNodeFoundListener
+class SCPSEUDOCODE_EXPORT InstanceIdMarker:public WhiteRefNodeFoundListener
{
private:
@@ -23,59 +23,19 @@
std::list<Instance*> m_modified_instances;
- size_t m_counter;
+ void set_instance_id(Instance* i);
- void set_instance_id(Instance* i)
- {
- StringSizeTMap::iterator it = m_identifiers.find(i->get_label());
- if(it!=m_identifiers.end())
- i->set_attribute<size_t>(m_instance_id_attribute,(*it).second);
- else
- i->set_attribute<size_t>(m_instance_id_attribute,m_identifiers.size()+1);
- m_modified_instances.push_back(i);
- }
-
public:
- InstanceIdMarker(const std::string& instance_id_attribute="instance_id")
- {
- m_instance_id_attribute = instance_id_attribute;
- m_counter = 0;
- }
+ InstanceIdMarker(const std::string& instance_id_attribute="instance_id");
- void on_white_node_found(ReferenceNode* node)
- {
- BMscPtr bmsc = node->get_bmsc();
- if(bmsc.get())
- {
- InstancePtrList::const_iterator i;
- const InstancePtrList& instances = bmsc->get_instances();
- for(i=instances.begin();i!=instances.end();i++)
- {
- InstancePtr instance = *i;
- set_instance_id(instance.get());
- }
- }
- }
+ void on_white_node_found(ReferenceNode* node);
- size_t get_instance_id(Instance* i)
- {
- return i->get_attribute<size_t>(m_instance_id_attribute,0);
- }
+ size_t get_instance_id(Instance* i);
- void cleanup_attributes()
- {
- while(!m_modified_instances.empty())
- {
- m_modified_instances.front()->remove_attribute<size_t>(m_instance_id_attribute);
- m_modified_instances.pop_front();
- }
- }
+ void cleanup_attributes();
- size_t get_count()
- {
- return m_identifiers.size();
- }
+ size_t get_count();
};
Modified: trunk/src/check/race/footprint.cpp
===================================================================
--- trunk/src/check/race/footprint.cpp 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/check/race/footprint.cpp 2008-12-01 20:46:33 UTC (rev 126)
@@ -200,9 +200,9 @@
}
}
-ReferenceNode* Footprint::get_node()
+HMscNode* Footprint::get_node()
{
- return dynamic_cast<ReferenceNode*>(m_path.back());
+ return dynamic_cast<HMscNode*>(m_path.back());
}
// $Id$
Modified: trunk/src/check/race/footprint.h
===================================================================
--- trunk/src/check/race/footprint.h 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/check/race/footprint.h 2008-12-01 20:46:33 UTC (rev 126)
@@ -197,7 +197,7 @@
const ExtremeEvents& max_events_less,
const ExtremeEvents& max_events_greater);
- ReferenceNode* get_node();
+ HMscNode* get_node();
};
#endif /* _FOOTPRINT_H */
Modified: trunk/src/check/race/race_checker.cpp
===================================================================
--- trunk/src/check/race/race_checker.cpp 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/check/race/race_checker.cpp 2008-12-01 20:46:33 UTC (rev 126)
@@ -22,9 +22,29 @@
#include "check/race/race_checker.h"
#include "check/pseudocode/msc_duplicators.h"
+BMscRaceCheckingListener::BMscRaceCheckingListener(RaceChecker* checker, ChannelMapperPtr mapper)
+{
+ m_checker = checker;
+ m_mapper = mapper;
+}
+
+void BMscRaceCheckingListener::on_white_node_found(ReferenceNode* node)
+{
+ BMscPtr b = node->get_bmsc();
+ if(b.get())
+ {
+ BMscPtr example = m_checker->check_bmsc(b,m_mapper);
+ if(example.get())
+ throw RaceInBMscException(b);
+ //precompute MinP for b
+ }
+}
+
+//////////////////////////////////////////////////////////////////////
+
ExtremeEvents& MinimalEventsInitiator::get_events(BMsc* b)
{
- static ExtremeEvents extreme(m_instance_marker->get_count());
+ ExtremeEvents extreme(m_instance_marker->get_count());
m_modified_bmscs.push_back(b);
return b->get_attribute<ExtremeEvents>(m_events_attribute,extreme);
}
@@ -43,7 +63,7 @@
for(e1 = events->begin();e1!=events->end();e1++)
{
EventPList::const_iterator e2;
- for(e1 = events->begin();e1!=events->end();e1++)
+ for(e2 = events->begin();e2!=events->end();e2++)
{
if(e1!=e2)
{
@@ -143,7 +163,7 @@
ExtremeEvents& extreme_events_greater = get_events_greater(b.get());
ExtremeEvents& extreme_events_less = get_events_less(b.get());
m_modified_bmscs.push_back(b.get());
- EventPList* events = DFSEventsTraverser::topology_order((*e)->get_instance());
+ EventPListPtr events = DFSEventsTraverser::topology_order(b);
for(e=maximal_events.begin();e!=maximal_events.end();e++)
{
EDInstancesPtr e_instances_greater =
@@ -177,7 +197,6 @@
extreme_events_greater.add_extreme_event(
m_instance_marker->get_instance_id((*e)->get_instance()),e_instances_greater);
}
- delete events;
}
void MaximalEventsInitiator::cleanup_attributes(){
@@ -246,17 +265,18 @@
BMscPtr RaceChecker::check_bmsc(BMscPtr bmsc, ChannelMapperPtr mapper)
{
- EventPList* t = DFSEventsTraverser::topology_order(bmsc);
+ EventPListPtr t = DFSEventsTraverser::topology_order(bmsc);
EventPVector topology(
t->begin(),
t->end()
);
- delete t;
+ t.release();
m_visual_initiator.initialize(topology);
m_causal_initiator.initialize(topology,m_visual_initiator,mapper);
BMscPtr result;
OrderCheckerListener order_checker_listener(&m_visual_initiator);
DFSInstanceEventsTraverser instance_traverser;
+ instance_traverser.add_white_event_found_listener(&order_checker_listener);
for(size_t i = 0; i < topology.size(); i++)
{
//in this block checkout whether there is any Event in race with topology[i]
@@ -266,11 +286,9 @@
try
{
instance_traverser.traverse(topology[i]->get_instance());
- instance_traverser.cleanup_traversing_attributes();
}
catch(EventRaceException& e)
{
- instance_traverser.cleanup_traversing_attributes();
return create_counter_example(topology[i],e.get_event());
}
}
@@ -313,13 +331,18 @@
//transform hmsc into BMsc graph
HMscPtr transformed = BMscGraphDuplicator::duplicate(hmsc);
//compute causal closure of all BMsc and check BMscs to be race free
- HMscPtr res = check_bmscs(hmsc,mapper);
- if(res.get())
+ HMscPtr res = check_bmscs(transformed,mapper);
+ if(res.get())
+ {
+ cleanup_attributes();
return res;
+ }
//precompute possible things for race checking - e.g. MinP
- prepare_hmsc(hmsc,mapper);
+ prepare_hmsc(transformed,mapper);
//check hmsc to be race free
- return check_hmsc(hmsc,mapper);
+ HMscPtr error = check_hmsc(transformed,mapper);
+ cleanup_attributes();
+ return error;
}
HMscPtr RaceChecker::check_hmsc(HMscPtr hmsc,ChannelMapperPtr mapper)
Modified: trunk/src/check/race/race_checker.h
===================================================================
--- trunk/src/check/race/race_checker.h 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/check/race/race_checker.h 2008-12-01 20:46:33 UTC (rev 126)
@@ -164,7 +164,7 @@
};
-class RaceChecker:public HMscChecker
+class SCRACE_EXPORT RaceChecker:public HMscChecker
{
protected:
@@ -269,23 +269,9 @@
public:
- BMscRaceCheckingListener(RaceChecker* checker, ChannelMapperPtr mapper)
- {
- m_checker = checker;
- m_mapper = mapper;
- }
+ BMscRaceCheckingListener(RaceChecker* checker, ChannelMapperPtr mapper);
- void on_white_node_found(ReferenceNode* node)
- {
- BMscPtr b = node->get_bmsc();
- if(b.get())
- {
- BMscPtr example = m_checker->check_bmsc(b,m_mapper);
- if(example.get())
- throw RaceInBMscException(b);
- //precompute MinP for b
- }
- }
+ void on_white_node_found(ReferenceNode* node);
};
Modified: trunk/src/data/dfs_events_traverser.cpp
===================================================================
--- trunk/src/data/dfs_events_traverser.cpp 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/data/dfs_events_traverser.cpp 2008-12-01 20:46:33 UTC (rev 126)
@@ -145,7 +145,7 @@
EventPList::iterator event;
for(event=m_colored_events.begin();event!=m_colored_events.end();event++)
(*event)->remove_attribute<Color>(m_color);
- m_colored_events.erase(m_colored_events.begin(),m_colored_events.end());
+ m_colored_events.clear();
}
void DFSEventsTraverser::white_event_found(Event* e)
@@ -182,11 +182,11 @@
m_reached_elements.pop_back();
}
-EventPList* DFSEventsTraverser::topology_order(BMscPtr b)
+EventPListPtr DFSEventsTraverser::topology_order(BMscPtr b)
{
- EventPList* topology = new EventPList;
+ EventPListPtr topology = new EventPList;
DFSEventsTraverser traverser;
- TopologyOrderListener listener(topology);
+ TopologyOrderListener listener(topology.get());
traverser.add_event_finished_listener(&listener);
traverser.traverse(b);
return topology;
Modified: trunk/src/data/dfs_events_traverser.h
===================================================================
--- trunk/src/data/dfs_events_traverser.h 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/data/dfs_events_traverser.h 2008-12-01 20:46:33 UTC (rev 126)
@@ -23,6 +23,7 @@
#include "data/checker.h"
typedef std::list<Event*> EventPList;
+typedef counted_ptr<EventPList> EventPListPtr;
typedef std::list<MscElement*> MscElementPList;
/**
@@ -160,7 +161,7 @@
return m_reached_elements;
}
- static EventPList* topology_order(BMscPtr b);
+ static EventPListPtr topology_order(BMscPtr b);
void remove_white_event_found_listeners();
void remove_gray_event_found_listeners();
Modified: trunk/src/data/msc.cpp
===================================================================
--- trunk/src/data/msc.cpp 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/data/msc.cpp 2008-12-01 20:46:33 UTC (rev 126)
@@ -215,6 +215,38 @@
}
+/////////////////////////////////////////////////////////////////////////////
+
+MscMessage::MscMessage(const std::string& label):
+MscElementTmpl<MscMessage>(NULL),m_label(label)
+{
+}
+
+MscMessage::MscMessage(MscMessage* original):
+MscElementTmpl<MscMessage>(original)
+{
+}
+
+MscMessage::~MscMessage()
+{
+}
+
+const std::string& MscMessage::get_label() const
+{
+ if(get_original())
+ {
+ return get_original()->get_label();
+ }
+ return m_label;
+}
+
+void MscMessage::set_label(const std::string& label)
+{
+ m_label = label;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
IncompleteMessage::IncompleteMessage(IncompleteMessage* original):MscMessage(original)
{
m_type = original->get_type();
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/src/data/msc.h 2008-12-01 20:46:33 UTC (rev 126)
@@ -301,7 +301,7 @@
/**
* Getter for m_original.
*/
- T* get_original()
+ T* get_original() const
{
return m_original;
}
@@ -900,6 +900,10 @@
*/
const std::string& get_label()
{
+ if(get_original())
+ {
+ return get_original()->get_label();
+ }
return m_label;
}
@@ -963,33 +967,15 @@
* @param receiver - receiving instance
* @param label - label of message
*/
- MscMessage(const std::string& label=""):
- MscElementTmpl<MscMessage>(NULL),m_label(label)
- {
- }
+ MscMessage(const std::string& label="");
- MscMessage(MscMessage* original):
- MscElementTmpl<MscMessage>(original)
- {
- }
+ MscMessage(MscMessage* original);
- virtual ~MscMessage()
- {
+ virtual ~MscMessage();
- }
-
- /**
- * Getter for m_label.
- */
- const std::string& get_label() const
- {
- return m_label;
- }
+ const std::string& get_label() const;
- void set_label(const std::string& label)
- {
- m_label = label;
- }
+ void set_label(const std::string& label);
};
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2008-11-29 21:18:12 UTC (rev 125)
+++ trunk/tests/CMakeLists.txt 2008-12-01 20:46:33 UTC (rev 126)
@@ -28,4 +28,14 @@
)
ADD_TEST(fifo_checker fifo_checker_test)
+ADD_EXECUTABLE(race_checker_test
+ race_checker_test.cpp
+)
+TARGET_LINK_LIBRARIES(race_checker_test
+ scrace
+ scmsc
+ scpseudocode
+)
+#ADD_TEST(race_checker race_checker_test)
+
# $Id$
Added: trunk/tests/race_checker_test.cpp
===================================================================
--- trunk/tests/race_checker_test.cpp (rev 0)
+++ trunk/tests/race_checker_test.cpp 2008-12-01 20:46:33 UTC (rev 126)
@@ -0,0 +1,246 @@
+/*
+ * 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 <iostream>
+
+#include "data/msc.h"
+#include "check/race/race_checker.h"
+
+#define RETURN_IF_FAILED(res) if(!(res)) return 1;
+
+bool print_result(const HMscPtr hmsc,const bool is_race_free,const std::string& mapper_name)
+{
+ bool result;
+ if(is_race_free)
+ if(hmsc.get())
+ {
+ result =false;
+ std::cout << "ERROR: HMsc is supposed to be race free for " << mapper_name
+ << " channel mapper but it isn't" << std::endl;
+ }
+ else
+ {
+ result = true;
+ std::cout << "OK: HMsc is supposed to be race free for " << mapper_name
+ << " channel mapper and it is" << std::endl;
+ }
+ else
+ if(hmsc.get())
+ {
+ result = true;
+ std::cout << "OK: HMsc is supposed not to be race free for " << mapper_name
+ << " channel mapper and it isn't so" << std::endl;
+ }
+ else
+ {
+ result =false;
+ std::cout << "ERROR: HMsc is supposed not to be race free for " << mapper_name
+ << " channel mapper but it is" << std::endl;
+ }
+ std::cout << std::endl;
+ return result;
+}
+
+bool check(HMscPtr hmsc,const bool is_sr_race_free,const bool is_srl_race_free)
+{
+ static RaceChecker ch;
+ SRChannelMapperPtr srm = SRChannelMapper::instance();
+ SRLChannelMapperPtr srlm = SRLChannelMapper::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;
+}
+
+bool HMscA()
+{
+ std::cout << "HMscA:" << std::endl;
+ BMscPtr bmsc(new BMsc("BMsc"));
+ InstancePtr instance1(new Instance("1"));
+ InstancePtr instance2(new Instance("2"));
+ bmsc->add_instance(instance1);
+ bmsc->add_instance(instance2);
+ StrictOrderAreaPtr strict1(new StrictOrderArea());
+ StrictOrderAreaPtr strict2(new StrictOrderArea());
+ instance1->add_area(strict1);
+ instance2->add_area(strict2);
+ EventPtr e1 = strict1->add_event();
+ EventPtr e2 = strict2->add_event();
+ e1->send_message(e2.get(),"hi");
+
+ HMscPtr hmsc1(new HMsc("HMsc1"));
+ ReferenceNodePtr r1_1(new ReferenceNode());
+ ReferenceNodePtr r1_2(new ReferenceNode());
+ EndNodePtr end1(new EndNode());
+ hmsc1->add_node(r1_1);
+ hmsc1->add_node(r1_2);
+ hmsc1->add_node(end1);
+ hmsc1->get_start()->add_successor(r1_1.get());
+ hmsc1->get_start()->add_successor(r1_2.get());
+ r1_1->add_successor(end1.get());
+ r1_2->add_successor(end1.get());
+
+ r1_1->set_msc(bmsc);
+
+ HMscPtr hmsc2(new HMsc("HMsc2"));
+ ReferenceNodePtr r2_1(new ReferenceNode());
+ ReferenceNodePtr r2_2(new ReferenceNode());
+ EndNodePtr end2(new EndNode());
+ hmsc2->add_node(r2_1);
+ hmsc2->add_node(r2_2);
+ hmsc2->add_node(end2);
+ hmsc2->get_start()->add_successor(r2_1.get());
+ hmsc2->get_start()->add_successor(r2_2.get());
+ r2_1->add_successor(end2.get());
+ r2_2->add_successor(end2.get());
+
+ r1_2->set_msc(hmsc2);
+ r2_1->set_msc(bmsc);
+
+ HMscPtr hmsc3(new HMsc("HMsc3"));
+ ReferenceNodePtr r3_1(new ReferenceNode());
+ hmsc3->add_node(r2_1);
+ hmsc3->get_start()->add_successor(r3_1.get());
+
+ r2_2->set_msc(hmsc3);
+ r3_1->set_msc(bmsc);
+
+ return check(hmsc1,true,true);
+}
+
+bool HMscB()
+{
+ std::cout << "HMscB:" << std::endl;
+ //race in BMsc for both SRChannelMapper and SRLChannelMapper
+ BMscPtr bmsc(new BMsc("BMsc"));
+ InstancePtr instance1(new Instance("1"));
+ InstancePtr instance2(new Instance("2"));
+ InstancePtr instance3(new Instance("3"));
+ bmsc->add_instance(instance1);
+ bmsc->add_instance(instance2);
+ bmsc->add_instance(instance3);
+ StrictOrderAreaPtr strict1(new StrictOrderArea());
+ StrictOrderAreaPtr strict2(new StrictOrderArea());
+ StrictOrderAreaPtr strict3(new StrictOrderArea());
+ instance1->add_area(strict1);
+ instance2->add_area(strict2);
+ instance3->add_area(strict3);
+ EventPtr e1 = strict1->add_event();
+ EventPtr e2_1 = strict2->add_event();
+ EventPtr e2_2 = strict2->add_event();
+ EventPtr e3 = strict3->add_event();
+ e1->send_message(e2_1.get(),"hi");
+ e3->send_message(e2_2.get(),"hi");
+
+ HMscPtr hmsc1(new HMsc("HMsc"));
+ ReferenceNodePtr r1(new ReferenceNode());
+ EndNodePtr end1(new EndNode());
+ hmsc1->add_node(r1);
+ hmsc1->add_node(end1);
+ hmsc1->get_start()->add_successor(r1.get());
+ r1->add_successor(end1.get());
+
+ r1->set_msc(bmsc);
+
+ return check(hmsc1,false,false);
+}
+
+bool HMscC()
+{
+ std::cout << "HMscC:" << std::endl;
+ BMscPtr bmsc(new BMsc("BMsc"));
+ InstancePtr instance1(new Instance("1"));
+ InstancePtr instance2(new Instance("2"));
+ bmsc->add_instance(instance1);
+ bmsc->add_instance(instance2);
+ StrictOrderAreaPtr strict1(new StrictOrderArea());
+ StrictOrderAreaPtr strict2(new StrictOrderArea());
+ instance1->add_area(strict1);
+ instance2->add_area(strict2);
+ EventPtr e1_1 = strict1->add_event();
+ EventPtr e1_2 = strict1->add_event();
+ EventPtr e2_1 = strict2->add_event();
+ EventPtr e2_2 = strict2->add_event();
+ e1_1->send_message(e2_1.get(),"a");
+ e1_2->send_message(e2_2.get(),"b");
+
+ HMscPtr hmsc1(new HMsc("HMsc"));
+ ReferenceNodePtr r1(new ReferenceNode());
+ EndNodePtr end1(new EndNode());
+ hmsc1->add_node(r1);
+ hmsc1->add_node(end1);
+ hmsc1->get_start()->add_successor(r1.get());
+ r1->add_successor(end1.get());
+
+ r1->set_msc(bmsc);
+
+ return check(hmsc1,true,false);
+}
+
+bool HMscD()
+{
+ std::cout << "HMscD:" << std::endl;
+ BMscPtr bmsc1(new BMsc("BMsc"));
+ 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();
+ e1->send_message(e2.get(),"a");
+
+ BMscPtr bmsc2(new BMsc("BMsc"));
+ InstancePtr instance2_1(new Instance("1"));
+ InstancePtr instance2_2(new Instance("2"));
+ bmsc2->add_instance(instance2_1);
+ bmsc2->add_instance(instance2_2);
+ StrictOrderAreaPtr strict2_1(new StrictOrderArea());
+ StrictOrderAreaPtr strict2_2(new StrictOrderArea());
+ instance2_1->add_area(strict2_1);
+ instance2_2->add_area(strict2_2);
+ EventPtr e3 = strict2_1->add_event();
+ EventPtr e4 = strict2_2->add_event();
+ e3->send_message(e4.get(),"b");
+
+ HMscPtr hmsc1(new HMsc("HMsc"));
+ ReferenceNodePtr r1(new ReferenceNode());
+ ReferenceNodePtr r2(new ReferenceNode());
+ EndNodePtr end1(new EndNode());
+ hmsc1->add_node(r1);
+ hmsc1->add_node(r2);
+ hmsc1->add_node(end1);
+ hmsc1->get_start()->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,false);
+}
+
+int main(int argc, char** argv) {
+ RETURN_IF_FAILED(HMscA());
+ RETURN_IF_FAILED(HMscB());
+ RETURN_IF_FAILED(HMscC());
+ RETURN_IF_FAILED(HMscD());
+ return 0;
+}
\ No newline at end of file
Property changes on: trunk/tests/race_checker_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ba...@us...> - 2008-12-02 21:12:58
|
Revision: 129
http://scstudio.svn.sourceforge.net/scstudio/?rev=129&view=rev
Author: babicaj
Date: 2008-12-02 21:12:47 +0000 (Tue, 02 Dec 2008)
Log Message:
-----------
Hope that last build error was fixed. Due to lack of time only old gcc 3.4.4 was unfortunately tested. New acyclic_checker_test and race_checker_test was added. Race checker passed basic tests. More sophisticated tests are necessary. I don't believe there isn't any other bug :) Memory leaks reported by old (and may be new) tests will be fixed in short time
Modified Paths:
--------------
trunk/src/check/pseudocode/utils.h
trunk/src/check/race/race_checker.cpp
trunk/src/check/race/race_checker.h
trunk/tests/CMakeLists.txt
trunk/tests/race_checker_test.cpp
Modified: trunk/src/check/pseudocode/utils.h
===================================================================
--- trunk/src/check/pseudocode/utils.h 2008-12-02 13:59:38 UTC (rev 128)
+++ trunk/src/check/pseudocode/utils.h 2008-12-02 21:12:47 UTC (rev 129)
@@ -72,7 +72,8 @@
typename MscElementContainer::const_iterator i;
for(i=container.begin();i!=container.end();i++)
{
- (*i)->remove_attribute<AttributeType>(name);
+ MscElement* e = (*i);
+ e->remove_attribute<AttributeType>(name);
}
}
Modified: trunk/src/check/race/race_checker.cpp
===================================================================
--- trunk/src/check/race/race_checker.cpp 2008-12-02 13:59:38 UTC (rev 128)
+++ trunk/src/check/race/race_checker.cpp 2008-12-02 21:12:47 UTC (rev 129)
@@ -407,6 +407,7 @@
m_mapper = mapper;
FootprintPtr initial = new Footprint(hmsc->get_start().get(),instances_count);
todo.insert(initial);
+ add_white_node_found_listener(this);
}
FootprintPtr FootprintTraverser::extract_todo()
@@ -422,10 +423,23 @@
{
m_footprint = extract_todo();
done.insert(m_footprint);
- ReferenceNodeFinder::traverse(m_footprint->get_node());
+ traverse(m_footprint->get_node());
}
}
+void FootprintTraverser::traverse(HMscNode* node)
+{
+ 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();
+}
+
void FootprintTraverser::on_white_node_found(ReferenceNode* node)
{
check_race(node->get_bmsc().get());
@@ -433,7 +447,7 @@
m_footprint,this->get_reached_elements().back(),
m_max->get_events_less(node->get_bmsc().get()),
m_max->get_events_greater(node->get_bmsc().get()));
- if(todo.find(f)!=todo.end() && done.find(f)!=done.end())
+ if(todo.find(f)==todo.end() && done.find(f)==done.end())
{
todo.insert(f);
}
@@ -459,7 +473,7 @@
Event* a_event = (*a)->get_event();
if(a_event->is_receive() && !m_mapper->same_channel(a_event,b_event))
{
- throw new RaceInHMscException(m_footprint,b_event,a_event,get_reached_elements().back());
+ throw RaceInHMscException(m_footprint,b_event,a_event,get_reached_elements().back());
}
else if(a_event->is_send())
{
Modified: trunk/src/check/race/race_checker.h
===================================================================
--- trunk/src/check/race/race_checker.h 2008-12-02 13:59:38 UTC (rev 128)
+++ trunk/src/check/race/race_checker.h 2008-12-02 21:12:47 UTC (rev 129)
@@ -159,6 +159,8 @@
void on_white_node_found(ReferenceNode* node);
void traverse();
+
+ void traverse(HMscNode* node);
//void traverse(PredecessorNode* node);
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2008-12-02 13:59:38 UTC (rev 128)
+++ trunk/tests/CMakeLists.txt 2008-12-02 21:12:47 UTC (rev 129)
@@ -28,6 +28,16 @@
)
ADD_TEST(fifo_checker fifo_checker_test)
+ADD_EXECUTABLE(acyclic_checker_test
+ acyclic_checker_test.cpp
+)
+TARGET_LINK_LIBRARIES(acyclic_checker_test
+ scorder
+ scmsc
+ scpseudocode
+)
+ADD_TEST(acyclic_checker acyclic_checker_test)
+
ADD_EXECUTABLE(race_checker_test
race_checker_test.cpp
)
@@ -36,6 +46,6 @@
scmsc
scpseudocode
)
-#ADD_TEST(race_checker race_checker_test)
+ADD_TEST(race_checker race_checker_test)
# $Id$
Modified: trunk/tests/race_checker_test.cpp
===================================================================
--- trunk/tests/race_checker_test.cpp 2008-12-02 13:59:38 UTC (rev 128)
+++ trunk/tests/race_checker_test.cpp 2008-12-02 21:12:47 UTC (rev 129)
@@ -19,53 +19,53 @@
#include <iostream>
#include "data/msc.h"
-#include "check/race/race_checker.h"
-
-#define RETURN_IF_FAILED(res) if(!(res)) return 1;
-
-bool print_result(const HMscPtr hmsc,const bool is_race_free,const std::string& mapper_name)
-{
- bool result;
- if(is_race_free)
- if(hmsc.get())
- {
- result =false;
- std::cout << "ERROR: HMsc is supposed to be race free for " << mapper_name
- << " channel mapper but it isn't" << std::endl;
- }
- else
- {
- result = true;
- std::cout << "OK: HMsc is supposed to be race free for " << mapper_name
- << " channel mapper and it is" << std::endl;
- }
- else
- if(hmsc.get())
- {
- result = true;
- std::cout << "OK: HMsc is supposed not to be race free for " << mapper_name
- << " channel mapper and it isn't so" << std::endl;
- }
- else
- {
- result =false;
- std::cout << "ERROR: HMsc is supposed not to be race free for " << mapper_name
- << " channel mapper but it is" << std::endl;
- }
- std::cout << std::endl;
- return result;
-}
-
-bool check(HMscPtr hmsc,const bool is_sr_race_free,const bool is_srl_race_free)
-{
- static RaceChecker ch;
- SRChannelMapperPtr srm = SRChannelMapper::instance();
- SRLChannelMapperPtr srlm = SRLChannelMapper::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;
+#include "check/race/race_checker.h"
+
+#define RETURN_IF_FAILED(res) if(!(res)) return 1;
+
+bool print_result(const HMscPtr hmsc,const bool is_race_free,const std::string& mapper_name)
+{
+ bool result;
+ if(is_race_free)
+ if(hmsc.get())
+ {
+ result =false;
+ std::cout << "ERROR: HMsc is supposed to be race free for " << mapper_name
+ << " channel mapper but it isn't" << std::endl;
+ }
+ else
+ {
+ result = true;
+ std::cout << "OK: HMsc is supposed to be race free for " << mapper_name
+ << " channel mapper and it is" << std::endl;
+ }
+ else
+ if(hmsc.get())
+ {
+ result = true;
+ std::cout << "OK: HMsc is supposed not to be race free for " << mapper_name
+ << " channel mapper and it isn't so" << std::endl;
+ }
+ else
+ {
+ result =false;
+ std::cout << "ERROR: HMsc is supposed not to be race free for " << mapper_name
+ << " channel mapper but it is" << std::endl;
+ }
+ std::cout << std::endl;
+ return result;
}
+bool check(HMscPtr hmsc,const bool is_sr_race_free,const bool is_srl_race_free)
+{
+ static RaceChecker ch;
+ SRChannelMapperPtr srm = SRChannelMapper::instance();
+ SRLChannelMapperPtr srlm = SRLChannelMapper::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;
+}
+
bool HMscA()
{
std::cout << "HMscA:" << std::endl;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2008-12-03 08:41:40
|
Revision: 130
http://scstudio.svn.sourceforge.net/scstudio/?rev=130&view=rev
Author: gotthardp
Date: 2008-12-03 08:41:14 +0000 (Wed, 03 Dec 2008)
Log Message:
-----------
Fixed svn properties for new files.
Please do not forget to add eol-style=native and keywords=Id to every source file.
Modified Paths:
--------------
trunk/src/check/pseudocode/utils.cpp
trunk/tests/acyclic_checker_test.cpp
trunk/tests/deadlock_checker_test.cpp
trunk/tests/fifo_checker_test.cpp
trunk/tests/livelock_checker_test.cpp
trunk/tests/race_checker_test.cpp
Property Changed:
----------------
trunk/src/check/pseudocode/utils.cpp
trunk/tests/race_checker_test.cpp
Modified: trunk/src/check/pseudocode/utils.cpp
===================================================================
--- trunk/src/check/pseudocode/utils.cpp 2008-12-02 21:12:47 UTC (rev 129)
+++ trunk/src/check/pseudocode/utils.cpp 2008-12-03 08:41:14 UTC (rev 130)
@@ -1,121 +1,121 @@
-#include "check/pseudocode/utils.h"
-
-//////////////////////////////////////////////////////////
-
-WhiteNodeMarker::WhiteNodeMarker(const std::string& mark):
-m_mark(mark)
-{
-}
-
-WhiteNodeMarker::~WhiteNodeMarker()
-{
- cleanup_attributes();
-}
-
-void WhiteNodeMarker::cleanup_attributes()
-{
- remove_attributes<HMscNodePList,bool>(m_modified,m_mark);
-}
-
-void WhiteNodeMarker::on_white_node_found(HMscNode* n)
-{
- bool& mark = get_mark(n);
- mark = true;
-}
-
-bool& WhiteNodeMarker::get_mark(HMscNode* n)
-{
- bool just_set;
- bool& mark = n->get_attribute(m_mark,false,just_set);
- if(just_set)
- {
- m_modified.push_back(n);
- }
- return mark;
-}
-
-//////////////////////////////////////////////////////////
-
-
-NoendingNodesEliminator::NoendingNodesEliminator()
-{
- m_back_traverser.add_white_node_found_listener(&m_marker);
-}
-
-void NoendingNodesEliminator::eliminate(HMscPtr& hmsc)
-{
- m_back_traverser.traverse(hmsc);
- HMscNodePList noending;
- HMscNodePtrSet::const_iterator i;
- for(i=hmsc->get_nodes().begin();i!=hmsc->get_nodes().end();i++)
- {
- if(!m_marker.get_mark((*i).get()))
- {
- noending.push_back((*i).get());
- }
- }
- m_marker.cleanup_attributes();
- HMscNodePList::const_iterator n;
- for(n=noending.begin();n!=noending.end();n++)
- {
- (*n)->get_owner()->remove_node(*n);
- }
-}
-
-///////////////////////////////////////////////////////////////
-
-void InstanceIdMarker::set_instance_id(Instance* i)
-{
- StringSizeTMap::iterator it = m_identifiers.find(i->get_label());
- if(it!=m_identifiers.end())
- {
- i->set_attribute<size_t>(m_instance_id_attribute,(*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;
- }
- m_modified_instances.push_back(i);
-}
-
-InstanceIdMarker::InstanceIdMarker(const std::string& instance_id_attribute)
-{
- m_instance_id_attribute = instance_id_attribute;
-}
-
-void InstanceIdMarker::on_white_node_found(ReferenceNode* node)
-{
- BMscPtr bmsc = node->get_bmsc();
- if(bmsc.get())
- {
- InstancePtrList::const_iterator i;
- const InstancePtrList& instances = bmsc->get_instances();
- for(i=instances.begin();i!=instances.end();i++)
- {
- InstancePtr instance = *i;
- set_instance_id(instance.get());
- }
- }
-}
-
-size_t InstanceIdMarker::get_instance_id(Instance* i)
-{
- return i->get_attribute<size_t>(m_instance_id_attribute,0);
-}
-
-void InstanceIdMarker::cleanup_attributes()
-{
- while(!m_modified_instances.empty())
- {
- m_modified_instances.front()->remove_attribute<size_t>(m_instance_id_attribute);
- m_modified_instances.pop_front();
- }
- m_identifiers.clear();
-}
-
-size_t InstanceIdMarker::get_count()
-{
- return m_identifiers.size();
-}
+#include "check/pseudocode/utils.h"
+
+//////////////////////////////////////////////////////////
+
+WhiteNodeMarker::WhiteNodeMarker(const std::string& mark):
+m_mark(mark)
+{
+}
+
+WhiteNodeMarker::~WhiteNodeMarker()
+{
+ cleanup_attributes();
+}
+
+void WhiteNodeMarker::cleanup_attributes()
+{
+ remove_attributes<HMscNodePList,bool>(m_modified,m_mark);
+}
+
+void WhiteNodeMarker::on_white_node_found(HMscNode* n)
+{
+ bool& mark = get_mark(n);
+ mark = true;
+}
+
+bool& WhiteNodeMarker::get_mark(HMscNode* n)
+{
+ bool just_set;
+ bool& mark = n->get_attribute(m_mark,false,just_set);
+ if(just_set)
+ {
+ m_modified.push_back(n);
+ }
+ return mark;
+}
+
+//////////////////////////////////////////////////////////
+
+
+NoendingNodesEliminator::NoendingNodesEliminator()
+{
+ m_back_traverser.add_white_node_found_listener(&m_marker);
+}
+
+void NoendingNodesEliminator::eliminate(HMscPtr& hmsc)
+{
+ m_back_traverser.traverse(hmsc);
+ HMscNodePList noending;
+ HMscNodePtrSet::const_iterator i;
+ for(i=hmsc->get_nodes().begin();i!=hmsc->get_nodes().end();i++)
+ {
+ if(!m_marker.get_mark((*i).get()))
+ {
+ noending.push_back((*i).get());
+ }
+ }
+ m_marker.cleanup_attributes();
+ HMscNodePList::const_iterator n;
+ for(n=noending.begin();n!=noending.end();n++)
+ {
+ (*n)->get_owner()->remove_node(*n);
+ }
+}
+
+///////////////////////////////////////////////////////////////
+
+void InstanceIdMarker::set_instance_id(Instance* i)
+{
+ StringSizeTMap::iterator it = m_identifiers.find(i->get_label());
+ if(it!=m_identifiers.end())
+ {
+ i->set_attribute<size_t>(m_instance_id_attribute,(*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;
+ }
+ m_modified_instances.push_back(i);
+}
+
+InstanceIdMarker::InstanceIdMarker(const std::string& instance_id_attribute)
+{
+ m_instance_id_attribute = instance_id_attribute;
+}
+
+void InstanceIdMarker::on_white_node_found(ReferenceNode* node)
+{
+ BMscPtr bmsc = node->get_bmsc();
+ if(bmsc.get())
+ {
+ InstancePtrList::const_iterator i;
+ const InstancePtrList& instances = bmsc->get_instances();
+ for(i=instances.begin();i!=instances.end();i++)
+ {
+ InstancePtr instance = *i;
+ set_instance_id(instance.get());
+ }
+ }
+}
+
+size_t InstanceIdMarker::get_instance_id(Instance* i)
+{
+ return i->get_attribute<size_t>(m_instance_id_attribute,0);
+}
+
+void InstanceIdMarker::cleanup_attributes()
+{
+ while(!m_modified_instances.empty())
+ {
+ m_modified_instances.front()->remove_attribute<size_t>(m_instance_id_attribute);
+ m_modified_instances.pop_front();
+ }
+ m_identifiers.clear();
+}
+
+size_t InstanceIdMarker::get_count()
+{
+ return m_identifiers.size();
+}
Property changes on: trunk/src/check/pseudocode/utils.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/tests/acyclic_checker_test.cpp
===================================================================
--- trunk/tests/acyclic_checker_test.cpp 2008-12-02 21:12:47 UTC (rev 129)
+++ trunk/tests/acyclic_checker_test.cpp 2008-12-03 08:41:14 UTC (rev 130)
@@ -135,4 +135,6 @@
RETURN_IF_FAILED(BMscA());
RETURN_IF_FAILED(BMscB());
return 0;
-}
\ No newline at end of file
+}
+
+// $Id$
Modified: trunk/tests/deadlock_checker_test.cpp
===================================================================
--- trunk/tests/deadlock_checker_test.cpp 2008-12-02 21:12:47 UTC (rev 129)
+++ trunk/tests/deadlock_checker_test.cpp 2008-12-03 08:41:14 UTC (rev 130)
@@ -51,3 +51,5 @@
std::cerr << "ERROR: h1 doesn't contain deadlock" << std::endl;
return 1;
}
+
+// $Id$
Modified: trunk/tests/fifo_checker_test.cpp
===================================================================
--- trunk/tests/fifo_checker_test.cpp 2008-12-02 21:12:47 UTC (rev 129)
+++ trunk/tests/fifo_checker_test.cpp 2008-12-03 08:41:14 UTC (rev 130)
@@ -700,3 +700,5 @@
return check(myBmsc,false,false);
}
+
+// $Id$
Modified: trunk/tests/livelock_checker_test.cpp
===================================================================
--- trunk/tests/livelock_checker_test.cpp 2008-12-02 21:12:47 UTC (rev 129)
+++ trunk/tests/livelock_checker_test.cpp 2008-12-03 08:41:14 UTC (rev 130)
@@ -54,3 +54,5 @@
std::cerr << "ERROR: h1 doesn't contain livelock" << std::endl;
return 1;
}
+
+// $Id$
Modified: trunk/tests/race_checker_test.cpp
===================================================================
--- trunk/tests/race_checker_test.cpp 2008-12-02 21:12:47 UTC (rev 129)
+++ trunk/tests/race_checker_test.cpp 2008-12-03 08:41:14 UTC (rev 130)
@@ -243,4 +243,6 @@
RETURN_IF_FAILED(HMscC());
RETURN_IF_FAILED(HMscD());
return 0;
-}
\ No newline at end of file
+}
+
+// $Id$
Property changes on: trunk/tests/race_checker_test.cpp
___________________________________________________________________
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2008-12-25 15:59:51
|
Revision: 136
http://scstudio.svn.sourceforge.net/scstudio/?rev=136&view=rev
Author: gotthardp
Date: 2008-12-25 15:59:43 +0000 (Thu, 25 Dec 2008)
Log Message:
-----------
Updates to simplify automated msc.h structure generation.
- MscEvent->send_message replaced by CompleteMessage::glue_events()
- proprietary counted_ptr replaced by boost::intrusive_ptr
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/src/check/liveness/deadlock_checker.h
trunk/src/check/liveness/livelock_checker.cpp
trunk/src/check/liveness/livelock_checker.h
trunk/src/check/order/acyclic_checker.h
trunk/src/check/order/fifo_checker.h
trunk/src/check/pseudocode/refnode_finder.h
trunk/src/check/race/footprint.cpp
trunk/src/check/race/footprint.h
trunk/src/check/race/race_checker.cpp
trunk/src/data/checker.h
trunk/src/data/dfs_events_traverser.cpp
trunk/src/data/dfs_events_traverser.h
trunk/src/data/dfs_instance_events_traverser.cpp
trunk/src/data/dfs_instance_events_traverser.h
trunk/src/data/msc.cpp
trunk/src/data/msc.h
trunk/tests/acyclic_checker_test.cpp
trunk/tests/fifo_checker_test.cpp
trunk/tests/race_checker_test.cpp
Removed Paths:
-------------
trunk/src/data/counted_ptr.h
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/CMakeLists.txt 2008-12-25 15:59:43 UTC (rev 136)
@@ -8,6 +8,10 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
INCLUDE(${CMAKE_ROOT}/Modules/Dart.cmake)
+FIND_PACKAGE(Boost 1.31
+ COMPONENTS shared_ptr intrusive_ptr)
+INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
+
INCLUDE_DIRECTORIES(src)
IF (WIN32)
Modified: trunk/src/check/liveness/deadlock_checker.h
===================================================================
--- trunk/src/check/liveness/deadlock_checker.h 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/check/liveness/deadlock_checker.h 2008-12-25 15:59:43 UTC (rev 136)
@@ -22,7 +22,6 @@
#include "data/checker.h"
#include "data/msc.h"
-#include "data/counted_ptr.h"
#include "data/dfs_hmsc_traverser.h"
#include "data/dfsb_hmsc_traverser.h"
#include "check/liveness/export.h"
@@ -30,7 +29,7 @@
class DeadlockChecker;
class DeadlockListener;
-typedef counted_ptr<DeadlockChecker> DeadlockCheckerPtr;
+typedef boost::shared_ptr<DeadlockChecker> DeadlockCheckerPtr;
class DeadlockException:public std::exception
{
@@ -149,7 +148,7 @@
static DeadlockCheckerPtr instance()
{
if(!m_instance.get())
- m_instance = new DeadlockChecker();
+ m_instance = DeadlockCheckerPtr(new DeadlockChecker());
return m_instance;
}
Modified: trunk/src/check/liveness/livelock_checker.cpp
===================================================================
--- trunk/src/check/liveness/livelock_checker.cpp 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/check/liveness/livelock_checker.cpp 2008-12-25 15:59:43 UTC (rev 136)
@@ -115,7 +115,7 @@
LivelockCheckerPtr LivelockChecker::instance()
{
if(!m_instance.get())
- m_instance = new LivelockChecker();
+ m_instance = LivelockCheckerPtr(new LivelockChecker());
return m_instance;
}
Modified: trunk/src/check/liveness/livelock_checker.h
===================================================================
--- trunk/src/check/liveness/livelock_checker.h 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/check/liveness/livelock_checker.h 2008-12-25 15:59:43 UTC (rev 136)
@@ -18,7 +18,6 @@
#include "data/checker.h"
#include "data/msc.h"
-#include "data/counted_ptr.h"
#include "data/dfs_hmsc_traverser.h"
#include "data/dfsb_hmsc_traverser.h"
#include "check/liveness/export.h"
@@ -34,7 +33,7 @@
// main class
class LivelockChecker;
-typedef counted_ptr<LivelockChecker> LivelockCheckerPtr;
+typedef boost::shared_ptr<LivelockChecker> LivelockCheckerPtr;
typedef InnerNode* InnerNodeP;
typedef std::stack<InnerNode*> InnerNodePStack;
Modified: trunk/src/check/order/acyclic_checker.h
===================================================================
--- trunk/src/check/order/acyclic_checker.h 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/check/order/acyclic_checker.h 2008-12-25 15:59:43 UTC (rev 136)
@@ -23,7 +23,7 @@
class AcyclicChecker;
-typedef counted_ptr<AcyclicChecker> AcyclicCheckerPtr;
+typedef boost::shared_ptr<AcyclicChecker> AcyclicCheckerPtr;
class AcyclicCheckerListener:
public WhiteEventFoundListener,
@@ -103,7 +103,7 @@
static AcyclicCheckerPtr instance()
{
if(!m_instance.get())
- m_instance = new AcyclicChecker();
+ m_instance = AcyclicCheckerPtr(new AcyclicChecker());
return m_instance;
}
Modified: trunk/src/check/order/fifo_checker.h
===================================================================
--- trunk/src/check/order/fifo_checker.h 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/check/order/fifo_checker.h 2008-12-25 15:59:43 UTC (rev 136)
@@ -30,7 +30,7 @@
class FifoChecker;
typedef std::stack<Event*> EventPStack;
-typedef counted_ptr<FifoChecker> FifoCheckerPtr;
+typedef boost::shared_ptr<FifoChecker> FifoCheckerPtr;
class SCORDER_EXPORT FifoChecker: public BMscChecker
{
@@ -74,20 +74,14 @@
*/
bool is_supported(ChannelMapperPtr chm)
{
- try
- {
- SRChannelMapperPtr p = chm;
+ SRChannelMapperPtr p1 = boost::dynamic_pointer_cast<SRChannelMapper>(chm);
+ if(p1 != NULL)
return true;
- }
- catch(std::bad_cast)
- {
- try
- {
- SRLChannelMapperPtr p = chm;
- return true;
- }
- catch(std::bad_cast){}
- }
+
+ SRLChannelMapperPtr p2 = boost::dynamic_pointer_cast<SRLChannelMapper>(chm);
+ if(p2 != NULL)
+ return true;
+
return false;
}
@@ -104,7 +98,7 @@
static FifoCheckerPtr instance()
{
if(!m_instance.get())
- m_instance = new FifoChecker();
+ m_instance = FifoCheckerPtr(new FifoChecker());
return m_instance;
}
Modified: trunk/src/check/pseudocode/refnode_finder.h
===================================================================
--- trunk/src/check/pseudocode/refnode_finder.h 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/check/pseudocode/refnode_finder.h 2008-12-25 15:59:43 UTC (rev 136)
@@ -24,7 +24,7 @@
#include "check/pseudocode/export.h"
typedef std::list<HMscNode*> HMscNodePList;
-typedef counted_ptr<HMscNodePList> HMscNodePListPtr;
+typedef boost::shared_ptr<HMscNodePList> HMscNodePListPtr;
class ReferenceNodeFinderListener:
public WhiteNodeFoundListener,public GrayNodeFoundListener
Modified: trunk/src/check/race/footprint.cpp
===================================================================
--- trunk/src/check/race/footprint.cpp 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/check/race/footprint.cpp 2008-12-25 15:59:43 UTC (rev 136)
@@ -167,7 +167,7 @@
EDInstancesPtrSet::const_iterator previous_edi;
for(previous_edi=previous_events[i].begin();previous_edi!=previous_events[i].end();previous_edi++)
{
- EDInstancesPtr new_edi = new EventDependentInstances(**previous_edi);
+ EDInstancesPtr new_edi(new EventDependentInstances(**previous_edi));
const BoolVector& previous_edi_instances = (*previous_edi)->get_instances();
for(size_t j=0;j<instances_count;j++)
{
Modified: trunk/src/check/race/footprint.h
===================================================================
--- trunk/src/check/race/footprint.h 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/check/race/footprint.h 2008-12-25 15:59:43 UTC (rev 136)
@@ -23,6 +23,9 @@
#include <set>
#include <list>
+// see http://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/shared_ptr.htm
+#include <boost/shared_ptr.hpp>
+
#include "data/msc.h"
@@ -30,8 +33,8 @@
class EventDependentInstances;
typedef std::vector<bool> BoolVector;
-typedef counted_ptr<EventDependentInstances> EDInstancesPtr;
-typedef counted_ptr<Footprint> FootprintPtr;
+typedef boost::shared_ptr<EventDependentInstances> EDInstancesPtr;
+typedef boost::shared_ptr<Footprint> FootprintPtr;
typedef std::list<MscElement*> MscElementPList;
class EDInstancesPtrComparator
Modified: trunk/src/check/race/race_checker.cpp
===================================================================
--- trunk/src/check/race/race_checker.cpp 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/check/race/race_checker.cpp 2008-12-25 15:59:43 UTC (rev 136)
@@ -91,8 +91,8 @@
m_modified_bmscs.push_back(b.get());
for(e=minimal_events.begin();e!=minimal_events.end();e++)
{
- EDInstancesPtr e_instances =
- new EventDependentInstances(*e,m_instance_marker->get_count());
+ EDInstancesPtr e_instances(
+ new EventDependentInstances(*e,m_instance_marker->get_count()));
size_t e_index = m_vis_initiator->get_topology_index(*e);
EventPList::const_iterator f;
for(f=minimal_events.begin();f!=minimal_events.end();f++)
@@ -166,10 +166,10 @@
EventPListPtr events = DFSEventsTraverser::topology_order(b);
for(e=maximal_events.begin();e!=maximal_events.end();e++)
{
- EDInstancesPtr e_instances_greater =
- new EventDependentInstances(*e,m_instance_marker->get_count());
- EDInstancesPtr e_instances_less =
- new EventDependentInstances(*e,m_instance_marker->get_count());
+ EDInstancesPtr e_instances_greater(
+ new EventDependentInstances(*e,m_instance_marker->get_count()));
+ EDInstancesPtr e_instances_less(
+ new EventDependentInstances(*e,m_instance_marker->get_count()));
size_t e_index = m_vis_initiator->get_topology_index(*e);
const BoolVector& e_closure = m_caus_initiator->get_causal_closure(*e);
EventPList::const_iterator f;
@@ -270,7 +270,6 @@
t->begin(),
t->end()
);
- t.release();
m_visual_initiator.initialize(topology);
m_causal_initiator.initialize(topology,m_visual_initiator,mapper);
BMscPtr result;
@@ -405,7 +404,7 @@
m_min = min;
m_max = max;
m_mapper = mapper;
- FootprintPtr initial = new Footprint(hmsc->get_start().get(),instances_count);
+ FootprintPtr initial(new Footprint(hmsc->get_start().get(),instances_count));
todo.insert(initial);
add_white_node_found_listener(this);
}
@@ -443,10 +442,10 @@
void FootprintTraverser::on_white_node_found(ReferenceNode* node)
{
check_race(node->get_bmsc().get());
- FootprintPtr f = new Footprint(
+ FootprintPtr f(new Footprint(
m_footprint,this->get_reached_elements().back(),
m_max->get_events_less(node->get_bmsc().get()),
- m_max->get_events_greater(node->get_bmsc().get()));
+ m_max->get_events_greater(node->get_bmsc().get())));
if(todo.find(f)==todo.end() && done.find(f)==done.end())
{
todo.insert(f);
Modified: trunk/src/data/checker.h
===================================================================
--- trunk/src/data/checker.h 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/data/checker.h 2008-12-25 15:59:43 UTC (rev 136)
@@ -22,18 +22,19 @@
#include <exception>
#include <map>
+#include <boost/shared_ptr.hpp>
+
#include "data/msc.h"
-#include "data/counted_ptr.h"
class ChannelMapper;
class Checker;
class HMscChecker;
class BMscChecker;
-typedef counted_ptr<ChannelMapper> ChannelMapperPtr;
-typedef counted_ptr<Checker> CheckerPtr;
-typedef counted_ptr<HMscChecker> HMscCheckerPtr;
-typedef counted_ptr<BMscChecker> BMscCheckerPtr;
+typedef boost::shared_ptr<ChannelMapper> ChannelMapperPtr;
+typedef boost::shared_ptr<Checker> CheckerPtr;
+typedef boost::shared_ptr<HMscChecker> HMscCheckerPtr;
+typedef boost::shared_ptr<BMscChecker> BMscCheckerPtr;
/**
* Basic abstract class for all checking algorithms.
@@ -181,7 +182,7 @@
/**
* Common instance of GeneralMapper.
*/
- static counted_ptr<GeneralMapper<MessagePart> > m_instance;
+ static boost::shared_ptr<GeneralMapper<MessagePart> > m_instance;
/**
* Holds identificators of channels represented by MessagePart of MscMessage.
@@ -222,11 +223,11 @@
/**
* Returns common instance of ChannelMapper
*/
- static counted_ptr<GeneralMapper<MessagePart> > instance()
+ static boost::shared_ptr<GeneralMapper<MessagePart> > instance()
{
if(m_instance.get()==NULL)
{
- counted_ptr<GeneralMapper<MessagePart> > p(new GeneralMapper<MessagePart>());
+ boost::shared_ptr<GeneralMapper<MessagePart> > p(new GeneralMapper<MessagePart>());
m_instance = p;
}
return m_instance;
@@ -351,11 +352,11 @@
typedef GeneralMapper<SRMessagePart> SRChannelMapper;
typedef GeneralMapper<SRLMessagePart> SRLChannelMapper;
-typedef counted_ptr<SRChannelMapper> SRChannelMapperPtr;
-typedef counted_ptr<SRLChannelMapper> SRLChannelMapperPtr;
+typedef boost::shared_ptr<SRChannelMapper> SRChannelMapperPtr;
+typedef boost::shared_ptr<SRLChannelMapper> SRLChannelMapperPtr;
template <class T>
-counted_ptr<GeneralMapper<T> > GeneralMapper<T>::m_instance;
+boost::shared_ptr<GeneralMapper<T> > GeneralMapper<T>::m_instance;
enum Color
{
Deleted: trunk/src/data/counted_ptr.h
===================================================================
--- trunk/src/data/counted_ptr.h 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/data/counted_ptr.h 2008-12-25 15:59:43 UTC (rev 136)
@@ -1,246 +0,0 @@
-/*
- * counted_ptr - Smart pointer with reference counting
- * 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 Petr Gotthard <pet...@ce...>
- *
- * $Id$
- */
-
-#ifndef COUNTED_PTR_H
-#define COUNTED_PTR_H
-
-#include <stdlib.h>
-#include <stdexcept>
-
-//! Smart pointer with reference counting.
-/*!
- * The smart pointer can be used like a normal pointer. It keeps track of
- * the number of references to the object. When the counter becomes zero,
- * the object is automatically destroyed.
- *
- * For example:
- * \code
- * counted_ptr<int> var1 = new int();
- * *var1 = 0;
- * \endcode
- *
- * \warning Never call delete[] to objects pointed by smart pointers!
- */
-template<class type>
-class counted_ptr
-{
-public:
- counted_ptr()
- {
- m_pointer = NULL;
- // when m_pointer == NULL, m_counter is undefined
- }
-
- //! Copy constructor.
- counted_ptr(const counted_ptr<type>& object)
- {
- m_pointer = object.m_pointer;
- m_counter = object.m_counter;
-
- // increase the number of references
- if (m_pointer != NULL) acquire();
- }
-
- template<class rtype>
- counted_ptr(const counted_ptr<rtype>& object)
- {
- m_pointer = dynamic_cast<type*>(object.m_pointer);
- if (object.m_pointer != NULL && m_pointer == NULL)
- throw std::bad_cast();
-
- m_counter = object.m_counter;
-
- // increase the number of references
- if (m_pointer != NULL) acquire();
- }
-
- template<class rtype>
- counted_ptr(rtype* object)
- {
- m_pointer = dynamic_cast< type* >(object);
- if (object != NULL && m_pointer == NULL)
- throw std::bad_cast();
-
- m_counter = NULL;
-
- // increase the number of references
- if (m_pointer != NULL) acquire();
- }
-
- virtual ~counted_ptr()
- {
- // decrease the number of references
- if (m_pointer != NULL) release();
- }
-
- // Assignment operator.
- counted_ptr<type>& operator=(const counted_ptr<type>& object)
- {
- // check if the pointer is already assigned
- if (m_pointer == object.m_pointer)
- return *this;
-
- // decrease the number of references
- if (m_pointer != NULL) release();
-
- // assignment
- m_pointer = object.m_pointer;
- m_counter = object.m_counter;
-
- // increase number of references
- if (m_pointer != NULL) acquire();
-
- return *this;
- }
-
- template<class rtype>
- counted_ptr<type>& operator=(const counted_ptr<rtype>& object)
- {
- // check if the pointer is already assigned
- if (m_pointer == object.m_pointer)
- return *this;
-
- // decrease the number of references
- if (m_pointer != NULL) release();
-
- // assignment
- m_pointer = dynamic_cast<type*>(object.m_pointer);
- if (object.m_pointer != NULL && m_pointer == NULL)
- throw std::bad_cast();
-
- m_counter = object.m_counter;
-
- // increase number of references
- if (m_pointer != NULL) acquire();
-
- return *this;
- }
-
- template<class rtype>
- counted_ptr<type>& operator=(rtype* object)
- {
- // check if the pointer is already assigned
- if (m_pointer == object)
- return *this;
-
- // decrease the number of references
- if (m_pointer != NULL) release();
-
- // assignment
- m_pointer = dynamic_cast<type*>(object);
- if (object != NULL && m_pointer == NULL)
- throw std::bad_cast();
-
- m_counter = NULL;
-
- // increase number of references
- if (m_pointer != NULL) acquire();
-
- return *this;
- }
-
- type& operator*() const
- {
- return *m_pointer;
- }
-
- type* operator->() const
- {
- return m_pointer;
- }
-
- type* get() const
- {
- return m_pointer;
- }
-
- bool operator!() const
- {
- return !m_pointer;
- }
-
- template<class rtype>
- int operator==(const counted_ptr<rtype>& right) const
- {
- return (m_pointer == right.m_pointer);
- }
-
- int operator==(const void* right) const
- {
- return (m_pointer == right);
- }
-
- template<class rtype>
- int operator!=(const counted_ptr<rtype>& right) const
- {
- return (m_pointer != right.m_pointer);
- }
-
- int operator!=(const void* right) const
- {
- return (m_pointer != right);
- }
-
- size_t acquire()
- {
- if (m_counter == NULL)
- return *(m_counter = new size_t(1));
- else
- // increase the number of references
- return ++(*m_counter);
- }
-
- size_t release()
- {
- size_t count = 0;
- // decrease the number of references
- if (m_counter != NULL)
- count = --(*m_counter);
-
- // if there is no other reference, delete the object
- if (count <= 0)
- {
- delete m_pointer;
- m_pointer = NULL;
-
- if (m_counter != NULL)
- delete m_counter;
- }
-
- return count;
- }
-
- template<class rtype>
- bool operator<(const counted_ptr<rtype>& right) const
- {
- return (m_pointer < right.m_pointer);
- }
-
-private:
- template<class rtype>
- friend class counted_ptr;
-
- //! Pointer to the guarded object.
- type *m_pointer;
- //! Number of references to this object.
- size_t *m_counter;
-};
-
-#endif // COUNTED_PTR_H
-
-// $Id$
Modified: trunk/src/data/dfs_events_traverser.cpp
===================================================================
--- trunk/src/data/dfs_events_traverser.cpp 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/data/dfs_events_traverser.cpp 2008-12-25 15:59:43 UTC (rev 136)
@@ -184,7 +184,7 @@
EventPListPtr DFSEventsTraverser::topology_order(BMscPtr b)
{
- EventPListPtr topology = new EventPList;
+ EventPListPtr topology(new EventPList);
DFSEventsTraverser traverser;
TopologyOrderListener listener(topology.get());
traverser.add_event_finished_listener(&listener);
Modified: trunk/src/data/dfs_events_traverser.h
===================================================================
--- trunk/src/data/dfs_events_traverser.h 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/data/dfs_events_traverser.h 2008-12-25 15:59:43 UTC (rev 136)
@@ -23,7 +23,7 @@
#include "data/checker.h"
typedef std::list<Event*> EventPList;
-typedef counted_ptr<EventPList> EventPListPtr;
+typedef boost::shared_ptr<EventPList> EventPListPtr;
typedef std::list<MscElement*> MscElementPList;
/**
Modified: trunk/src/data/dfs_instance_events_traverser.cpp
===================================================================
--- trunk/src/data/dfs_instance_events_traverser.cpp 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/data/dfs_instance_events_traverser.cpp 2008-12-25 15:59:43 UTC (rev 136)
@@ -69,7 +69,7 @@
EventPListPtr DFSInstanceEventsTraverser::topology_order(Instance* i)
{
- EventPListPtr topology = new EventPList;
+ EventPListPtr topology(new EventPList);
DFSInstanceEventsTraverser traverser;
TopologyOrderListener listener(topology.get());
traverser.add_event_finished_listener(&listener);
Modified: trunk/src/data/dfs_instance_events_traverser.h
===================================================================
--- trunk/src/data/dfs_instance_events_traverser.h 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/data/dfs_instance_events_traverser.h 2008-12-25 15:59:43 UTC (rev 136)
@@ -21,7 +21,7 @@
#include "data/dfs_events_traverser.h"
-typedef counted_ptr<EventPList> EventPListPtr;
+typedef boost::shared_ptr<EventPList> EventPListPtr;
/**
* Processes only Instances' Events during depth first search.
Modified: trunk/src/data/msc.cpp
===================================================================
--- trunk/src/data/msc.cpp 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/data/msc.cpp 2008-12-25 15:59:43 UTC (rev 136)
@@ -175,11 +175,41 @@
return m_send_event->get_instance();
}
+void CompleteMessage::glue_send_event(const EventPtr& send_event)
+{
+ if(send_event.get() != m_send_event)
+ {
+ // unglue, if already glued
+ if(m_send_event != NULL)
+ m_send_event->set_message(NULL);
+
+ if(send_event != NULL)
+ send_event->set_message(this);
+
+ m_send_event = send_event.get();
+ }
+}
+
Instance* CompleteMessage::get_receiver() const
{
return m_receive_event->get_instance();
}
+void CompleteMessage::glue_receive_event(const EventPtr& receive_event)
+{
+ if(receive_event != m_receive_event)
+ {
+ // unglue, if already glued
+ if(m_receive_event != NULL)
+ m_receive_event->set_message(NULL);
+
+ if(receive_event != NULL)
+ receive_event->set_message(this);
+
+ m_receive_event = receive_event.get();
+ }
+}
+
CompleteMessage::CompleteMessage(Event* sender, Event* receiver, MscMessage* original):
MscMessage(original),m_send_event(sender),m_receive_event(receiver)
{
@@ -252,4 +282,9 @@
m_type = original->get_type();
}
+void IncompleteMessage::glue_event(EventPtr& event)
+{
+ event->set_message(this);
+}
+
// $Id$
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2008-12-20 21:09:16 UTC (rev 135)
+++ trunk/src/data/msc.h 2008-12-25 15:59:43 UTC (rev 136)
@@ -26,7 +26,10 @@
#include <typeinfo>
#include <queue>
-#include "data/counted_ptr.h"
+// we use boost::intrusive_ptr as we need to construct the xx_ptr<T> from T*
+// see http://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/smart_ptr.htm
+#include <boost/intrusive_ptr.hpp>
+
#include "data/msc_visual.h"
#include "data/export.h"
@@ -50,59 +53,58 @@
class SuccessorNode;
class PredecessorNode;
-typedef counted_ptr<MscElement> MscElementPtr;
+typedef boost::intrusive_ptr<MscElement> MscElementPtr;
-typedef counted_ptr<Msc> MscPtr;
+typedef boost::intrusive_ptr<Msc> MscPtr;
-typedef counted_ptr<BMsc> BMscPtr;
+typedef boost::intrusive_ptr<BMsc> BMscPtr;
-typedef counted_ptr<HMsc> HMscPtr;
+typedef boost::intrusive_ptr<HMsc> HMscPtr;
-typedef counted_ptr<HMscNode> HMscNodePtr;
+typedef boost::intrusive_ptr<HMscNode> HMscNodePtr;
typedef std::set<HMscNodePtr> HMscNodePtrSet;
-typedef counted_ptr<ReferenceNode> ReferenceNodePtr;
+typedef boost::intrusive_ptr<ReferenceNode> ReferenceNodePtr;
typedef std::list<ReferenceNodePtr> ReferenceNodePtrList;
typedef std::set<InnerNode*> InnerNodePSet;
typedef std::set<ReferenceNode*> ReferenceNodePSet;
typedef std::queue<InnerNode*> InnerNodePQueue;
-typedef counted_ptr<StartNode> StartNodePtr;
+typedef boost::intrusive_ptr<StartNode> StartNodePtr;
-typedef counted_ptr<EndNode> EndNodePtr;
+typedef boost::intrusive_ptr<EndNode> EndNodePtr;
-typedef counted_ptr<Instance> InstancePtr;
+typedef boost::intrusive_ptr<Instance> InstancePtr;
typedef std::list<InstancePtr> InstancePtrList;
-typedef counted_ptr<Event> EventPtr;
+typedef boost::intrusive_ptr<Event> EventPtr;
typedef std::list<EventPtr> EventPtrList;
-typedef counted_ptr<StrictEvent> StrictEventPtr;
+typedef boost::intrusive_ptr<StrictEvent> StrictEventPtr;
typedef std::list<StrictEventPtr> StrictEventPtrList;
-typedef counted_ptr<CoregionEvent> CoregionEventPtr;
+typedef boost::intrusive_ptr<CoregionEvent> CoregionEventPtr;
typedef std::list<CoregionEventPtr> CoregionEventPtrList;
typedef std::set<CoregionEventPtr> CoregionEventPtrSet;
typedef std::set<CoregionEvent*> CoregionEventPSet;
typedef std::list<CoregionEvent*> CoregionEventPList;
typedef std::queue<CoregionEvent*> CoregionEventPQueue;
-typedef counted_ptr<MscMessage> MscMessagePtr;
+typedef boost::intrusive_ptr<MscMessage> MscMessagePtr;
-typedef counted_ptr<EventArea> EventAreaPtr;
+typedef boost::intrusive_ptr<EventArea> EventAreaPtr;
typedef std::list<EventAreaPtr> EventAreaPtrList;
-typedef counted_ptr<StrictOrderArea> StrictOrderAreaPtr;
+typedef boost::intrusive_ptr<StrictOrderArea> StrictOrderAreaPtr;
-typedef counted_ptr<CoregionArea> CoregionAreaPtr;
+typedef boost::intrusive_ptr<CoregionArea> CoregionAreaPtr;
typedef void* AttributeP;
typedef std::map<std::string,AttributeP> AttributePMap;
typedef std::set<HMscNodePtr> HMscNodePtrSet;
-
/**
* \brief Common basic abstract class for all elements of MSC
*/
@@ -129,6 +131,7 @@
MscElement(bool marked=false)
{
m_marked = marked;
+ m_counter = 0;
}
public:
@@ -264,8 +267,31 @@
{
}
+
+private:
+ //! Number of references to this object.
+ 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(MscElement *ptr);
+ friend void intrusive_ptr_release(MscElement *ptr);
};
+inline void intrusive_ptr_add_ref(MscElement *ptr)
+{
+ if(ptr != NULL)
+ ++ptr->m_counter;
+}
+
+inline void intrusive_ptr_release(MscElement *ptr)
+{
+ if(ptr != NULL)
+ {
+ if(--ptr->m_counter <= 0)
+ delete ptr;
+ }
+}
+
template <class T>
class /*SCMSC_EXPORT*/ MscElementTmpl : public MscElement
{
@@ -506,7 +532,7 @@
};
-typedef counted_ptr<NodeRelation> NodeRelationPtr;
+typedef boost::intrusive_ptr<NodeRelation> NodeRelationPtr;
typedef std::set<NodeRelationPtr> NodeRelationPtrSet;
class SCMSC_EXPORT SuccessorNode
@@ -765,14 +791,7 @@
*/
HMscPtr get_hmsc()
{
- HMscPtr p;
- try
- {
- p = m_msc;
- return p;
- }
- catch(std::bad_cast){}
- return p;
+ return boost::dynamic_pointer_cast<HMsc>(m_msc);
}
/**
@@ -782,14 +801,7 @@
*/
BMscPtr get_bmsc()
{
- BMscPtr p;
- try
- {
- p = m_msc;
- return p;
- }
- catch(std::bad_cast){}
- return p;
+ return boost::dynamic_pointer_cast<BMsc>(m_msc);
}
};
@@ -858,7 +870,7 @@
/**
* BMsc whic this instance belongs to
*
- * @warning counted_ptr mustn't be used because of possible cyclic dependency
+ * @warning boost::intrusive_ptr mustn't be used because of possible cyclic dependency
*/
BMsc* m_bmsc;
@@ -985,26 +997,24 @@
/**
* Sender of message.
*
- * @warning counted_ptr mustn't be used because of possible cyclic dependency
+ * @warning boost::intrusive_ptr mustn't be used because of possible cyclic dependency
*/
Event* m_send_event;
/**
* Receiver of message.
*
- * @warning counted_ptr mustn't be used because of possible cyclic dependency
+ * @warning boost::intrusive_ptr mustn't be used because of possible cyclic dependency
*/
Event* m_receive_event;
public:
/**
- * @param sender - sending event
- * @param receiver - receiving event
* @param label - label of message
*/
- CompleteMessage(Event* sender, Event* receiver, const std::string& label=""):
- MscMessage(label),m_send_event(sender),m_receive_event(receiver)
+ CompleteMessage(const std::string& label=""):
+ MscMessage(label),m_send_event(NULL),m_receive_event(NULL)
{
}
@@ -1016,7 +1026,7 @@
Instance* get_sender() const;
/**
- * Getter for m_sender.
+ * Getter for m_send_event.
*/
Event* get_send_event() const
{
@@ -1024,12 +1034,10 @@
}
/**
- * Setter for m_sender
+ * Connects to a given send event and re-configures its back-pointers.
+ * To un-glue, use NULL as the parameter.
*/
- void set_send_event(Event* sender)
- {
- m_send_event = sender;
- }
+ void glue_send_event(const EventPtr& send_event);
/**
* Retrieves instance of m_receive_event
@@ -1037,7 +1045,7 @@
Instance* get_receiver() const;
/**
- * Getter for m_receiver.
+ * Getter for m_receive_event.
*/
Event* get_receive_event() const
{
@@ -1045,15 +1053,24 @@
}
/**
- * Getter for m_receiver.
+ * Connects to a given receive event and re-configures its back-pointers.
+ * To un-glue, use NULL as the parameter.
*/
- void set_receive_event(Event* receiver)
+ void glue_receive_event(const EventPtr& receive_event);
+
+ /**
+ * Connects to given send and receive events.
+ * Does a sequential execution of glue_send_event() and glue_receive_event().
+ */
+ void glue_events(const EventPtr& send_event, const EventPtr& receive_event)
{
- m_receive_event = receiver;
+ glue_send_event(send_event);
+ glue_receive_event(receive_event);
}
+
};
-typedef counted_ptr<CompleteMessage> CompleteMessagePtr;
+typedef boost::intrusive_ptr<CompleteMessage> CompleteMessagePtr;
typedef enum
{
@@ -1107,9 +1124,11 @@
{
return m_type==FOUND;
}
+
+ void glue_event(EventPtr& event);
};
-typedef counted_ptr<IncompleteMessage> IncompleteMessagePtr;
+typedef boost::intrusive_ptr<IncompleteMessage> IncompleteMessagePtr;
/**
* \brief Event which occurs in EventArea.
@@ -1148,21 +1167,9 @@
virtual ~Event()
{
- if(is_matched())
- {
- ...
[truncated message content] |
|
From: <got...@us...> - 2008-12-25 16:50:56
|
Revision: 137
http://scstudio.svn.sourceforge.net/scstudio/?rev=137&view=rev
Author: gotthardp
Date: 2008-12-25 16:50:53 +0000 (Thu, 25 Dec 2008)
Log Message:
-----------
Tiny little bug fix for the previous commit.
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/src/data/CMakeLists.txt
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2008-12-25 15:59:43 UTC (rev 136)
+++ trunk/CMakeLists.txt 2008-12-25 16:50:53 UTC (rev 137)
@@ -8,8 +8,7 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
INCLUDE(${CMAKE_ROOT}/Modules/Dart.cmake)
-FIND_PACKAGE(Boost 1.31
- COMPONENTS shared_ptr intrusive_ptr)
+FIND_PACKAGE(Boost REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
INCLUDE_DIRECTORIES(src)
Modified: trunk/src/data/CMakeLists.txt
===================================================================
--- trunk/src/data/CMakeLists.txt 2008-12-25 15:59:43 UTC (rev 136)
+++ trunk/src/data/CMakeLists.txt 2008-12-25 16:50:53 UTC (rev 137)
@@ -1,5 +1,4 @@
ADD_LIBRARY(scmsc SHARED
- counted_ptr.h
msc.cpp
msc.h
msc_visual.h
@@ -18,7 +17,6 @@
)
INSTALL(FILES
- counted_ptr.h
msc.h
msc_visual.h
export.h
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2008-12-28 12:53:52
|
Revision: 140
http://scstudio.svn.sourceforge.net/scstudio/?rev=140&view=rev
Author: gotthardp
Date: 2008-12-28 12:53:47 +0000 (Sun, 28 Dec 2008)
Log Message:
-----------
Polishing hmsc.h: StartNode is no longer automatically created in HMsc() constructors. Must be created explicitly and assigned to HMsc using set_start().
After this change it shall be possible to create HMsc() without a start node. It's syntactically wrong, but still can be represented by msc.h structures.
Modified Paths:
--------------
trunk/src/check/liveness/deadlock_checker.cpp
trunk/src/check/pseudocode/msc_duplicators.cpp
trunk/src/data/msc.h
trunk/src/view/visio/scstudio.nsi
trunk/tests/deadlock_checker_test.cpp
trunk/tests/livelock_checker_test.cpp
trunk/tests/race_checker_test.cpp
Modified: trunk/src/check/liveness/deadlock_checker.cpp
===================================================================
--- trunk/src/check/liveness/deadlock_checker.cpp 2008-12-27 17:25:52 UTC (rev 139)
+++ trunk/src/check/liveness/deadlock_checker.cpp 2008-12-28 12:53:47 UTC (rev 140)
@@ -140,6 +140,7 @@
// else
// last_node = new ConnectionNode((ConnectionNode*) * nodes_it);
// current_hmsc = new HMsc((*nodes_it)->get_owner());
+// current_hmsc = set_start(new StartNode((*nodes_it)->get_owner()->get_start().get()));
// current_hmsc->get_start()->add_successor(last_node);
// if (!result.get())
// result = current_hmsc;
Modified: trunk/src/check/pseudocode/msc_duplicators.cpp
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.cpp 2008-12-27 17:25:52 UTC (rev 139)
+++ trunk/src/check/pseudocode/msc_duplicators.cpp 2008-12-28 12:53:47 UTC (rev 140)
@@ -249,9 +249,10 @@
{
if(is_root_element(n))
{
- //in this case duplicated Startnode was already created
- m_new_nodes.push_back(m_hmsc->get_start().get());
- set_copy(n,m_hmsc->get_start().get());
+ StartNode *new_node = new StartNode(n);
+ m_hmsc->set_start(new_node);
+ m_new_nodes.push_back(new_node);
+ set_copy(n,new_node);
}
}
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2008-12-27 17:25:52 UTC (rev 139)
+++ trunk/src/data/msc.h 2008-12-28 12:53:47 UTC (rev 140)
@@ -679,7 +679,7 @@
/**
* \brief Start node of HMsc.
*
- * Mandatory element in HMsc, should be initialized in constructor.
+ * Mandatory element in HMsc, not included in m_nodes.
*/
StartNodePtr m_start;
@@ -692,16 +692,10 @@
HMsc(const std::string& label=""):Msc(label)
{
- // Creating start for new HMsc, setting its original and owner
- m_start = new StartNode();
- m_start->set_owner(this);
}
HMsc(HMsc* original):Msc(original)
{
- // Creating start for new HMsc, setting its original and owner
- m_start = new StartNode(original->get_start().get());
- m_start->set_owner(this);
}
virtual ~HMsc()
@@ -715,7 +709,13 @@
{
return m_start;
}
-
+
+ void set_start(const StartNodePtr& start)
+ {
+ m_start = start;
+ m_start->set_owner(this);
+ }
+
const HMscNodePtrSet& get_nodes()
{
return m_nodes;
Modified: trunk/src/view/visio/scstudio.nsi
===================================================================
--- trunk/src/view/visio/scstudio.nsi 2008-12-27 17:25:52 UTC (rev 139)
+++ trunk/src/view/visio/scstudio.nsi 2008-12-28 12:53:47 UTC (rev 140)
@@ -80,8 +80,8 @@
!define VisioRegPath "Software\Microsoft\Office\11.0\Visio\Application"
SetOutPath $INSTDIR\bin
- File "addon\Debug\scstudio.vsl"
- File "..\..\..\Debug\*.dll"
+ File "addon\Release\scstudio.vsl"
+ File "..\..\..\Release\*.dll"
${AppendRegStr} ${VisioRegPath} "AddonsPath" "$INSTDIR\bin"
Modified: trunk/tests/deadlock_checker_test.cpp
===================================================================
--- trunk/tests/deadlock_checker_test.cpp 2008-12-27 17:25:52 UTC (rev 139)
+++ trunk/tests/deadlock_checker_test.cpp 2008-12-28 12:53:47 UTC (rev 140)
@@ -19,16 +19,18 @@
HMscPtr h1(new HMsc("h1"));
HMscPtr h2(new HMsc("h2"));
+ 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);
ReferenceNodePtr p3(new ReferenceNode());h1->add_node(p3);
ReferenceNodePtr p4(new ReferenceNode());h1->add_node(p4);
- ReferenceNodePtr n1(new ReferenceNode());h1->add_node(n1);
- ReferenceNodePtr n2(new ReferenceNode());h1->add_node(n2);
+ StartNodePtr start2 = new StartNode(); h2->set_start(start2);
+ ReferenceNodePtr n1(new ReferenceNode());h2->add_node(n1);
+ ReferenceNodePtr n2(new ReferenceNode());h2->add_node(n2);
- h1->get_start()->add_successor(p1.get());
+ start1->add_successor(p1.get());
p1->add_successor(p2.get());
p1->add_successor(p3.get());
p3->add_successor(p4.get());
@@ -36,7 +38,7 @@
p4->add_successor(end1.get());
p3->set_msc(h2);
- h2->get_start()->add_successor(n1.get());
+ start2->add_successor(n1.get());
n1->add_successor(n2.get());
ChannelMapperPtr chm;
Modified: trunk/tests/livelock_checker_test.cpp
===================================================================
--- trunk/tests/livelock_checker_test.cpp 2008-12-27 17:25:52 UTC (rev 139)
+++ trunk/tests/livelock_checker_test.cpp 2008-12-28 12:53:47 UTC (rev 140)
@@ -18,18 +18,20 @@
HMscPtr h1(new HMsc("h1"));
HMscPtr h2(new HMsc("h2"));
-
+
+ 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);
ReferenceNodePtr p3(new ReferenceNode());h1->add_node(p3);
ReferenceNodePtr p4(new ReferenceNode());h1->add_node(p4);
+
+ StartNodePtr start2 = new StartNode(); h2->set_start(start2);
+ ReferenceNodePtr n1(new ReferenceNode());h2->add_node(n1);
+ ReferenceNodePtr n2(new ReferenceNode());h2->add_node(n2);
+ ReferenceNodePtr n3(new ReferenceNode());h2->add_node(n3);
- ReferenceNodePtr n1(new ReferenceNode());h1->add_node(n1);
- ReferenceNodePtr n2(new ReferenceNode());h1->add_node(n2);
- ReferenceNodePtr n3(new ReferenceNode());h1->add_node(n3);
-
- h1->get_start()->add_successor(p1.get());
+ start1->add_successor(p1.get());
p1->add_successor(p2.get());
p1->add_successor(p3.get());
p3->add_successor(p4.get());
@@ -37,7 +39,7 @@
p4->add_successor(end1.get());
p3->set_msc(h2);
- h2->get_start()->add_successor(n1.get());
+ start2->add_successor(n1.get());
n1->add_successor(n2.get());
n2->add_successor(n3.get());
n3->add_successor(n1.get());
Modified: trunk/tests/race_checker_test.cpp
===================================================================
--- trunk/tests/race_checker_test.cpp 2008-12-27 17:25:52 UTC (rev 139)
+++ trunk/tests/race_checker_test.cpp 2008-12-28 12:53:47 UTC (rev 140)
@@ -84,28 +84,32 @@
m1->glue_events(e1, e2);
HMscPtr hmsc1(new HMsc("HMsc1"));
+ StartNodePtr start1 = new StartNode();
+ hmsc1->set_start(start1);
ReferenceNodePtr r1_1(new ReferenceNode());
ReferenceNodePtr r1_2(new ReferenceNode());
EndNodePtr end1(new EndNode());
hmsc1->add_node(r1_1);
hmsc1->add_node(r1_2);
hmsc1->add_node(end1);
- hmsc1->get_start()->add_successor(r1_1.get());
- hmsc1->get_start()->add_successor(r1_2.get());
+ start1->add_successor(r1_1.get());
+ start1->add_successor(r1_2.get());
r1_1->add_successor(end1.get());
r1_2->add_successor(end1.get());
r1_1->set_msc(bmsc);
HMscPtr hmsc2(new HMsc("HMsc2"));
+ StartNodePtr start2 = new StartNode();
+ hmsc2->set_start(start2);
ReferenceNodePtr r2_1(new ReferenceNode());
ReferenceNodePtr r2_2(new ReferenceNode());
EndNodePtr end2(new EndNode());
hmsc2->add_node(r2_1);
hmsc2->add_node(r2_2);
hmsc2->add_node(end2);
- hmsc2->get_start()->add_successor(r2_1.get());
- hmsc2->get_start()->add_successor(r2_2.get());
+ start2->add_successor(r2_1.get());
+ start2->add_successor(r2_2.get());
r2_1->add_successor(end2.get());
r2_2->add_successor(end2.get());
@@ -113,9 +117,11 @@
r2_1->set_msc(bmsc);
HMscPtr hmsc3(new HMsc("HMsc3"));
+ StartNodePtr start3 = new StartNode();
+ hmsc3->set_start(start3);
ReferenceNodePtr r3_1(new ReferenceNode());
hmsc3->add_node(r2_1);
- hmsc3->get_start()->add_successor(r3_1.get());
+ start3->add_successor(r3_1.get());
r2_2->set_msc(hmsc3);
r3_1->set_msc(bmsc);
@@ -150,11 +156,13 @@
m2->glue_events(e3, e2_2);
HMscPtr hmsc1(new HMsc("HMsc"));
+ StartNodePtr start1 = new StartNode();
+ hmsc1->set_start(start1);
ReferenceNodePtr r1(new ReferenceNode());
EndNodePtr end1(new EndNode());
hmsc1->add_node(r1);
hmsc1->add_node(end1);
- hmsc1->get_start()->add_successor(r1.get());
+ start1->add_successor(r1.get());
r1->add_successor(end1.get());
r1->set_msc(bmsc);
@@ -184,11 +192,13 @@
m2->glue_events(e1_2, e2_2);
HMscPtr hmsc1(new HMsc("HMsc"));
+ StartNodePtr start1 = new StartNode();
+ hmsc1->set_start(start1);
ReferenceNodePtr r1(new ReferenceNode());
EndNodePtr end1(new EndNode());
hmsc1->add_node(r1);
hmsc1->add_node(end1);
- hmsc1->get_start()->add_successor(r1.get());
+ start1->add_successor(r1.get());
r1->add_successor(end1.get());
r1->set_msc(bmsc);
@@ -228,13 +238,15 @@
m2->glue_events(e3, e4);
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);
- hmsc1->get_start()->add_successor(r1.get());
+ start1->add_successor(r1.get());
r1->add_successor(r2.get());
r2->add_successor(end1.get());
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
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.
|
|
From: <ba...@us...> - 2009-01-04 16:16:46
|
Revision: 150
http://scstudio.svn.sourceforge.net/scstudio/?rev=150&view=rev
Author: babicaj
Date: 2009-01-04 16:16:42 +0000 (Sun, 04 Jan 2009)
Log Message:
-----------
Bug in msc.h, this caused wrong test results, fifo_checker_test fixed
Modified Paths:
--------------
trunk/src/data/msc.h
trunk/tests/fifo_checker_test.cpp
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2009-01-04 12:42:09 UTC (rev 149)
+++ trunk/src/data/msc.h 2009-01-04 16:16:42 UTC (rev 150)
@@ -1883,8 +1883,6 @@
void add_minimal_event(CoregionEvent* e)
{
m_minimal_events.insert(e);
- if(e->get_successors().size()==0)
- m_maximal_events.insert(e);
}
/**
@@ -1893,8 +1891,6 @@
void remove_minimal_event(CoregionEvent* e)
{
m_minimal_events.erase(e);
- if(e->get_successors().size()==0)
- m_maximal_events.erase(e);
}
/**
@@ -1905,8 +1901,6 @@
void add_maximal_event(CoregionEvent* e)
{
m_maximal_events.insert(e);
- if(e->get_predecessors().size()==0)
- m_minimal_events.insert(e);
}
/**
@@ -1915,8 +1909,6 @@
void remove_maximal_event(CoregionEvent* e)
{
m_maximal_events.erase(e);
- if(e->get_predecessors().size()==0)
- m_minimal_events.erase(e);
}
bool is_empty()
Modified: trunk/tests/fifo_checker_test.cpp
===================================================================
--- trunk/tests/fifo_checker_test.cpp 2009-01-04 12:42:09 UTC (rev 149)
+++ trunk/tests/fifo_checker_test.cpp 2009-01-04 16:16:42 UTC (rev 150)
@@ -244,7 +244,7 @@
CompleteMessagePtr m2 = new CompleteMessage("a");
m2->glue_events(e2, e4);
- return check(myBmsc,false,false);
+ return check(myBmsc,true,true);
}
bool BMscE() {
@@ -465,10 +465,10 @@
std::cout << " | | " << std::endl;
std::cout << "<coregion> <coregion> " << std::endl;
std::cout << "| | | | " << std::endl;
- std::cout << "| e1 ----a---> e3 | " << std::endl;
+ std::cout << "| e1 ----a---> e3<- | " << std::endl;
+ std::cout << "| | | | | " << std::endl;
+ std::cout << "| e2 ----b---> e4-- | " << std::endl;
std::cout << "| | | | " << std::endl;
- std::cout << "| e2 ----b---> e4 | " << std::endl;
- std::cout << "| | | | " << std::endl;
std::cout << "<coregion> <coregion> " << std::endl;
std::cout << " | | " << std::endl;
@@ -488,13 +488,15 @@
EventPtr e2 = a1->add_event();
EventPtr e3 = a2->add_event();
EventPtr e4 = a2->add_event();
+
+ ((CoregionEvent*)e4.get())->add_successor((CoregionEvent*)e3.get());
CompleteMessagePtr m1 = new CompleteMessage("a");
m1->glue_events(e1, e3);
CompleteMessagePtr m2 = new CompleteMessage("b");
m2->glue_events(e2, e4);
- return check(myBmsc,false,true);
+ return check(myBmsc,true,true);
}
bool BMscL() {
@@ -649,7 +651,7 @@
CompleteMessagePtr m3 = new CompleteMessage("a");
m3->glue_events(e5, e6);
- return check(myBmsc,false,false);
+ return check(myBmsc,true,true);
}
bool BMscP() {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ba...@us...> - 2009-01-06 19:49:04
|
Revision: 153
http://scstudio.svn.sourceforge.net/scstudio/?rev=153&view=rev
Author: babicaj
Date: 2009-01-06 19:49:01 +0000 (Tue, 06 Jan 2009)
Log Message:
-----------
fifo_checker and it test fixed
Modified Paths:
--------------
trunk/src/check/order/fifo_checker.cpp
trunk/tests/fifo_checker_test.cpp
Modified: trunk/src/check/order/fifo_checker.cpp
===================================================================
--- trunk/src/check/order/fifo_checker.cpp 2009-01-06 08:56:06 UTC (rev 152)
+++ trunk/src/check/order/fifo_checker.cpp 2009-01-06 19:49:01 UTC (rev 153)
@@ -62,44 +62,24 @@
topology_listener.get_topology().end()
);
closure_initiator.initialize(topology);
- //counts number of different channels
+ BMscPtr result;
for(size_t e=0; e<topology.size(); e++)
{
- Event* event = topology[e];
- if(should_be_checked(event))
+ BoolVector& closure_e = closure_initiator.get_visual_closure(topology[e]);
+ for(size_t f=0; f<topology.size(); f++)
{
- set_channel_id(event,chm->channel(event));
- m_modified_events.push(event);
- }
- }
- std::vector<EventPList> channels(chm->get_channel_count());
- //check order only of events of same channel
- for(size_t e=0; e<topology.size(); e++)
- if(should_be_checked(topology[e]))
- channels[get_channel_id(topology[e])].push_back(topology[e]);
- BMscPtr result;
- size_t i = 0;
- while(i < channels.size() && !result.get())
- {
- EventPList& channel = channels[i];
- EventPList::const_iterator e = channel.begin();
- while(e!=channel.end() && !result.get())
- {
- EventPList::const_iterator f = e;
- f++;
- while(f!=channel.end() && !result.get())
+ if(topology[e]->is_send() && topology[f]->is_send() &&
+ topology[e]->is_matched() && topology[f]->is_matched() &&
+ mapper->same_channel(topology[e],topology[f]) && closure_e[f] &&
+ !closure_initiator.get_visual_closure(topology[e]->get_matching_event())[
+ closure_initiator.get_topology_index(topology[f]->get_matching_event())])
{
- if(!consistent_order(closure_initiator,*e,*f) ||
- !consistent_order(closure_initiator,(*e)->get_matching_event(),
- (*f)->get_matching_event()))
- result = create_counter_example(*e,*f);
- f++;
+ result = create_counter_example(topology[e],topology[f]);
+ cleanup_attributes();
+ return result;
}
- e++;
}
- i++;
}
- closure_initiator.cleanup_attributes();
cleanup_attributes();
return result;
}
Modified: trunk/tests/fifo_checker_test.cpp
===================================================================
--- trunk/tests/fifo_checker_test.cpp 2009-01-06 08:56:06 UTC (rev 152)
+++ trunk/tests/fifo_checker_test.cpp 2009-01-06 19:49:01 UTC (rev 153)
@@ -232,7 +232,7 @@
EventAreaPtr ca1(new CoregionArea());
i1->add_area(ca1);
EventAreaPtr ca2(new CoregionArea());
- i1->add_area(ca2);
+ i2->add_area(ca2);
EventPtr e1 = ca1->add_event();
EventPtr e2 = ca1->add_event();
@@ -281,7 +281,7 @@
CompleteMessagePtr m2 = new CompleteMessage("a");
m2->glue_events(e2, e4);
- return check(myBmsc,false,false);
+ return check(myBmsc,true,true);
}
bool BMscF() {
@@ -533,7 +533,7 @@
CompleteMessagePtr m2 = new CompleteMessage("b");
m2->glue_events(e2, e4);
- return check(myBmsc,false,true);
+ return check(myBmsc,true,true);
}
@@ -694,7 +694,7 @@
CompleteMessagePtr m3 = new CompleteMessage("a");
m3->glue_events(e5, e6);
- return check(myBmsc,false,false);
+ return check(myBmsc,true,true);
}
bool BMscR() {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ba...@us...> - 2009-01-08 17:02:50
|
Revision: 156
http://scstudio.svn.sourceforge.net/scstudio/?rev=156&view=rev
Author: babicaj
Date: 2009-01-08 17:02:30 +0000 (Thu, 08 Jan 2009)
Log Message:
-----------
msc duplicator bug removed -- race checker is now working with correct data
Modified Paths:
--------------
trunk/src/check/pseudocode/msc_duplicators.cpp
trunk/tests/race_checker_test.cpp
Modified: trunk/src/check/pseudocode/msc_duplicators.cpp
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.cpp 2009-01-06 21:28:18 UTC (rev 155)
+++ trunk/src/check/pseudocode/msc_duplicators.cpp 2009-01-08 17:02:30 UTC (rev 156)
@@ -129,7 +129,11 @@
//in this case currently traversed event isn't alone in elements
MscElementPList::const_iterator i = elements.end();
i--; i--;
- return dynamic_cast<CoregionEvent*>(*i);
+ if(dynamic_cast<CoregionEventRelation*>(*i))
+ {
+ i--;
+ return dynamic_cast<CoregionEvent*>(*i);
+ }
}
return NULL;
}
@@ -146,13 +150,14 @@
void EventsCreatorListener::create_successor(Event* e)
{
- CoregionEvent* coreg_new_event = dynamic_cast<CoregionEvent*>(e);
- if(coreg_new_event)
+ CoregionEvent* coreg_new = dynamic_cast<CoregionEvent*>(m_duplicator->get_copy(e));
+ if(coreg_new)
{
CoregionEvent* preceding = get_preceding_event();
if(preceding)
{
- preceding->add_successor(coreg_new_event);
+ CoregionEvent* preceding_new = dynamic_cast<CoregionEvent*>(m_duplicator->get_copy(preceding));
+ preceding_new->add_successor(coreg_new);
}
}
}
Modified: trunk/tests/race_checker_test.cpp
===================================================================
--- trunk/tests/race_checker_test.cpp 2009-01-06 21:28:18 UTC (rev 155)
+++ trunk/tests/race_checker_test.cpp 2009-01-08 17:02:30 UTC (rev 156)
@@ -256,11 +256,58 @@
return check(hmsc1,true,false);
}
+bool HMscE()
+{
+ std::cout << "HMscE:" << std::endl;
+
+ BMscPtr bmsc1(new BMsc("BMsc"));
+ InstancePtr instance1(new Instance("1"));
+ InstancePtr instance2(new Instance("2"));
+ bmsc1->add_instance(instance1);
+ bmsc1->add_instance(instance2);
+ StrictOrderAreaPtr strict(new StrictOrderArea());
+ CoregionAreaPtr coregion(new CoregionArea());
+
+ instance1->add_area(coregion);
+ instance2->add_area(strict);
+
+
+
+ EventPtr e1 = strict->add_event();
+ EventPtr e2 = strict->add_event();
+
+ CoregionEventPtr e3(new CoregionEvent());
+ CoregionEventPtr e4(new CoregionEvent());
+ coregion->add_event(e3);
+ coregion->add_event(e4);
+ e3->add_successor(e4.get());
+
+ CompleteMessagePtr m1 = new CompleteMessage("b1");
+ m1->glue_events(e1, e3);
+ CompleteMessagePtr m2 = new CompleteMessage("d1");
+ m2->glue_events(e4, e2);
+
+ HMscPtr hmsc1(new HMsc("HMsc"));
+ StartNodePtr start1 = new StartNode();
+ hmsc1->set_start(start1);
+ ReferenceNodePtr r1(new ReferenceNode());
+ EndNodePtr end1(new EndNode());
+ hmsc1->add_node(r1);
+ hmsc1->add_node(end1);
+ start1->add_successor(r1.get());
+ r1->add_successor(end1.get());
+
+ r1->set_msc(bmsc1);
+
+ return check(hmsc1,true,true);
+}
+
int main(int argc, char** argv) {
RETURN_IF_FAILED(HMscA());
RETURN_IF_FAILED(HMscB());
RETURN_IF_FAILED(HMscC());
RETURN_IF_FAILED(HMscD());
+ RETURN_IF_FAILED(HMscE());
return 0;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2009-01-09 15:26:02
|
Revision: 158
http://scstudio.svn.sourceforge.net/scstudio/?rev=158&view=rev
Author: gotthardp
Date: 2009-01-09 15:25:56 +0000 (Fri, 09 Jan 2009)
Log Message:
-----------
Enhanced ANTLR configuration.
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/src/data/CMakeLists.txt
trunk/src/data/Z120/CMakeLists.txt
trunk/src/data/Z120/main.cpp
Added Paths:
-----------
trunk/FindANTLR.cmake
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2009-01-08 23:16:19 UTC (rev 157)
+++ trunk/CMakeLists.txt 2009-01-09 15:25:56 UTC (rev 158)
@@ -8,10 +8,14 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
INCLUDE(${CMAKE_ROOT}/Modules/Dart.cmake)
+SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_INSTALL_PREFIX}/share/scripts)
+SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR})
+
FIND_PACKAGE(Boost REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
INCLUDE_DIRECTORIES(src)
+INCLUDE_DIRECTORIES(${CMAKE_INSTALL_PREFIX}/include)
IF (WIN32)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
Added: trunk/FindANTLR.cmake
===================================================================
--- trunk/FindANTLR.cmake (rev 0)
+++ trunk/FindANTLR.cmake 2009-01-09 15:25:56 UTC (rev 158)
@@ -0,0 +1,16 @@
+FIND_LIBRARY(ANTLR_LIBRARY
+ NAMES antlr3c
+ DOC "The ANTLR Library")
+
+FIND_PATH(ANTLR_INCLUDE_DIR
+ NAMES antlr3.h
+ DOC "The ANTLR Include Files")
+
+IF (ANTLR_LIBRARY AND ANTLR_INCLUDE_DIR)
+ SET(ANTLR_FOUND TRUE)
+ELSE (ANTLR_LIBRARY AND ANTLR_INCLUDE_DIR)
+ SET(ANTLR_FOUND FALSE)
+ IF (ANTLR_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "ANTLR not found! Please install and re-run.")
+ ENDIF (ANTLR_FIND_REQUIRED)
+ENDIF (ANTLR_LIBRARY AND ANTLR_INCLUDE_DIR)
Property changes on: trunk/FindANTLR.cmake
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/data/CMakeLists.txt
===================================================================
--- trunk/src/data/CMakeLists.txt 2009-01-08 23:16:19 UTC (rev 157)
+++ trunk/src/data/CMakeLists.txt 2009-01-09 15:25:56 UTC (rev 158)
@@ -1,5 +1,3 @@
-ADD_SUBDIRECTORY(Z120)
-
ADD_LIBRARY(scmsc SHARED
export.h
msc.cpp
@@ -25,6 +23,8 @@
dfs_bmsc_graph_traverser.h
)
+ADD_SUBDIRECTORY(Z120)
+
INSTALL(FILES
msc.h
msc_visual.h
Modified: trunk/src/data/Z120/CMakeLists.txt
===================================================================
--- trunk/src/data/Z120/CMakeLists.txt 2009-01-08 23:16:19 UTC (rev 157)
+++ trunk/src/data/Z120/CMakeLists.txt 2009-01-09 15:25:56 UTC (rev 158)
@@ -1,3 +1,6 @@
+#FIND_PACKAGE(ANTLR REQUIRED)
+#INCLUDE_DIRECTORIES(${ANTLR_INCLUDE_DIR})
+
ADD_LIBRARY(scZ120 SHARED
export.h
module.cpp
@@ -18,7 +21,7 @@
TARGET_LINK_LIBRARIES(scZ120
scmsc
-# antlr3c
+# ${ANTLR_LIBRARY}
)
INSTALL(TARGETS scZ120
Modified: trunk/src/data/Z120/main.cpp
===================================================================
--- trunk/src/data/Z120/main.cpp 2009-01-08 23:16:19 UTC (rev 157)
+++ trunk/src/data/Z120/main.cpp 2009-01-09 15:25:56 UTC (rev 158)
@@ -1,5 +1,5 @@
#include <string>
-#include "Z120.h"
+#include "z120.h"
int main(int argc, char *argv[])
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2009-01-11 17:58:03
|
Revision: 164
http://scstudio.svn.sourceforge.net/scstudio/?rev=164&view=rev
Author: gotthardp
Date: 2009-01-11 17:57:54 +0000 (Sun, 11 Jan 2009)
Log Message:
-----------
Implemened import for 'Engmann Sequence Charts'. This import module calculates own layout information. Next step: visualization of simplest bMSC in Visio.
Modified Paths:
--------------
trunk/src/data/CMakeLists.txt
trunk/src/data/msc.cpp
trunk/src/data/msc.h
trunk/tests/CMakeLists.txt
Added Paths:
-----------
trunk/src/data/engmann/
trunk/src/data/engmann/CMakeLists.txt
trunk/src/data/engmann/engmann.cpp
trunk/src/data/engmann/engmann.h
trunk/src/data/engmann/export.h
trunk/src/data/engmann/module.cpp
trunk/tests/engmann_test.cpp
trunk/tests/engmann_test01.cfi
Modified: trunk/src/data/CMakeLists.txt
===================================================================
--- trunk/src/data/CMakeLists.txt 2009-01-11 15:30:16 UTC (rev 163)
+++ trunk/src/data/CMakeLists.txt 2009-01-11 17:57:54 UTC (rev 164)
@@ -24,6 +24,7 @@
)
# build import-export formatters
+ADD_SUBDIRECTORY(engmann)
ADD_SUBDIRECTORY(Z120)
INSTALL(FILES
Added: trunk/src/data/engmann/CMakeLists.txt
===================================================================
--- trunk/src/data/engmann/CMakeLists.txt (rev 0)
+++ trunk/src/data/engmann/CMakeLists.txt 2009-01-11 17:57:54 UTC (rev 164)
@@ -0,0 +1,15 @@
+ADD_LIBRARY(scengmann SHARED
+ export.h
+ module.cpp
+ engmann.h
+ engmann.cpp
+)
+
+TARGET_LINK_LIBRARIES(scengmann
+ scmsc
+)
+
+INSTALL(TARGETS scengmann
+ RUNTIME DESTINATION bin
+ LIBRARY DESTINATION lib
+ ARCHIVE DESTINATION lib)
Property changes on: trunk/src/data/engmann/CMakeLists.txt
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/src/data/engmann/engmann.cpp
===================================================================
--- trunk/src/data/engmann/engmann.cpp (rev 0)
+++ trunk/src/data/engmann/engmann.cpp 2009-01-11 17:57:54 UTC (rev 164)
@@ -0,0 +1,216 @@
+/*
+ * 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) 2009 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#include <string>
+#include <iostream>
+
+#include "data/engmann/engmann.h"
+#include "data/msc.h"
+
+struct TToken
+{
+ enum TType
+ {
+ T_WORD,
+ T_COLON,
+ T_EOF
+ }
+ type;
+
+ std::string text;
+
+ TToken(TType t)
+ : type(t) { }
+ TToken(TType t, const std::string& s)
+ : type(t), text(s) { }
+};
+
+static void skip_whitespace(std::istream& stream)
+{
+ while(stream.good())
+ {
+ int ch = stream.get();
+ if(!isspace(ch) || ch == '\n')
+ {
+ stream.putback(ch);
+ break;
+ }
+ }
+}
+
+static std::string read_line(std::istream& stream)
+{
+ std::string result;
+ // skip leading whitespace
+ skip_whitespace(stream);
+ // read the text
+ int ch;
+ while(stream.good() && (ch = stream.get()) != '\n')
+ result.push_back(ch);
+
+ return result;
+}
+
+static void skip_line(std::istream& stream)
+{
+ // skip this line
+ while(stream.good() && stream.get() != '\n')
+ { }
+}
+
+static int is_word_char(int ch)
+{
+ return !isspace(ch) &&
+ ch != ':' && ch != '#';
+}
+
+static TToken get_token(std::istream& stream)
+{
+ while(stream.good())
+ {
+ char ch = stream.get();
+ if(is_word_char(ch))
+ {
+ std::string word;
+ do
+ {
+ word.push_back(ch);
+ if(!stream.good())
+ return TToken(TToken::T_WORD, word);
+
+ ch = stream.get();
+ }
+ while(is_word_char(ch));
+
+ stream.putback(ch);
+ return TToken(TToken::T_WORD, word);
+ }
+ else if(ch == ':')
+ return TToken(TToken::T_COLON);
+ else if(ch == '#')
+ skip_line(stream);
+ }
+
+ return TToken(TToken::T_EOF);
+}
+
+typedef std::map<std::string,EventAreaPtr> InstanceAreaMap;
+static EventAreaPtr get_instance_area(const InstanceAreaMap& instances, const std::string name)
+{
+ InstanceAreaMap::const_iterator pos = instances.find(name);
+ if(pos == instances.end())
+ return NULL;
+
+ return pos->second;
+}
+
+MscPtr Engmann::load_msc(std::istream& stream)
+{
+ BMscPtr result = new BMsc();
+
+ InstanceAreaMap instances;
+
+ static const Coordinate x_step = 20; // distance between instances [mm]
+ Coordinate current_x = 10;
+
+ static const Coordinate y_step = 5; // distance between messages [mm]
+ Coordinate current_y = 5;
+
+ while(stream.good())
+ {
+ TToken token = get_token(stream);
+ if(token.type == TToken::T_WORD)
+ {
+ TToken next_token = get_token(stream);
+ // title | node
+ if(next_token.type == TToken::T_COLON)
+ {
+ if(strcmp(token.text.c_str(), "title") == 0)
+ {
+ result->set_label(read_line(stream));
+ }
+ else if(strcmp(token.text.c_str(), "node") == 0)
+ {
+ TToken ip_address = get_token(stream);
+ TToken node_name = get_token(stream);
+
+ // create new instance
+ InstancePtr inst = new Instance(node_name.text);
+ inst->set_line_begin(Point(current_x,0));
+ result->add_instance(inst);
+
+ EventAreaPtr area = new StrictOrderArea();
+ inst->add_area(area);
+
+ instances[node_name.text] = area;
+ current_x += x_step;
+ }
+ else
+ {
+ // error
+ skip_line(stream);
+ }
+ }
+ // message
+ else if(next_token.type == TToken::T_WORD)
+ {
+ std::string message_label = read_line(stream);
+
+ EventAreaPtr from_area = get_instance_area(instances, token.text);
+ EventAreaPtr to_area = get_instance_area(instances, next_token.text);
+ if(from_area != NULL && to_area != NULL)
+ {
+ CompleteMessagePtr message = new CompleteMessage(message_label);
+
+ EventPtr from_event = from_area->add_event();
+ from_event->set_y(current_y);
+
+ EventPtr to_event = to_area->add_event();
+ to_event->set_y(current_y);
+
+ message->glue_events(from_event, to_event);
+ }
+ current_y += y_step;
+ }
+ else
+ {
+ // error
+ skip_line(stream);
+ }
+ }
+ else
+ {
+ // error
+ skip_line(stream);
+ }
+ }
+
+ // set length of the instance lines
+ for(InstanceAreaMap::const_iterator pos = instances.begin();
+ pos != instances.end(); pos++)
+ {
+ InstancePtr inst = pos->second->get_instance();
+ Coordinate my_x = inst->get_line_begin().get_x();
+
+ inst->set_line_end(Point(my_x,current_y));
+ }
+
+ return result;
+}
+
+// $Id$
Property changes on: trunk/src/data/engmann/engmann.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/src/data/engmann/engmann.h
===================================================================
--- trunk/src/data/engmann/engmann.h (rev 0)
+++ trunk/src/data/engmann/engmann.h 2009-01-11 17:57:54 UTC (rev 164)
@@ -0,0 +1,44 @@
+/*
+ * 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-2009 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#ifndef _ENGMANN_H
+#define _ENGMANN_H
+
+#include "data/formatter.h"
+#include "data/engmann/export.h"
+
+class SCENGMANN_EXPORT Engmann : public Formatter, public ImportFormatter
+{
+public:
+ //! file extension used to distinguish this format
+ // note: DLL in Windows cannot return pointers to static data
+ virtual std::string get_extension() const
+ { return "cfi"; }
+ //! human readable description of this format
+ virtual std::string get_description() const
+ { return "Engmann Message Chart"; }
+
+ //! import MSC document
+ virtual MscPtr load_msc(std::istream& stream);
+
+protected:
+};
+
+#endif /* _ENGMANN_H */
+
+// $Id$
Property changes on: trunk/src/data/engmann/engmann.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/src/data/engmann/export.h
===================================================================
--- trunk/src/data/engmann/export.h (rev 0)
+++ trunk/src/data/engmann/export.h 2009-01-11 17:57:54 UTC (rev 164)
@@ -0,0 +1,37 @@
+/*
+ * 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 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#ifndef _ENGMANN_EXPORT_H
+#define _ENGMANN_EXPORT_H
+
+#if defined(_MSC_VER)
+#pragma warning(disable: 4251)
+
+#if defined(scengmann_EXPORTS)
+#define SCENGMANN_EXPORT __declspec(dllexport)
+#else
+#define SCENGMANN_EXPORT __declspec(dllimport)
+#endif
+
+#else
+#define SCENGMANN_EXPORT
+#endif
+
+#endif /* _ENGMANN_EXPORT_H */
+
+// $Id$
Property changes on: trunk/src/data/engmann/export.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/src/data/engmann/module.cpp
===================================================================
--- trunk/src/data/engmann/module.cpp (rev 0)
+++ trunk/src/data/engmann/module.cpp 2009-01-11 17:57:54 UTC (rev 164)
@@ -0,0 +1,33 @@
+/*
+ * 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) 2009 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#include "data/engmann/engmann.h"
+
+// module initialization function
+// note: the Visio add-on searches for a function of this name
+extern "C" SCENGMANN_EXPORT
+Formatter** init_formatters()
+{
+ Formatter **result = new Formatter* [2];
+ result[0] = new Engmann();
+ result[1] = NULL;
+
+ return result;
+}
+
+// $Id$
Property changes on: trunk/src/data/engmann/module.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/data/msc.cpp
===================================================================
--- trunk/src/data/msc.cpp 2009-01-11 15:30:16 UTC (rev 163)
+++ trunk/src/data/msc.cpp 2009-01-11 17:57:54 UTC (rev 164)
@@ -241,7 +241,8 @@
m_label = original->get_label();
m_kind = original->get_label();
m_form = original->get_form();
- m_height = original->get_height();
+ m_line_begin = original->get_line_begin();
+ m_line_end = original->get_line_end();
m_width = original->get_width();
}
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2009-01-11 15:30:16 UTC (rev 163)
+++ trunk/src/data/msc.h 2009-01-11 17:57:54 UTC (rev 164)
@@ -896,7 +896,8 @@
*/
BMsc* m_bmsc;
- Size m_height;
+ Point m_line_begin;
+ Point m_line_end;
Size m_width;
@@ -969,16 +970,26 @@
m_bmsc = bmsc;
}
- Size get_height() const
+ Point get_line_begin() const
{
- return m_height;
+ return m_line_begin;
}
- void set_height(const Size& height)
+ void set_line_begin(const Point& line_begin)
{
- m_height = height;
+ m_line_begin = line_begin;
}
+ Point get_line_end() const
+ {
+ return m_line_end;
+ }
+
+ void set_line_end(const Point& line_end)
+ {
+ m_line_end = line_end;
+ }
+
Size get_width() const
{
return m_width;
@@ -1363,6 +1374,11 @@
}
}
+ Coordinate set_y(Coordinate y)
+ {
+ return m_y = y;
+ }
+
Coordinate get_y()
{
return m_y;
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2009-01-11 15:30:16 UTC (rev 163)
+++ trunk/tests/CMakeLists.txt 2009-01-11 17:57:54 UTC (rev 164)
@@ -48,4 +48,13 @@
)
ADD_TEST(race_checker race_checker_test)
+ADD_EXECUTABLE(engmann_test
+ engmann_test.cpp
+)
+TARGET_LINK_LIBRARIES(engmann_test
+ scengmann
+ scZ120
+)
+ADD_TEST(engmann engmann_test engmann_test01.cfi)
+
# $Id$
Added: trunk/tests/engmann_test.cpp
===================================================================
--- trunk/tests/engmann_test.cpp (rev 0)
+++ trunk/tests/engmann_test.cpp 2009-01-11 17:57:54 UTC (rev 164)
@@ -0,0 +1,53 @@
+/*
+ * 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) 2009 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#include <iostream>
+#include <fstream>
+#include "data/engmann/engmann.h"
+#include "data/Z120/z120.h"
+
+int main(int argc, char** argv)
+{
+ if(argc < 2)
+ {
+ std::cerr << "Usage: " << argv[0] << " <filename>" << std::endl;
+ return 1;
+ }
+
+ Engmann engmann;
+
+ std::ifstream stream;
+ stream.open(argv[1], std::ifstream::in);
+ if(!stream.good())
+ {
+ std::cerr << "Cannot open file '" << argv[1] << "'" << std::endl;
+ return 1;
+ }
+
+ std::vector<MscPtr> msc;
+ msc.push_back(engmann.load_msc(stream));
+
+ stream.close();
+
+ Z120 z120;
+ z120.save_msc(std::cout, argv[1], msc);
+
+ return 0;
+}
+
+// $Id$
Property changes on: trunk/tests/engmann_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/tests/engmann_test01.cfi
===================================================================
--- trunk/tests/engmann_test01.cfi (rev 0)
+++ trunk/tests/engmann_test01.cfi 2009-01-11 17:57:54 UTC (rev 164)
@@ -0,0 +1,27 @@
+# Input-File for PktMM callflow
+
+# Title
+title: Basic PktMM Message Flow
+
+# Nodes (may be more than actually involved)
+node: 10.0.0.1 AM
+node: 10.0.0.2 PCS
+node: 10.0.0.3 CMTS
+node: 10.0.0.4 RKS
+
+
+# Messages
+# From To Message; Keine Leerzeichen!
+
+
+AM PCS PKTMM3:GATE_SET
+PCS CMTS PKTMM2:GATE_SET
+CMTS PCS PKTMM2:GATE_SET_ACK
+PCS AM PKTMM3:GATE_SET_ACK
+PCS RKS PKTMM4:ACC_REQ(POLICY_REQ)
+RKS PCS PKTMM4:ACC_RSP
+
+
+
+
+
Property changes on: trunk/tests/engmann_test01.cfi
___________________________________________________________________
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2009-01-11 22:50:44
|
Revision: 166
http://scstudio.svn.sourceforge.net/scstudio/?rev=166&view=rev
Author: gotthardp
Date: 2009-01-11 22:50:31 +0000 (Sun, 11 Jan 2009)
Log Message:
-----------
Engmann Chart import integrated with Microsoft Visio. This includes a first msc.h to Visio conversion.
Enhanced FindANTLR for Windows.
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/FindANTLR.cmake
trunk/src/data/Z120/CMakeLists.txt
trunk/src/data/engmann/engmann.cpp
trunk/src/data/msc.h
trunk/src/data/msc_visual.h
trunk/src/view/visio/addon/addon.cpp
trunk/src/view/visio/addon/document.cpp
trunk/src/view/visio/addon/document.h
trunk/src/view/visio/addon/scstudio.vcproj
trunk/src/view/visio/scstudio.nsi
Added Paths:
-----------
trunk/src/view/visio/addon/visualize.cpp
trunk/src/view/visio/addon/visualize.h
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2009-01-11 19:50:35 UTC (rev 165)
+++ trunk/CMakeLists.txt 2009-01-11 22:50:31 UTC (rev 166)
@@ -2,6 +2,8 @@
# cmake .
#cmake . -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/local
+# Set path to ANTLR using -DANTLR_ROOT=/home/user/antlr-3.1.1
+
PROJECT(scstudio C CXX)
#SET(CMAKE_VERBOSE_MAKEFILE ON)
Modified: trunk/FindANTLR.cmake
===================================================================
--- trunk/FindANTLR.cmake 2009-01-11 19:50:35 UTC (rev 165)
+++ trunk/FindANTLR.cmake 2009-01-11 22:50:31 UTC (rev 166)
@@ -1,16 +1,31 @@
+# set the default ANTLR_ROOT value
+IF(NOT ANTLR_ROOT)
+ SET(ANTLR_ROOT $ENV{ANTLR_ROOT} CACHE PATH "The ANTLR directory root.")
+ENDIF(NOT ANTLR_ROOT)
+
+FIND_FILE(ANTLR_CLASSPATH
+ NAMES antlr-3.1.1.jar
+ PATHS
+ ${ANTLR_ROOT}/lib
+ DOC "The ANTLR Class File")
+
FIND_LIBRARY(ANTLR_LIBRARY
NAMES antlr3c
+ PATHS
+ ${ANTLR_ROOT}/runtime/C
DOC "The ANTLR Library")
FIND_PATH(ANTLR_INCLUDE_DIR
NAMES antlr3.h
+ PATHS
+ ${ANTLR_ROOT}/runtime/C/include
DOC "The ANTLR Include Files")
-IF (ANTLR_LIBRARY AND ANTLR_INCLUDE_DIR)
+IF (ANTLR_CLASSPATH AND ANTLR_LIBRARY AND ANTLR_INCLUDE_DIR)
SET(ANTLR_FOUND TRUE)
-ELSE (ANTLR_LIBRARY AND ANTLR_INCLUDE_DIR)
+ELSE (ANTLR_CLASSPATH AND ANTLR_LIBRARY AND ANTLR_INCLUDE_DIR)
SET(ANTLR_FOUND FALSE)
IF (ANTLR_FIND_REQUIRED)
- MESSAGE(FATAL_ERROR "ANTLR not found! Please install and re-run.")
+ MESSAGE(FATAL_ERROR "ANTLR not found! Set ANTLR_ROOT to the antlr-3.1.1 directory.")
ENDIF (ANTLR_FIND_REQUIRED)
-ENDIF (ANTLR_LIBRARY AND ANTLR_INCLUDE_DIR)
+ENDIF (ANTLR_CLASSPATH AND ANTLR_LIBRARY AND ANTLR_INCLUDE_DIR)
Modified: trunk/src/data/Z120/CMakeLists.txt
===================================================================
--- trunk/src/data/Z120/CMakeLists.txt 2009-01-11 19:50:35 UTC (rev 165)
+++ trunk/src/data/Z120/CMakeLists.txt 2009-01-11 22:50:31 UTC (rev 166)
@@ -13,7 +13,7 @@
ADD_CUSTOM_COMMAND(
OUTPUT Z120Lexer.c Z120Lexer.h Z120Parser.c Z120Parser.h
- COMMAND ${JAVA_RUNTIME} org.antlr.Tool Z120.g
+ COMMAND ${JAVA_RUNTIME} -classpath ${ANTLR_CLASSPATH} org.antlr.Tool Z120.g
DEPENDS Z120.g)
ADD_EXECUTABLE(parser
Modified: trunk/src/data/engmann/engmann.cpp
===================================================================
--- trunk/src/data/engmann/engmann.cpp 2009-01-11 19:50:35 UTC (rev 165)
+++ trunk/src/data/engmann/engmann.cpp 2009-01-11 22:50:31 UTC (rev 166)
@@ -125,7 +125,7 @@
InstanceAreaMap instances;
- static const Coordinate x_step = 20; // distance between instances [mm]
+ static const Coordinate x_step = 30; // distance between instances [mm]
Coordinate current_x = 10;
static const Coordinate y_step = 5; // distance between messages [mm]
@@ -151,7 +151,7 @@
// create new instance
InstancePtr inst = new Instance(node_name.text);
- inst->set_line_begin(Point(current_x,0));
+ inst->set_line_begin(Point(current_x,5));
result->add_instance(inst);
EventAreaPtr area = new StrictOrderArea();
@@ -206,8 +206,9 @@
{
InstancePtr inst = pos->second->get_instance();
Coordinate my_x = inst->get_line_begin().get_x();
+ Coordinate my_y = inst->get_line_begin().get_y();
- inst->set_line_end(Point(my_x,current_y));
+ inst->set_line_end(Point(my_x,my_y+current_y));
}
return result;
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2009-01-11 19:50:35 UTC (rev 165)
+++ trunk/src/data/msc.h 2009-01-11 22:50:31 UTC (rev 166)
@@ -25,6 +25,7 @@
#include <map>
#include <typeinfo>
#include <queue>
+#include <cmath>
// we use boost::intrusive_ptr as we need to construct the xx_ptr<T> from T*
// see http://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/smart_ptr.htm
@@ -998,6 +999,13 @@
m_line_end = line_end;
}
+ Size get_height() const
+ {
+ Size dx = m_line_end.get_x() - m_line_begin.get_x();
+ Size dy = m_line_end.get_y() - m_line_begin.get_y();
+ return sqrt(dx*dx + dy*dy);
+ }
+
Size get_width() const
{
return m_width;
Modified: trunk/src/data/msc_visual.h
===================================================================
--- trunk/src/data/msc_visual.h 2009-01-11 19:50:35 UTC (rev 165)
+++ trunk/src/data/msc_visual.h 2009-01-11 22:50:31 UTC (rev 166)
@@ -47,7 +47,7 @@
m_y = y;
}
- Coordinate get_x()
+ Coordinate get_x() const
{
return m_x;
}
@@ -57,7 +57,7 @@
m_x = x;
}
- Coordinate get_y()
+ Coordinate get_y() const
{
return m_y;
}
Modified: trunk/src/view/visio/addon/addon.cpp
===================================================================
--- trunk/src/view/visio/addon/addon.cpp 2009-01-11 19:50:35 UTC (rev 165)
+++ trunk/src/view/visio/addon/addon.cpp 2009-01-11 22:50:31 UTC (rev 166)
@@ -239,6 +239,9 @@
case OPT_EVENT:
iEvent = _tstol(args.OptionArg());
break;
+ case OPT_EVENTID:
+ // FIXME: what is this parameter for?
+ break;
case OPT_DOC:
iDocumentIndex = _tstol(args.OptionArg());
break;
Modified: trunk/src/view/visio/addon/document.cpp
===================================================================
--- trunk/src/view/visio/addon/document.cpp 2009-01-11 19:50:35 UTC (rev 165)
+++ trunk/src/view/visio/addon/document.cpp 2009-01-11 22:50:31 UTC (rev 166)
@@ -22,6 +22,7 @@
#include "document.h"
#include "errors.h"
#include "extract.h"
+#include "visualize.h"
#include <fstream>
#include "data/msc.h"
@@ -363,30 +364,83 @@
return res;
}
-// align a given number[inch] to a 5[mm] grid
-inline double align5(double inch)
+VAORC CDocumentMonitor::OnMenuImport(Visio::IVApplicationPtr vsoApp)
{
- // 1[inch] = 25.4[mm]
- return floor(inch*25.4/5)*5/25.4;
-}
+ std::string extension;
+ std::stringstream filter;
-static const INCH2MM = 25.4;
+ // construct the filter string
+ // _T("Text Documents (*.txt)\0*.txt\0All Files (*.*)\0*.*\0")
+ for(FormatterPtrList::const_iterator fpos = m_formatters.begin();
+ fpos != m_formatters.end(); fpos++)
+ {
+ ImportFormatterPtr formatter = boost::dynamic_pointer_cast<ImportFormatter>(*fpos);
+ if(formatter == NULL)
+ continue;
-VAORC CDocumentMonitor::OnMenuImport(Visio::IVApplicationPtr vsoApp)
-{
- double pageHeight =
- vsoApp->ActivePage->PageSheet->CellsSRC[visSectionObject][visRowPage][visPageHeight]->ResultIU;
+ filter << (*fpos)->get_description()
+ << " (*." << (*fpos)->get_extension() << ")@*." << (*fpos)->get_extension() << "@";
- Visio::IVDocumentPtr stencil = vsoApp->Documents->Item[BMSC_STENCIL_NAME];
- Visio::IVMasterPtr master1 = stencil->Masters->Item["Message (Right)"];
- Visio::IVMasterPtr master2 = stencil->Masters->Item["Line Instance"];
+ if(extension.empty())
+ extension = (*fpos)->get_extension();
+ }
+ // append a filter to display all files
+ filter << "All Files (*.*)@*.*@";
+ // translate char --> TCHAR and '@' --> '\0'
+ // note: Windows stringstream cannot handle '\0' inside a string
+ std::wstring extension_w = filter_to_wstring(extension);
+ std::wstring filter_w = filter_to_wstring(filter.str());
- Visio::IVShapePtr sh1 = vsoApp->ActivePage->Drop(master1, 0, pageHeight-0);
- Visio::IVShapePtr sh2 = vsoApp->ActivePage->Drop(master2, 0, pageHeight-0);
+ CFileDialog dialog(TRUE /* open */,
+ extension_w.c_str(), NULL,
+ OFN_EXPLORER | OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST,
+ filter_w.c_str());
+ INT_PTR res = dialog.DoModal();
- Visio::IVCellPtr c1 = sh1->CellsSRC[visSectionObject][visRowXForm1D][vis1DBeginX];
- c1->GlueToPos(sh2, 0.5, 0);
+ if(res != IDOK)
+ return VAORC_SUCCESS;
+ TRACE("OnMenuImport() loading " << dialog.m_szFileTitle << " from " << dialog.m_szFileName);
+
+ char fileName[MAX_PATH];
+ wcstombs(fileName, dialog.m_szFileName, MAX_PATH);
+
+ char *fileExtension = strrchr(fileName, '.');
+ if(fileExtension == NULL || *fileExtension == '\0')
+ {
+ MessageBox(GetActiveWindow(),
+ _T("No extension given. Cannot determine file type."), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
+ return VAORC_FAILURE;
+ }
+
+ // look for the appropriate export formatter
+ for(FormatterPtrList::const_iterator fpos = m_formatters.begin();
+ fpos != m_formatters.end(); fpos++)
+ {
+ if(stricmp(fileExtension+1, (*fpos)->get_extension().c_str()) != 0)
+ continue;
+
+ ImportFormatterPtr formatter = boost::dynamic_pointer_cast<ImportFormatter>(*fpos);
+ if(formatter == NULL)
+ continue;
+
+ std::ifstream stream;
+ stream.open(fileName, std::ios::in);
+ if(!stream.good())
+ {
+ MessageBox(GetActiveWindow(),
+ _T("Cannot import given file."), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
+ return VAORC_FAILURE;
+ }
+
+ ImportDocument(formatter, stream);
+
+ stream.close();
+ return VAORC_SUCCESS;
+ }
+
+ MessageBox(GetActiveWindow(),
+ _T("No suitable import filter found."), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
return VAORC_FAILURE;
}
@@ -400,6 +454,10 @@
for(FormatterPtrList::const_iterator fpos = m_formatters.begin();
fpos != m_formatters.end(); fpos++)
{
+ ExportFormatterPtr formatter = boost::dynamic_pointer_cast<ExportFormatter>(*fpos);
+ if(formatter == NULL)
+ continue;
+
filter << (*fpos)->get_description()
<< " (*." << (*fpos)->get_extension() << ")@*." << (*fpos)->get_extension() << "@";
@@ -413,7 +471,7 @@
std::wstring extension_w = filter_to_wstring(extension);
std::wstring filter_w = filter_to_wstring(filter.str());
- CFileDialog dialog(FALSE,
+ CFileDialog dialog(FALSE /* save as */,
extension_w.c_str(), NULL,
OFN_EXPLORER | OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_OVERWRITEPROMPT,
filter_w.c_str());
@@ -511,6 +569,14 @@
m_reportVisible = false;
}
+void CDocumentMonitor::ImportDocument(const ImportFormatterPtr& formatter, std::istream& stream)
+{
+ MscPtr drawing = formatter->load_msc(stream);
+
+ CDrawingVisualizer visualizer(m_vsoApp->ActivePage);
+ visualizer.visualize_msc(drawing);
+}
+
void CDocumentMonitor::ExportActiveDocument(const ExportFormatterPtr& formatter, std::ostream& stream)
{
if(!m_reportVisible)
Modified: trunk/src/view/visio/addon/document.h
===================================================================
--- trunk/src/view/visio/addon/document.h 2009-01-11 19:50:35 UTC (rev 165)
+++ trunk/src/view/visio/addon/document.h 2009-01-11 22:50:31 UTC (rev 166)
@@ -49,6 +49,7 @@
void ShowReportView(Visio::IVApplicationPtr vsoApp);
void OnHideReportView();
+ void ImportDocument(const ImportFormatterPtr& formatter, std::istream& stream);
void ExportActiveDocument(const ExportFormatterPtr& formatter, std::ostream& stream);
Visio::IVShapePtr FindShape(const _bstr_t& id);
Modified: trunk/src/view/visio/addon/scstudio.vcproj
===================================================================
--- trunk/src/view/visio/addon/scstudio.vcproj 2009-01-11 19:50:35 UTC (rev 165)
+++ trunk/src/view/visio/addon/scstudio.vcproj 2009-01-11 22:50:31 UTC (rev 166)
@@ -253,6 +253,12 @@
<File
RelativePath=".\stdafx.h">
</File>
+ <File
+ RelativePath=".\visualize.cpp">
+ </File>
+ <File
+ RelativePath=".\visualize.h">
+ </File>
</Filter>
<Filter
Name="Resource Files"
Added: trunk/src/view/visio/addon/visualize.cpp
===================================================================
--- trunk/src/view/visio/addon/visualize.cpp (rev 0)
+++ trunk/src/view/visio/addon/visualize.cpp 2009-01-11 22:50:31 UTC (rev 166)
@@ -0,0 +1,116 @@
+/*
+ * 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) 2007-2008 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#include "stdafx.h"
+#include "document.h"
+#include "visualize.h"
+
+#include <math.h>
+#include <Visconst.h>
+
+inline double align5(double mm)
+{
+ return floor(mm/5)*5;
+}
+
+CDrawingVisualizer::CDrawingVisualizer(Visio::IVPagePtr vsoPage)
+{
+ m_page = vsoPage;
+ m_page_height = align5(vsoPage->PageSheet->CellsSRC[visSectionObject][visRowPage][visPageHeight]->Result[visMillimeters]);
+
+ Visio::IVDocumentPtr stencil = vsoPage->Application->Documents->Item[BMSC_STENCIL_NAME];
+ m_message_master = stencil->Masters->Item["Message (Right)"];
+ m_instance_master = stencil->Masters->Item["Line Instance"];
+}
+
+void CDrawingVisualizer::visualize_msc(const MscPtr& drawing)
+{
+ BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(drawing);
+ if(bmsc != NULL)
+ visualize_bmsc(bmsc);
+}
+
+static const INCH2MM = 25.4;
+
+void CDrawingVisualizer::visualize_instance(const InstancePtr& instance)
+{
+}
+
+void CDrawingVisualizer::visualize_bmsc(const BMscPtr& bmsc)
+{
+ std::map<InstancePtr,Visio::IVShapePtr> instances;
+
+ for(InstancePtrList::const_iterator ipos = bmsc->get_instances().begin();
+ ipos != bmsc->get_instances().end(); ipos++)
+ {
+ Visio::IVShapePtr inst = m_page->Drop(m_instance_master, 0, m_page_height-0);
+
+ inst->Text = (*ipos)->get_label().c_str();
+ inst->CellsSRC[visSectionObject][visRowXForm1D][vis1DBeginX]->Result[visMillimeters] = (*ipos)->get_line_begin().get_x();
+ inst->CellsSRC[visSectionObject][visRowXForm1D][vis1DBeginY]->Result[visMillimeters] = m_page_height-(*ipos)->get_line_begin().get_y();
+ inst->CellsSRC[visSectionObject][visRowXForm1D][vis1DEndX]->Result[visMillimeters] = (*ipos)->get_line_end().get_x();
+ inst->CellsSRC[visSectionObject][visRowXForm1D][vis1DEndY]->Result[visMillimeters] = m_page_height-(*ipos)->get_line_end().get_y();
+
+ instances[*ipos] = inst;
+ }
+
+ std::map<CompleteMessagePtr,Visio::IVShapePtr> messages;
+
+ for(InstancePtrList::const_iterator ipos = bmsc->get_instances().begin();
+ ipos != bmsc->get_instances().end(); ipos++)
+ {
+ Visio::IVShapePtr inst = instances[*ipos];
+ if(inst == NULL)
+ continue;
+
+ for(EventAreaPtr area = (*ipos)->get_first();
+ area != NULL; area = area->get_next())
+ {
+ StrictOrderAreaPtr strict_area = boost::dynamic_pointer_cast<StrictOrderArea>(area);
+ if(strict_area != NULL)
+ {
+ for(StrictEventPtr event = strict_area->get_first();
+ event != NULL; event = event->get_successor())
+ {
+ CompleteMessagePtr message = event->get_complete_message();
+
+ Visio::IVShapePtr msg = messages[message];
+ if(msg == NULL)
+ {
+ msg = m_page->Drop(m_message_master, 0, m_page_height-0);
+ msg->Text = message->get_label().c_str();
+ messages[message] = msg;
+ }
+
+ if(message->get_send_event() == event)
+ {
+ Visio::IVCellPtr cell = msg->CellsSRC[visSectionObject][visRowXForm1D][vis1DBeginX];
+ cell->GlueToPos(inst, event->get_y()/(*ipos)->get_height(), 0);
+ }
+ else if(message->get_receive_event() == event)
+ {
+ Visio::IVCellPtr cell = msg->CellsSRC[visSectionObject][visRowXForm1D][vis1DEndX];
+ cell->GlueToPos(inst, event->get_y()/(*ipos)->get_height(), 0);
+ }
+ }
+ }
+ }
+ }
+}
+
+// $Id$
Property changes on: trunk/src/view/visio/addon/visualize.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/src/view/visio/addon/visualize.h
===================================================================
--- trunk/src/view/visio/addon/visualize.h (rev 0)
+++ trunk/src/view/visio/addon/visualize.h 2009-01-11 22:50:31 UTC (rev 166)
@@ -0,0 +1,41 @@
+/*
+ * 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) 2007-2008 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#pragma once
+
+#include <Vaddon.h>
+#include "data/msc.h"
+
+class CDrawingVisualizer
+{
+public:
+ CDrawingVisualizer(Visio::IVPagePtr vsoPage);
+ void visualize_msc(const MscPtr& drawing);
+
+protected:
+ Visio::IVPagePtr m_page;
+ double m_page_height;
+
+ Visio::IVMasterPtr m_message_master;
+ Visio::IVMasterPtr m_instance_master;
+
+ void visualize_instance(const InstancePtr& instance);
+ void visualize_bmsc(const BMscPtr& bmsc);
+};
+
+// $Id$
Property changes on: trunk/src/view/visio/addon/visualize.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/view/visio/scstudio.nsi
===================================================================
--- trunk/src/view/visio/scstudio.nsi 2009-01-11 19:50:35 UTC (rev 165)
+++ trunk/src/view/visio/scstudio.nsi 2009-01-11 22:50:31 UTC (rev 166)
@@ -103,6 +103,7 @@
WriteRegStr HKCU '${ModuleRegPath}' 'sc_order' '$INSTDIR\bin\scorder.dll'
WriteRegStr HKCU '${ModuleRegPath}' 'sc_race' '$INSTDIR\bin\scrace.dll'
WriteRegStr HKCU '${ModuleRegPath}' 'sc_z120' '$INSTDIR\bin\scZ120.dll'
+ WriteRegStr HKCU '${ModuleRegPath}' 'sc_engmann' '$INSTDIR\bin\scengmann.dll'
;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ba...@us...> - 2009-01-16 22:58:44
|
Revision: 171
http://scstudio.svn.sourceforge.net/scstudio/?rev=171&view=rev
Author: babicaj
Date: 2009-01-16 22:29:45 +0000 (Fri, 16 Jan 2009)
Log Message:
-----------
SRChannelMapper bug fixed
Modified Paths:
--------------
trunk/src/data/checker.h
trunk/tests/fifo_checker_test.cpp
Modified: trunk/src/data/checker.h
===================================================================
--- trunk/src/data/checker.h 2009-01-16 21:39:08 UTC (rev 170)
+++ trunk/src/data/checker.h 2009-01-16 22:29:45 UTC (rev 171)
@@ -305,7 +305,7 @@
if((e1->is_send() && e2->is_send()) || (e1->is_receive() && e2->is_receive()))
{
return e1->get_sender_label()==e2->get_sender_label() &&
- e2->get_receiver_label()==e2->get_receiver_label();
+ e1->get_receiver_label()==e2->get_receiver_label();
}
return false;
}
Modified: trunk/tests/fifo_checker_test.cpp
===================================================================
--- trunk/tests/fifo_checker_test.cpp 2009-01-16 21:39:08 UTC (rev 170)
+++ trunk/tests/fifo_checker_test.cpp 2009-01-16 22:29:45 UTC (rev 171)
@@ -38,6 +38,7 @@
bool BMscO(); //BMscK
bool BMscP(); //BMscL
bool BMscR(); //BMscM
+bool BMscQ();
#define RETURN_IF_FAILED(res) if(!(res)) return 1;
@@ -62,6 +63,7 @@
RETURN_IF_FAILED(BMscO());
RETURN_IF_FAILED(BMscP());
RETURN_IF_FAILED(BMscR());
+ RETURN_IF_FAILED(BMscQ());
return 0;
}
@@ -740,4 +742,73 @@
return check(myBmsc,false,false);
}
+bool BMscQ() {
+ std::cout << "Checking:" << std::endl;
+ std::cout << " | | | |" << std::endl;
+ std::cout << " o-----a---->o | |" << std::endl;
+ std::cout << " | | | |" << std::endl;
+ std::cout << " | o----b----->o |" << std::endl;
+ std::cout << " | | | |" << std::endl;
+ std::cout << " | o<--b ack---o |" << std::endl;
+ std::cout << " | | | |" << std::endl;
+ std::cout << " |<--a ack---o | |" << std::endl;
+ std::cout << " | | | |" << std::endl;
+ std::cout << " | o----c----------------->o" << std::endl;
+ std::cout << " | | | |" << std::endl;
+ std::cout << " | o<-----------------d----o" << std::endl;
+ std::cout << " | | | |" << std::endl;
+
+ BMscPtr myBmsc(new BMsc);
+
+ InstancePtr i1(new Instance("p1"));
+ myBmsc->add_instance(i1);
+ InstancePtr i2(new Instance("p2"));
+ myBmsc->add_instance(i2);
+ InstancePtr i3(new Instance("p3"));
+ myBmsc->add_instance(i3);
+ InstancePtr i4(new Instance("p4"));
+ myBmsc->add_instance(i4);
+
+ EventAreaPtr a1(new StrictOrderArea());
+ i1->add_area(a1);
+ EventAreaPtr a2(new StrictOrderArea());
+ i2->add_area(a2);
+ EventAreaPtr a3(new StrictOrderArea());
+ i3->add_area(a3);
+ EventAreaPtr a4(new StrictOrderArea());
+ i4->add_area(a4);
+
+ EventPtr e1 = a1->add_event();
+ EventPtr e2 = a2->add_event();
+ CompleteMessagePtr m1 = new CompleteMessage("a");
+ m1->glue_events(e1,e2);
+
+ e1 = a2->add_event();
+ e2 = a3->add_event();
+ m1 = new CompleteMessage("b");
+ m1->glue_events(e1,e2);
+
+ e1 = a3->add_event();
+ e2 = a2->add_event();
+ m1 = new CompleteMessage("b ack");
+ m1->glue_events(e1,e2);
+
+ e1 = a2->add_event();
+ e2 = a1->add_event();
+ m1 = new CompleteMessage("a ack");
+ m1->glue_events(e1,e2);
+
+ e1 = a2->add_event();
+ e2 = a4->add_event();
+ m1 = new CompleteMessage("c");
+ m1->glue_events(e1,e2);
+
+ e1 = a4->add_event();
+ e2 = a2->add_event();
+ m1 = new CompleteMessage("d");
+ m1->glue_events(e1,e2);
+
+ return check(myBmsc,true,true);
+}
+
// $Id$
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ba...@us...> - 2009-01-28 21:09:56
|
Revision: 177
http://scstudio.svn.sourceforge.net/scstudio/?rev=177&view=rev
Author: babicaj
Date: 2009-01-28 21:09:46 +0000 (Wed, 28 Jan 2009)
Log Message:
-----------
Refactored RaceChecker
Modified Paths:
--------------
trunk/src/check/pseudocode/msc_duplicators.cpp
trunk/src/check/pseudocode/msc_duplicators.h
trunk/src/check/race/race_checker.cpp
trunk/src/check/race/race_checker.h
trunk/src/data/msc.h
trunk/tests/race_checker_test.cpp
Modified: trunk/src/check/pseudocode/msc_duplicators.cpp
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.cpp 2009-01-27 19:47:26 UTC (rev 176)
+++ trunk/src/check/pseudocode/msc_duplicators.cpp 2009-01-28 21:09:46 UTC (rev 177)
@@ -88,11 +88,6 @@
BMscDuplicator::~BMscDuplicator()
{
- EventPList::const_iterator i;
- for(i=m_modified_elements.begin();i!=m_modified_elements.end();i++)
- {
- (*i)->remove_attribute<Event*>(BMSC_DUPLICATOR_COPY_ATTR);
- }
}
BMscPtr BMscDuplicator::duplicate(BMscPtr& bmsc)
Modified: trunk/src/check/pseudocode/msc_duplicators.h
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.h 2009-01-27 19:47:26 UTC (rev 176)
+++ trunk/src/check/pseudocode/msc_duplicators.h 2009-01-28 21:09:46 UTC (rev 177)
@@ -102,10 +102,7 @@
*/
class SCPSEUDOCODE_EXPORT BMscDuplicator:public Duplicator
{
-protected:
- EventPList m_modified_elements;
-
public:
BMscDuplicator();
Modified: trunk/src/check/race/race_checker.cpp
===================================================================
--- trunk/src/check/race/race_checker.cpp 2009-01-27 19:47:26 UTC (rev 176)
+++ trunk/src/check/race/race_checker.cpp 2009-01-28 21:09:46 UTC (rev 177)
@@ -228,53 +228,32 @@
&m_visual_initiator,&m_causal_initiator,&m_instance_marker);
}
-BMsc* RaceChecker::create_counter_example(Event* e1, Event* e2)
+BMscPtr RaceChecker::create_counter_example(Event* e1, Event* e2)
{
- BMsc* bmsc = new BMsc(e1->get_instance()->get_bmsc());
- //InstancePtr common_instance = new Instance(bmsc,e1->get_instance());
- //bmsc->add_instance(common_instance);
- //BoolVector& e2_causal = m_causal_initiator.get_causal_closure(e2);
- //size_t e1_index = m_visual_initiator.get_topology_index(e1);
- //MscMessagePtr e1_message;
- //if(e1->is_send())
- // e1_message = new MscMessage(
- // common_instance.get(),NULL,e1->get_message().get());
- //else
- // e1_message = new MscMessage(
- // NULL,common_instance.get(),e1->get_message().get());
- //MscMessagePtr e2_message;
- //if(e2->is_send())
- // e2_message = new MscMessage(
- // common_instance.get(),NULL,e2->get_message().get());
- //else
- // e2_message = new MscMessage(
- // NULL,common_instance.get(),e2->get_message().get());
- ////e2 << e1
- //if(e2_causal[e1_index])
- //{
- // StrictOrderAreaPtr common_strict = new StrictOrderArea(
- // common_instance.get());
- // StrictEventPtr e1_strict = new StrictEvent(common_strict.get(),e1_message,e1);
- // StrictEventPtr e2_strict = new StrictEvent(common_strict.get(),e2_message,e2);
- // common_strict->set_first(e1_strict);
- // e1_strict->set_successor(e2_strict);
- // common_instance->set_first(common_strict);
- //}
- ////e2 || e1
- //else
- //{
- // CoregionAreaPtr common_coregion = new CoregionArea(common_instance.get());
- // CoregionEvent* e1_coregion = new CoregionEvent(
- // common_coregion.get(),e1_message,e1);
- // CoregionEvent* e2_coregion = new CoregionEvent(
- // common_coregion.get(),e2_message,e2);
- // common_coregion->add_minimal_event(e1_coregion);
- // common_coregion->add_minimal_event(e2_coregion);
- // common_instance->set_first(common_coregion);
- //}
- return bmsc;
+ BMscDuplicator duplicator;
+ BMscPtr original = e1->get_instance()->get_bmsc();
+ BMscPtr copy = duplicator.duplicate_bmsc(original);
+ duplicator.get_copy(e1)->set_marked();
+ duplicator.get_copy(e2)->set_marked();
+ duplicator.get_copy(e1->get_message().get())->set_marked();
+ duplicator.get_copy(e2->get_message().get())->set_marked();
+ return copy;
}
+bool RaceChecker::check_events(Event* e1, Event* e2)
+{
+ //e1<e2 or they are unordered because of topology order with respect to <
+ BoolVector& e1_visual_order = m_visual_initiator.get_visual_closure(e1);
+ BoolVector& e1_causal_order = m_causal_initiator.get_causal_closure(e1);
+ size_t e2_index = m_visual_initiator.get_topology_index(e2);
+ if(e1_visual_order[e2_index])
+ {
+ //if e1<e2 check causality
+ return e1_causal_order[e2_index];
+ }
+ return true;
+}
+
BMscPtr RaceChecker::check_bmsc(BMscPtr bmsc, ChannelMapperPtr mapper)
{
EventPListPtr t = DFSEventsTraverser::topology_order(bmsc);
@@ -285,23 +264,15 @@
m_visual_initiator.initialize(topology);
m_causal_initiator.initialize(topology,m_visual_initiator,mapper);
BMscPtr result;
- OrderCheckerListener order_checker_listener(&m_visual_initiator);
- DFSInstanceEventsTraverser instance_traverser;
- instance_traverser.add_white_event_found_listener(&order_checker_listener);
for(size_t i = 0; i < topology.size(); i++)
{
- //in this block checkout whether there is any Event in race with topology[i]
- order_checker_listener.reset(
- &m_visual_initiator.get_visual_closure(topology[i]),
- &m_causal_initiator.get_causal_closure(topology[i]));
- try
+ for(size_t j=i+1; j< topology.size(); j++)
{
- instance_traverser.traverse(topology[i]->get_instance());
+ if(!check_events(topology[i],topology[j]))
+ {
+ return create_counter_example(topology[i],topology[j]);
+ }
}
- catch(EventRaceException& e)
- {
- return create_counter_example(topology[i],e.get_event());
- }
}
return result;
}
@@ -394,8 +365,19 @@
HMscPtr RaceChecker::create_counter_example(const MscElementPListList& path, BMscPtr example)
{
- //TODO: create counter example
- return HMscPtr(new HMsc());
+ HMscPathDuplicator duplicator;
+ HMscPtr result = duplicator.duplicate_path(path);
+ //set propper msc to last element
+ ReferenceNode* last_copy = dynamic_cast<ReferenceNode*>(
+ duplicator.get_copy(path.back().back()));
+ last_copy->set_msc(example);
+ //mark last elements of path
+ MscElementPListList::const_iterator h;
+ for(h=path.begin();h!=path.end();h++)
+ {
+ duplicator.get_copy(h->back())->set_marked(true);
+ }
+ return result;
}
HMscPtr RaceChecker::create_counter_example(RaceInHMscException& e)
Modified: trunk/src/check/race/race_checker.h
===================================================================
--- trunk/src/check/race/race_checker.h 2009-01-27 19:47:26 UTC (rev 176)
+++ trunk/src/check/race/race_checker.h 2009-01-28 21:09:46 UTC (rev 177)
@@ -190,7 +190,7 @@
/**
* It was found that e1<e2 but not e1<<e2
*/
- BMsc* create_counter_example(Event* e1, Event* e2);
+ BMscPtr create_counter_example(Event* e1, Event* e2);
/**
*
@@ -238,6 +238,8 @@
// FIXME: this is a dummy function only; Jindra needs to verify
return true;
}
+
+ bool check_events(Event* e1, Event* e2);
};
class RaceInBMscException:public std::exception
@@ -290,75 +292,6 @@
};
-class EventRaceException:public std::exception
-{
-private:
-
- Event* m_event;
-
-public:
-
- EventRaceException(Event* e)
- {
- m_event = e;
- }
-
- ~EventRaceException() throw ()
- {
-
- }
-
- const char* what()
- {
- return "There was found race between two events";
- }
-
- Event* get_event()
- {
- return m_event;
- }
-};
-
-/**
- * Used for checking events to be in race or not.
- */
-class OrderCheckerListener:public WhiteEventFoundListener
-{
-private:
-
- VisualClosureInitiator* m_visual_initiator;
-
- BoolVector* m_e1_visual_order;
-
- BoolVector* m_e1_causal_order;
-
-public:
-
- OrderCheckerListener(VisualClosureInitiator* visual_initiator)
- {
- m_visual_initiator=visual_initiator;
-
- }
-
- void reset(
- BoolVector* visual_order,
- BoolVector* causal_order)
- {
- m_e1_visual_order=visual_order;
- m_e1_causal_order=causal_order;
- }
-
- void on_white_event_found(Event* e2)
- {
- size_t e2_index = m_visual_initiator->get_topology_index(e2);
- if((*m_e1_visual_order)[e2_index] && !(*m_e1_causal_order)[e2_index])
- {
- throw EventRaceException(e2);
- }
- }
-
-};
-
class RaceInHMscException:public std::exception
{
private:
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2009-01-27 19:47:26 UTC (rev 176)
+++ trunk/src/data/msc.h 2009-01-28 21:09:46 UTC (rev 177)
@@ -262,7 +262,7 @@
return m_marked;
}
- void set_marked(bool marked)
+ void set_marked(bool marked=true)
{
m_marked = marked;
}
Modified: trunk/tests/race_checker_test.cpp
===================================================================
--- trunk/tests/race_checker_test.cpp 2009-01-27 19:47:26 UTC (rev 176)
+++ trunk/tests/race_checker_test.cpp 2009-01-28 21:09:46 UTC (rev 177)
@@ -303,7 +303,7 @@
}
int main(int argc, char** argv) {
- RETURN_IF_FAILED(HMscA());
+ //RETURN_IF_FAILED(HMscA());
RETURN_IF_FAILED(HMscB());
RETURN_IF_FAILED(HMscC());
RETURN_IF_FAILED(HMscD());
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|