|
From: <ba...@us...> - 2008-11-29 21:18:19
|
Revision: 125
http://scstudio.svn.sourceforge.net/scstudio/?rev=125&view=rev
Author: babicaj
Date: 2008-11-29 21:18:12 +0000 (Sat, 29 Nov 2008)
Log Message:
-----------
RaceChecker integrated into new build -- needs to be tested (coming soon)
Modified Paths:
--------------
trunk/src/check/CMakeLists.txt
trunk/src/check/pseudocode/CMakeLists.txt
trunk/src/check/pseudocode/msc_duplicators.cpp
trunk/src/check/pseudocode/msc_duplicators.h
trunk/src/check/pseudocode/refnode_finder.h
trunk/src/check/pseudocode/utils.h
trunk/src/check/race/CMakeLists.txt
trunk/src/check/race/bmsc_race_checker.cpp
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/CMakeLists.txt
trunk/src/data/dfs_bmsc_graph_traverser.h
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
Added Paths:
-----------
trunk/src/check/pseudocode/utils.cpp
trunk/src/check/race/export.h
Modified: trunk/src/check/CMakeLists.txt
===================================================================
--- trunk/src/check/CMakeLists.txt 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/check/CMakeLists.txt 2008-11-29 21:18:12 UTC (rev 125)
@@ -3,6 +3,6 @@
# plug-ins
ADD_SUBDIRECTORY(liveness)
ADD_SUBDIRECTORY(order)
-# ADD_SUBDIRECTORY(race)
+ADD_SUBDIRECTORY(race)
# $Id$
Modified: trunk/src/check/pseudocode/CMakeLists.txt
===================================================================
--- trunk/src/check/pseudocode/CMakeLists.txt 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/check/pseudocode/CMakeLists.txt 2008-11-29 21:18:12 UTC (rev 125)
@@ -5,7 +5,10 @@
visual_closure_initiator.h
refnode_finder.cpp
refnode_finder.h
+ utils.cpp
utils.h
+ msc_duplicators.cpp
+ msc_duplicators.h
)
TARGET_LINK_LIBRARIES(scpseudocode
Modified: trunk/src/check/pseudocode/msc_duplicators.cpp
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.cpp 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/check/pseudocode/msc_duplicators.cpp 2008-11-29 21:18:12 UTC (rev 125)
@@ -16,7 +16,7 @@
* $Id$
*/
-#include "check/msc_duplicators.h"
+#include "check/pseudocode/msc_duplicators.h"
#include "data/dfs_instance_events_traverser.h"
const std::string BMSC_DUPLICATOR_TRAVERSING_ATTR = "BDcolor";
Modified: trunk/src/check/pseudocode/msc_duplicators.h
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.h 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/check/pseudocode/msc_duplicators.h 2008-11-29 21:18:12 UTC (rev 125)
@@ -19,6 +19,7 @@
#include "data/msc.h"
#include "data/dfs_area_traverser.h"
#include "data/dfs_bmsc_graph_traverser.h"
+#include "check/pseudocode/export.h"
typedef std::list<Event*> EventPList;
typedef std::list<ReferenceNode*> ReferenceNodePList;
@@ -82,7 +83,7 @@
* Duplicated BMsc's elemenents have set attribute original to the original
* BMsc's elements.
*/
-class BMscDuplicator
+class SCPSEUDOCODE_EXPORT BMscDuplicator
{
protected:
@@ -176,7 +177,7 @@
* of the same kind are transformed into ConnectionNodes referencing original
* EndNodes.
*/
-class BMscGraphDuplicator
+class SCPSEUDOCODE_EXPORT BMscGraphDuplicator
{
public:
Modified: trunk/src/check/pseudocode/refnode_finder.h
===================================================================
--- trunk/src/check/pseudocode/refnode_finder.h 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/check/pseudocode/refnode_finder.h 2008-11-29 21:18:12 UTC (rev 125)
@@ -21,6 +21,7 @@
#include <list>
#include "data/dfs_bmsc_graph_traverser.h"
+#include "check/pseudocode/export.h"
typedef std::list<HMscNode*> HMscNodePList;
typedef counted_ptr<HMscNodePList> HMscNodePListPtr;
@@ -67,7 +68,7 @@
/**
* \brief See method traverse(HMscNode* node) for purpose.
*/
-class ReferenceNodeFinder: public DFSBMscGraphTraverser
+class SCPSEUDOCODE_EXPORT ReferenceNodeFinder: public DFSBMscGraphTraverser
{
public:
Added: trunk/src/check/pseudocode/utils.cpp
===================================================================
--- trunk/src/check/pseudocode/utils.cpp (rev 0)
+++ trunk/src/check/pseudocode/utils.cpp 2008-11-29 21:18:12 UTC (rev 125)
@@ -0,0 +1,63 @@
+#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);
+ }
+}
Modified: trunk/src/check/pseudocode/utils.h
===================================================================
--- trunk/src/check/pseudocode/utils.h 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/check/pseudocode/utils.h 2008-11-29 21:18:12 UTC (rev 125)
@@ -3,7 +3,10 @@
#include <string>
+#include "data/dfs_events_traverser.h"
#include "data/dfs_bmsc_graph_traverser.h"
+#include "data/dfsb_hmsc_traverser.h"
+#include "check/pseudocode/export.h"
typedef std::map<std::string,size_t> StringSizeTMap;
@@ -103,6 +106,68 @@
}
};
+template<class MscElementContainer,class AttributeType>
+void remove_attributes(MscElementContainer& container, const std::string& name)
+{
+ MscElementContainer::const_iterator i;
+ for(i=container.begin();i!=container.end();i++)
+ {
+ (*i)->remove_attribute<AttributeType>(name);
+ }
+}
+
+/**
+ * /brief Eliminates from hmsc nodes which are not reachable from
+ * end nodes of hmsc.
+ */
+void eliminate_noending_nodes(HMscPtr& hmsc);
+
+/**
+ * /brief Marks white nodes by boolean true
+ */
+class SCPSEUDOCODE_EXPORT WhiteNodeMarker: public WhiteNodeFoundListener
+{
+protected:
+
+ HMscNodePList m_modified;
+
+ std::string m_mark;
+
+public:
+
+ WhiteNodeMarker(const std::string& mark="mark");
+
+ ~WhiteNodeMarker();
+
+ void cleanup_attributes();
+
+ void on_white_node_found(HMscNode* n);
+
+ bool& get_mark(HMscNode* n);
+};
+
+/**
+ * /brief Eliminates nodes which are not reachable from end node.
+ *
+ * Currently supports only BMsc graph, please extend implementation if
+ * neccessary.
+ */
+class NoendingNodesEliminator
+{
+protected:
+
+ WhiteNodeMarker m_marker;
+
+ DFSBHMscTraverser m_back_traverser;
+
+public:
+
+ NoendingNodesEliminator();
+
+ void eliminate(HMscPtr& hmsc);
+
+};
+
#endif /* _UTILS_H */
// $Id$
Modified: trunk/src/check/race/CMakeLists.txt
===================================================================
--- trunk/src/check/race/CMakeLists.txt 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/check/race/CMakeLists.txt 2008-11-29 21:18:12 UTC (rev 125)
@@ -5,6 +5,11 @@
footprint.h
)
+TARGET_LINK_LIBRARIES(scrace
+ scmsc
+ scpseudocode
+)
+
INSTALL(TARGETS scrace
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
Modified: trunk/src/check/race/bmsc_race_checker.cpp
===================================================================
--- trunk/src/check/race/bmsc_race_checker.cpp 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/check/race/bmsc_race_checker.cpp 2008-11-29 21:18:12 UTC (rev 125)
@@ -16,7 +16,7 @@
* $Id$
*/
-#include "check/race/bmsc_race_checker.h"
+#include "check/race/race_checker.h"
void MinimalEventsInitiator::on_white_node_found(ReferenceNode* node)
{
Added: trunk/src/check/race/export.h
===================================================================
--- trunk/src/check/race/export.h (rev 0)
+++ trunk/src/check/race/export.h 2008-11-29 21:18:12 UTC (rev 125)
@@ -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 _SCRACE_EXPORT_H
+#define _SCRACE_EXPORT_H
+
+#if defined(_MSC_VER)
+#pragma warning(disable: 4251)
+
+#if defined(scrace_EXPORTS)
+#define SCRACE_EXPORT __declspec(dllexport)
+#else
+#define SCRACE_EXPORT __declspec(dllimport)
+#endif
+
+#else
+#define SCRACE_EXPORT
+#endif
+
+#endif /* _SCRACE_EXPORT_H */
+
+// $Id$
Property changes on: trunk/src/check/race/export.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/check/race/footprint.cpp
===================================================================
--- trunk/src/check/race/footprint.cpp 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/check/race/footprint.cpp 2008-11-29 21:18:12 UTC (rev 125)
@@ -16,7 +16,7 @@
* $Id$
*/
-#include "check/footprint.h"
+#include "check/race/footprint.h"
bool EDInstancesPtrComparator::operator()(const EDInstancesPtr& a, const EDInstancesPtr& b)
{
@@ -44,7 +44,7 @@
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++)
+ for(size_t i=0; i<m_instances.size(); i++)
{
if(m_instances[i]!=di.m_instances[i])
return m_instances[i]-di.m_instances[i];
@@ -129,7 +129,7 @@
Footprint::Footprint(
FootprintPtr previous,
- const InnerNodePList& path,
+ const MscElementPList& path,
const ExtremeEvents& max_events_less,
const ExtremeEvents& max_events_greater)
:ExtremeEvents(previous->get_events_instances().size())
@@ -200,9 +200,9 @@
}
}
-PredecessorNode* Footprint::get_node()
+ReferenceNode* Footprint::get_node()
{
- return m_path.back();
+ return dynamic_cast<ReferenceNode*>(m_path.back());
}
// $Id$
Modified: trunk/src/check/race/footprint.h
===================================================================
--- trunk/src/check/race/footprint.h 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/check/race/footprint.h 2008-11-29 21:18:12 UTC (rev 125)
@@ -32,8 +32,7 @@
typedef std::vector<bool> BoolVector;
typedef counted_ptr<EventDependentInstances> EDInstancesPtr;
typedef counted_ptr<Footprint> FootprintPtr;
-typedef std::list<InnerNode*> InnerNodePList;
-typedef std::list<PredecessorNode*> PredecessorNodePList;
+typedef std::list<MscElement*> MscElementPList;
class EDInstancesPtrComparator
{
@@ -163,7 +162,7 @@
* All remaining members of this m_path are supposed to be
* ConnectionNodes.
*/
- PredecessorNodePList m_path;
+ MscElementPList m_path;
/**
* Previous Footprint which was this one created from.
@@ -194,11 +193,11 @@
*/
Footprint(
FootprintPtr previous,
- const InnerNodePList& path,
+ const MscElementPList& path,
const ExtremeEvents& max_events_less,
const ExtremeEvents& max_events_greater);
- PredecessorNode* get_node();
+ ReferenceNode* get_node();
};
#endif /* _FOOTPRINT_H */
Modified: trunk/src/check/race/race_checker.cpp
===================================================================
--- trunk/src/check/race/race_checker.cpp 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/check/race/race_checker.cpp 2008-11-29 21:18:12 UTC (rev 125)
@@ -20,6 +20,7 @@
#include "check/race/race_checker.h"
+#include "check/pseudocode/msc_duplicators.h"
ExtremeEvents& MinimalEventsInitiator::get_events(BMsc* b)
{
@@ -37,7 +38,7 @@
InstancePtrList::const_iterator i;
for(i=instances.begin();i!=instances.end();i++)
{
- EventPList* events = DFSInstanceEventsTraverser::topology_order((*i).get());
+ EventPListPtr events = DFSInstanceEventsTraverser::topology_order((*i).get());
EventPList::const_iterator e1;
for(e1 = events->begin();e1!=events->end();e1++)
{
@@ -57,7 +58,6 @@
if(e2==events->end())
minimal_events.push_back(*e1);
}
- delete events;
}
/*
For each Event e1 from minimal_events find Instances containing less Events
@@ -112,7 +112,7 @@
InstancePtrList::const_iterator i;
for(i=instances.begin();i!=instances.end();i++)
{
- EventPList* events = DFSInstanceEventsTraverser::topology_order((*i).get());
+ EventPListPtr events = DFSInstanceEventsTraverser::topology_order((*i).get());
EventPList::const_iterator e1 = events->begin();
while(e1!=events->end())
{
@@ -134,7 +134,6 @@
maximal_events.push_back(*e1);
e1++;
}
- delete events;
}
/*
* For any Event e1 from maximal_events find Instances containing any Event e2
@@ -201,47 +200,47 @@
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);
- }
+ //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;
}
@@ -311,12 +310,13 @@
HMscPtr RaceChecker::check(HMscPtr hmsc, ChannelMapperPtr mapper)
{
- //TODO:transform hmsc into BMsc graph
+ //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())
return res;
- //precompute possible things for race checking - e.g. MinP
+ //precompute possible things for race checking - e.g. MinP
prepare_hmsc(hmsc,mapper);
//check hmsc to be race free
return check_hmsc(hmsc,mapper);
@@ -324,9 +324,18 @@
HMscPtr RaceChecker::check_hmsc(HMscPtr hmsc,ChannelMapperPtr mapper)
{
+ HMscPtr error;
FootprintTraverser t(hmsc.get(),mapper.get(),m_instance_marker.get_count(),
&m_min_events_initiator,&m_max_events_initiator);
- t.traverse();
+ try
+ {
+ t.traverse();
+ }
+ catch(RaceInHMscException& e)
+ {
+ error = create_counter_example(e);
+ }
+ return error;
}
/**
@@ -344,24 +353,25 @@
}
catch(RaceInBMscException& e)
{
- counter_example = create_counter_example(traverser.get_reached_nodes(),e.get_example());
+ counter_example = create_counter_example(traverser.get_reached_elements(),e.get_example());
}
return counter_example;
}
-HMscPtr RaceChecker::create_counter_example(const InnerNodePListList& path, BMscPtr example)
+HMscPtr RaceChecker::create_counter_example(const MscElementPListList& path, BMscPtr example)
{
//TODO: create counter example
- return HMscPtr();
+ return HMscPtr(new HMsc());
}
-HMscPtr create_counter_example(RaceInHMscException* e)
+HMscPtr RaceChecker::create_counter_example(RaceInHMscException& e)
{
//TODO: create counter example
- delete e;
- return HMscPtr();
+ return HMscPtr(new HMsc());
}
+////////////////////////////////////////////////////////////////////////////////////
+
FootprintTraverser::FootprintTraverser(
HMsc* hmsc,
ChannelMapper* mapper,
@@ -389,7 +399,7 @@
{
m_footprint = extract_todo();
done.insert(m_footprint);
- traverse(m_footprint->get_node());
+ ReferenceNodeFinder::traverse(m_footprint->get_node());
}
}
@@ -397,7 +407,7 @@
{
check_race(node->get_bmsc().get());
FootprintPtr f = new Footprint(
- m_footprint,this->get_reached_nodes().back(),
+ 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())
@@ -426,7 +436,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_nodes().back());
+ throw new RaceInHMscException(m_footprint,b_event,a_event,get_reached_elements().back());
}
else if(a_event->is_send())
{
@@ -441,7 +451,7 @@
}
if(j==a_instances.size())
{
- throw new RaceInHMscException(m_footprint,b_event,a_event,get_reached_nodes().back());
+ throw new RaceInHMscException(m_footprint,b_event,a_event,get_reached_elements().back());
}
}
}
@@ -450,4 +460,33 @@
}
}
+////////////////////////////////////////////////////////////////////////////////
+
+RaceInHMscException::RaceInHMscException(FootprintPtr& footprint,Event* first, Event* second,
+ const MscElementPList& path_to_second):
+ m_footprint(footprint),m_first(first),
+ m_second(second),m_path_to_second(path_to_second)
+{
+}
+
+FootprintPtr& RaceInHMscException::get_footprint()
+{
+ return m_footprint;
+}
+
+Event* RaceInHMscException::get_first()
+{
+ return m_first;
+}
+
+Event* RaceInHMscException::get_second()
+{
+ return m_second;
+}
+
+MscElementPList& RaceInHMscException::get_path_to_second()
+{
+ return m_path_to_second;
+}
+
// $Id$
Modified: trunk/src/check/race/race_checker.h
===================================================================
--- trunk/src/check/race/race_checker.h 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/check/race/race_checker.h 2008-11-29 21:18:12 UTC (rev 125)
@@ -28,6 +28,7 @@
#include "check/pseudocode/utils.h"
#include "check/pseudocode/refnode_finder.h"
#include "check/race/footprint.h"
+#include "check/race/export.h"
class BMscRaceCheckingListener;
class RaceInBMscException;
@@ -159,7 +160,7 @@
void traverse();
- void traverse(PredecessorNode* node);
+ //void traverse(PredecessorNode* node);
};
@@ -191,7 +192,7 @@
/**
*
*/
- HMscPtr create_counter_example(RaceInHMscException* e);
+ HMscPtr create_counter_example(RaceInHMscException& e);
/**
* Precomputes neccessary things for race checking
@@ -206,7 +207,7 @@
/**
* Creates counter example in case there is any race violating BMsc
*/
- HMscPtr create_counter_example(const InnerNodePListList& path, BMscPtr example);
+ HMscPtr create_counter_example(const MscElementPListList& path, BMscPtr example);
HMscPtr check_hmsc(HMscPtr hmsc, ChannelMapperPtr mapper);
@@ -364,17 +365,22 @@
FootprintPtr m_footprint;
Event* m_first;
Event* m_second;
- InnerNodePList m_path_to_second;
+ MscElementPList m_path_to_second;
public:
- RaceInHMscException(FootprintPtr footprint,Event* first, Event* second,
- const InnerNodePList& path_to_second);
+ RaceInHMscException(FootprintPtr& footprint,Event* first, Event* second,
+ const MscElementPList& path_to_second);
~RaceInHMscException() throw ()
{
}
+
+ FootprintPtr& get_footprint();
+ Event* get_first();
+ Event* get_second();
+ MscElementPList& get_path_to_second();
};
#endif /* _HMSC_RACE_CHECKER_H */
Modified: trunk/src/data/CMakeLists.txt
===================================================================
--- trunk/src/data/CMakeLists.txt 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/data/CMakeLists.txt 2008-11-29 21:18:12 UTC (rev 125)
@@ -3,8 +3,8 @@
msc.cpp
msc.h
msc_visual.h
-# dfs_area_traverser.cpp
-# dfs_area_traverser.h
+ dfs_area_traverser.cpp
+ dfs_area_traverser.h
dfs_events_traverser.cpp
dfs_events_traverser.h
dfs_hmsc_traverser.cpp
Modified: trunk/src/data/dfs_bmsc_graph_traverser.h
===================================================================
--- trunk/src/data/dfs_bmsc_graph_traverser.h 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/data/dfs_bmsc_graph_traverser.h 2008-11-29 21:18:12 UTC (rev 125)
@@ -33,7 +33,7 @@
/**
* Listener of founded white HMscNode
*/
-class WhiteNodeFoundListener
+class SCMSC_EXPORT WhiteNodeFoundListener
{
public:
@@ -48,7 +48,7 @@
/**
* Listener of founded gray HMscNode
*/
-class GrayNodeFoundListener
+class SCMSC_EXPORT GrayNodeFoundListener
{
public:
@@ -63,7 +63,7 @@
/**
* Listener of founded black HMscNode
*/
-class BlackNodeFoundListener
+class SCMSC_EXPORT BlackNodeFoundListener
{
public:
@@ -78,7 +78,7 @@
/**
* Listener of finished HMscNode
*/
-class NodeFinishedListener
+class SCMSC_EXPORT NodeFinishedListener
{
public:
@@ -95,7 +95,7 @@
*
* Extend this listener to process only ReferenceNodes during traversing.
*/
-class WhiteRefNodeFoundListener:public WhiteNodeFoundListener
+class SCMSC_EXPORT WhiteRefNodeFoundListener:public WhiteNodeFoundListener
{
public:
@@ -120,7 +120,7 @@
*
* Extend this listener to process only ReferenceNodes during traversing.
*/
-class GrayRefNodeFoundListener:public GrayNodeFoundListener
+class SCMSC_EXPORT GrayRefNodeFoundListener:public GrayNodeFoundListener
{
public:
@@ -145,7 +145,7 @@
*
* Extend this listener to process only ReferenceNodes during traversing.
*/
-class BlackRefNodeFoundListener:public BlackNodeFoundListener
+class SCMSC_EXPORT BlackRefNodeFoundListener:public BlackNodeFoundListener
{
public:
@@ -170,7 +170,7 @@
*
* Extend this listener to process only ReferenceNodes during traversing.
*/
-class RefNodeFinishedListener:public NodeFinishedListener
+class SCMSC_EXPORT RefNodeFinishedListener:public NodeFinishedListener
{
public:
Modified: trunk/src/data/dfs_events_traverser.h
===================================================================
--- trunk/src/data/dfs_events_traverser.h 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/data/dfs_events_traverser.h 2008-11-29 21:18:12 UTC (rev 125)
@@ -28,7 +28,7 @@
/**
* Listener of founded white Event
*/
-class WhiteEventFoundListener
+class SCMSC_EXPORT WhiteEventFoundListener
{
public:
@@ -43,7 +43,7 @@
/**
* Listener of founded white Event
*/
-class GrayEventFoundListener
+class SCMSC_EXPORT GrayEventFoundListener
{
public:
@@ -58,7 +58,7 @@
/**
* Listener of founded black Event
*/
-class BlackEventFoundListener
+class SCMSC_EXPORT BlackEventFoundListener
{
public:
@@ -73,7 +73,7 @@
/**
* Listener of finished Event
*/
-class EventFinishedListener
+class SCMSC_EXPORT EventFinishedListener
{
public:
Modified: trunk/src/data/dfs_instance_events_traverser.cpp
===================================================================
--- trunk/src/data/dfs_instance_events_traverser.cpp 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/data/dfs_instance_events_traverser.cpp 2008-11-29 21:18:12 UTC (rev 125)
@@ -67,11 +67,11 @@
}
}
-EventPList* DFSInstanceEventsTraverser::topology_order(Instance* i)
+EventPListPtr DFSInstanceEventsTraverser::topology_order(Instance* i)
{
- EventPList* topology = new EventPList;
+ EventPListPtr topology = new EventPList;
DFSInstanceEventsTraverser traverser;
- TopologyOrderListener listener(topology);
+ TopologyOrderListener listener(topology.get());
traverser.add_event_finished_listener(&listener);
traverser.traverse(i);
return topology;
Modified: trunk/src/data/dfs_instance_events_traverser.h
===================================================================
--- trunk/src/data/dfs_instance_events_traverser.h 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/data/dfs_instance_events_traverser.h 2008-11-29 21:18:12 UTC (rev 125)
@@ -21,6 +21,8 @@
#include "data/dfs_events_traverser.h"
+typedef counted_ptr<EventPList> EventPListPtr;
+
/**
* Processes only Instances' Events during depth first search.
*
@@ -37,7 +39,7 @@
using DFSEventsTraverser::traverse;
- static EventPList* topology_order(Instance* i);
+ static EventPListPtr topology_order(Instance* i);
protected:
Modified: trunk/src/data/msc.cpp
===================================================================
--- trunk/src/data/msc.cpp 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/data/msc.cpp 2008-11-29 21:18:12 UTC (rev 125)
@@ -34,6 +34,18 @@
n->get_predecessor()->m_successors.erase(n);
}
+void SuccessorNode::remove_predecessors()
+{
+ NodeRelationPtrSet::iterator i;
+ for(i=m_predecessors.begin();i!=m_predecessors.end();i++)
+ {
+ (*i)->get_predecessor()->remove_successor(*i);
+ }
+ m_predecessors.clear();
+}
+
+////////////////////////////////////////////////////////////////////////////
+
NodeRelationPtr PredecessorNode::add_successor(SuccessorNode* succ)
{
NodeRelationPtr n(new NodeRelation(this,succ));
@@ -48,6 +60,16 @@
n->get_successor()->m_predecessors.erase(n);
}
+void PredecessorNode::remove_successors()
+{
+ NodeRelationPtrSet::iterator i;
+ for(i=m_successors.begin();i!=m_successors.end();i++)
+ {
+ (*i)->get_successor()->remove_predecessor(*i);
+ }
+ m_successors.clear();
+}
+
/////////////////////////////////////////////////////////////////
HMscNode::HMscNode(HMscNode* original):MscElementTmpl<HMscNode>(original),
@@ -72,9 +94,33 @@
node->set_owner(this);
}
-void HMsc::remode_node(HMscNode* node)
+void HMsc::remove_node(HMscNode* node)
{
+ HMscNodePtrSet::iterator i;
+ for(i=m_nodes.begin();i!=m_nodes.end();i++)
+ {
+ if((*i).get()==node)
+ {
+ remove_node(*i);
+ break;
+ }
+ }
}
+
+void HMsc::remove_node(HMscNodePtr node)
+{
+ PredecessorNode* pred = dynamic_cast<PredecessorNode*>(node.get());
+ if(pred)
+ {
+ pred->remove_successors();
+ }
+ SuccessorNode* suc = dynamic_cast<SuccessorNode*>(node.get());
+ if(suc)
+ {
+ suc->remove_predecessors();
+ }
+ m_nodes.erase(node);
+}
////////////////////////////////////
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2008-11-29 11:22:31 UTC (rev 124)
+++ trunk/src/data/msc.h 2008-11-29 21:18:12 UTC (rev 125)
@@ -267,7 +267,7 @@
};
template <class T>
-class SCMSC_EXPORT MscElementTmpl : public MscElement
+class /*SCMSC_EXPORT*/ MscElementTmpl : public MscElement
{
protected:
@@ -539,6 +539,8 @@
NodeRelationPtr add_predecessor(PredecessorNode* pred);
void remove_predecessor(NodeRelationPtr& n);
+
+ void remove_predecessors();
/**
* Returns true iff node has any successors
@@ -588,6 +590,8 @@
*/
void remove_successor(NodeRelationPtr& n);
+ void remove_successors();
+
/**
* Returns true iff node has any successors
*/
@@ -693,12 +697,9 @@
void add_node(HMscNodePtr node);
- void remode_node(HMscNode* node);
+ void remove_node(HMscNode* node);
- void remove_node(HMscNodePtr node)
- {
- m_nodes.erase(node);
- }
+ void remove_node(HMscNodePtr node);
HMscNodePtr find_ptr(HMscNode* node)
{
@@ -1124,13 +1125,6 @@
typedef counted_ptr<IncompleteMessage> IncompleteMessagePtr;
-typedef enum
-{
- BEFORE,
- AFTER
-}
-EventPosition;
-
/**
* \brief Event which occurs in EventArea.
*/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|