|
From: <ba...@us...> - 2008-11-09 14:10:18
|
Revision: 114
http://scstudio.svn.sourceforge.net/scstudio/?rev=114&view=rev
Author: babicaj
Date: 2008-11-09 14:10:12 +0000 (Sun, 09 Nov 2008)
Log Message:
-----------
Previous version didn't support positioning of incomplete message. It was necessary to change ChannelMapper interface to reflect these changes.
Modified Paths:
--------------
trunk/src/check/checker.h
trunk/src/check/deadlock_checker.cpp
trunk/src/check/deadlock_checker.h
trunk/src/data/msc.cpp
trunk/src/data/msc.h
trunk/src/data/msc_visual.h
Modified: trunk/src/check/checker.h
===================================================================
--- trunk/src/check/checker.h 2008-10-19 15:53:21 UTC (rev 113)
+++ trunk/src/check/checker.h 2008-11-09 14:10:12 UTC (rev 114)
@@ -139,24 +139,11 @@
}
/**
- * Returns true if m1 belongs to the same channel as m2.
- */
- virtual bool same_channel(const MscMessagePtr& m1, const MscMessagePtr& m2) const=0;
-
- /**
* Returns true if e1's message belongs to the same channel as e2's message.
*/
- bool same_channel(const Event* e1, const Event* e2) const
- {
- return same_channel(e1->get_message(),e2->get_message());
- }
+ virtual bool same_channel(const Event* e1, const Event* e2) const=0;
/**
- * Returns index of channel which message belongs into.
- */
- virtual size_t channel(const MscMessagePtr& m)=0;
-
- /**
* Returns index of channel which event's message belongs into.
*
* @warning event must have set message
@@ -211,9 +198,9 @@
/**
* Returns true if m1 belongs to the same channel as m2.
*/
- bool same_channel(const MscMessagePtr& m1, const MscMessagePtr& m2) const
+ bool same_channel(const Event* e1, const Event* e2) const
{
- return MessagePart::same_channel(m1,m2);
+ return MessagePart::same_channel(e1,e2);
}
/**
@@ -221,15 +208,7 @@
*/
size_t channel(const Event* event)
{
- return channel(event->get_message());
- }
-
- /**
- * Returns index of channel which message belongs into.
- */
- size_t channel(const MscMessagePtr& m)
- {
- MessagePart part(m);
+ MessagePart part(event);
typename ChannelMap::iterator i = m_channels.find(part);
if(i==m_channels.end())
{
@@ -292,10 +271,10 @@
public:
- SRMessagePart(MscMessagePtr m)
+ SRMessagePart(const Event* e)
{
- m_sender = m->get_sender()->get_label();
- m_receiver = m->get_receiver()->get_label();
+ m_sender = e->get_sender_label();
+ m_receiver = e->get_receiver_label();
}
/**
@@ -312,10 +291,14 @@
* Channels of message m1 and m2 are same if and only if m1 has got same
* sender and receiver as m2.
*/
- static bool same_channel(const MscMessagePtr& m1, const MscMessagePtr& m2)
+ static bool same_channel(const Event* e1, const Event* e2)
{
- return m1->get_sender()==m2->get_sender() &&
- m1->get_receiver()==m2->get_receiver();
+ 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();
+ }
+ return false;
}
};
@@ -338,11 +321,11 @@
public:
- SRLMessagePart(MscMessagePtr m)
+ SRLMessagePart(const Event* e)
{
- m_sender = m->get_sender()->get_label();
- m_receiver = m->get_receiver()->get_label();
- m_label = m->get_label();
+ 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
@@ -354,14 +337,14 @@
}
/**
- * Channels of message m1 and m2 are same if and only if m1 has got same
- * sender, receiver and label as m2.
+ * Channels of message of e1 and e2 are same if and only if e1 has got same
+ * sender, receiver and label as e2.
*/
- static bool same_channel(const MscMessagePtr& m1,const MscMessagePtr& m2)
+ static bool same_channel(const Event* e1,const Event* e2)
{
- return m1->get_sender()->get_label()==m2->get_sender()->get_label() &&
- m1->get_receiver()->get_label()==m2->get_receiver()->get_label() &&
- m1->get_label()==m2->get_label();
+ return e1->get_sender_label()==e2->get_sender_label() &&
+ e1->get_receiver_label()==e2->get_receiver_label() &&
+ e1->get_message()->get_label()==e2->get_message()->get_label();
}
};
Modified: trunk/src/check/deadlock_checker.cpp
===================================================================
--- trunk/src/check/deadlock_checker.cpp 2008-10-19 15:53:21 UTC (rev 113)
+++ trunk/src/check/deadlock_checker.cpp 2008-11-09 14:10:12 UTC (rev 114)
@@ -68,7 +68,7 @@
get_depth(node) = m_current_depth;
if (dynamic_cast<ReferenceNode*> (node))
{
- m_reference_depth.push(m_current_depth);
+ m_depths.push(m_current_depth);
}
//set deadlock free attribute
bool& deadlock_free = get_deadlock_free(node);
@@ -88,19 +88,19 @@
throw DeadlockException();
}
//this node is no more on traversing stack
- m_reference_depth.pop();
+ m_depths.pop();
}
m_current_depth--;
}
void DeadlockListener::on_gray_node_found(HMscNode* node)
{
- //m_reference_depth can be empty
- if (!m_reference_depth.empty())
+ //m_depths can be empty
+ if (!m_depths.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();
+ size_t top_reference_depth = m_depths.top();
//there is some ReferenceNode on path from node to previous white HMscNode
if (top_reference_depth >= m_current_depth)
{
Modified: trunk/src/check/deadlock_checker.h
===================================================================
--- trunk/src/check/deadlock_checker.h 2008-10-19 15:53:21 UTC (rev 113)
+++ trunk/src/check/deadlock_checker.h 2008-11-09 14:10:12 UTC (rev 114)
@@ -70,7 +70,7 @@
/**
* Depths of founded ReferenceNodes
*/
- std::stack<size_t> m_reference_depth;
+ std::stack<size_t> m_depths;
std::string m_deadlock_free_attribute;
Modified: trunk/src/data/msc.cpp
===================================================================
--- trunk/src/data/msc.cpp 2008-10-19 15:53:21 UTC (rev 113)
+++ trunk/src/data/msc.cpp 2008-11-09 14:10:12 UTC (rev 114)
@@ -102,3 +102,13 @@
{
return dynamic_cast<CoregionArea*>(m_area);
}
+
+Instance* CompleteMessage::get_sender() const
+{
+ return m_send_event->get_instance();
+}
+
+Instance* CompleteMessage::get_receiver() const
+{
+ return m_receive_event->get_instance();
+}
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2008-10-19 15:53:21 UTC (rev 113)
+++ trunk/src/data/msc.h 2008-11-09 14:10:12 UTC (rev 114)
@@ -943,85 +943,162 @@
*/
std::string m_label;
+public:
+
/**
+ * @param sender - sending instance
+ * @param receiver - receiving instance
+ * @param label - label of message
+ */
+ MscMessage(const std::string& label="",MscMessage* original=NULL):
+ MscElementTmpl<MscMessage>(original),m_label(label)
+ {
+ }
+
+ virtual ~MscMessage()
+ {
+
+ }
+
+ /**
+ * Getter for m_label.
+ */
+ const std::string& get_label() const
+ {
+ return m_label;
+ }
+
+};
+
+class CompleteMessage:public MscMessage
+{
+
+ /**
* Sender of message.
*
* @warning counted_ptr mustn't be used because of possible cyclic dependency
*/
- Instance* m_sender;
+ Event* m_send_event;
/**
* Receiver of message.
*
* @warning counted_ptr mustn't be used because of possible cyclic dependency
*/
- Instance* m_receiver;
-
+ Event* m_receive_event;
+
public:
/**
- * @param sender - sending instance
- * @param receiver - receiving instance
+ * @param sender - sending event
+ * @param receiver - receiving event
* @param label - label of message
*/
- MscMessage(Instance* sender, Instance* receiver, const std::string& label)
+ CompleteMessage(const std::string& label):
+ MscMessage(label),m_send_event(NULL),m_receive_event(NULL)
{
- m_sender = sender;
- m_receiver = receiver;
- m_label = label;
}
/**
- * @param sender - sending instance
- * @param receiver - receiving instance
- * @param original - original MscMessage
+ * Retrieves instance of m_send_event
*/
- MscMessage(Instance* sender, Instance* receiver, MscMessage* original):
- MscElementTmpl<MscMessage>(original)
- {
- m_sender = sender;
- m_receiver = receiver;
- m_label = original->m_label;
- }
-
- virtual ~MscMessage()
- {
-
- }
-
+ Instance* get_sender() const;
+
/**
* Getter for m_sender.
*/
- Instance* get_sender() const {return m_sender;}
+ Event* get_send_event() const
+ {
+ return m_send_event;
+ }
/**
* Setter for m_sender
*/
- void set_sender(Instance* sender)
+ void set_send_event(Event* sender)
{
- m_sender = sender;
+ m_send_event = sender;
}
/**
- * Getter for m_receiver.
+ * Retrieves instance of m_receive_event
*/
- Instance* get_receiver() const {return m_receiver;}
-
+ Instance* get_receiver() const;
+
/**
* Getter for m_receiver.
*/
- void set_receiver(Instance* receiver)
+ Event* get_receive_event() const
{
- m_receiver = receiver;
+ return m_receive_event;
}
/**
- * Getter for m_label.
+ * Getter for m_receiver.
*/
- const std::string& get_label() const {return m_label;}
+ void set_receive_event(Event* receiver)
+ {
+ m_receive_event = receiver;
+ }
+};
+typedef counted_ptr<CompleteMessage> CompleteMessagePtr;
+
+typedef enum
+{
+ LOST,
+ FOUND
+} IncompleteMsgType;
+
+class IncompleteMessage: public MscMessage
+{
+
+protected:
+
+ Point m_dot_position;
+
+ std::string m_instance_label;
+
+ IncompleteMsgType m_type;
+
+public:
+
+ IncompleteMessage(const IncompleteMsgType& type=LOST, const std::string& label="",
+ const std::string& instance_label="", IncompleteMessage* original= NULL,
+ const Point& dot_position=Point()):
+ MscMessage(label,original),m_instance_label(instance_label),m_type(type),
+ m_dot_position(dot_position)
+ {
+ }
+
+ Point& get_dot_position()
+ {
+ return m_dot_position;
+ }
+
+ const std::string& get_instance_label() const
+ {
+ return m_instance_label;
+ }
+
+ const IncompleteMsgType& get_type() const
+ {
+ return m_type;
+ }
+
+ bool is_lost() const
+ {
+ return m_type==LOST;
+ }
+
+ bool is_found() const
+ {
+ return m_type==FOUND;
+ }
};
+typedef counted_ptr<IncompleteMessage> IncompleteMessagePtr;
+
/**
* \brief Event which occurs in EventArea.
*/
@@ -1031,53 +1108,46 @@
protected:
Coordinate m_y;
-
- PositionOnAxis m_position;
/**
* Label of message whose this is send or receive event.
*/
MscMessagePtr m_message;
-
- /**
- * Opposite (send/receive) event of this event. Undefined in case of lost or
- * found message.
- *
- * @warning counted_ptr mustn't be used because of possible cyclic dependency
- */
- Event* m_matching_event;
/**
- * @param message - message which is sent from this Event or is received
* @param original - original Event of this Event
*/
- Event(MscMessagePtr message, Event* original=NULL)
+ Event(Event* original=NULL)
:MscElementTmpl<Event>(original)
{
- m_message = message;
}
-
- /**
- * @param message - matching Event of this Event (send or receive Event)
- * @param original - original Event of this Event
- *
- * It is supposed parameter matching to have set message which will be same
- * for this Event.
- */
- Event(Event* matching, Event* original=NULL)
- :MscElementTmpl<Event>(original)
+
+ CompleteMessage* get_complete() const
{
- m_message = matching->m_message;
- m_matching_event = matching;
- matching->m_matching_event = this;
+ return dynamic_cast<CompleteMessage*>(m_message.get());
}
+
+ IncompleteMessage* get_incomplete() const
+ {
+ return dynamic_cast<IncompleteMessage*>(m_message.get());
+ }
public:
virtual ~Event()
{
if(is_matched())
- m_matching_event->set_matching_event(NULL);
+ {
+ CompleteMessage* complete = get_complete();
+ if(is_send())
+ {
+ complete->set_send_event(NULL);
+ }
+ else
+ {
+ complete->set_receive_event(NULL);
+ }
+ }
}
/**
@@ -1087,51 +1157,134 @@
{
return m_message;
}
-
+
/**
- * Getter for m_matching_event.
+ * Return instance of CompleteMessage in case m_message contains the instance,
+ * undefined NULL otherwise
*/
- Event* get_matching_event() const
+ CompleteMessagePtr get_complete_message()
{
- return m_matching_event;
+ try
+ {
+ CompleteMessagePtr complete = m_message;
+ return complete;
+ }
+ catch(std::bad_cast bc)
+ {
+ return CompleteMessagePtr();
+ }
}
+
+ /**
+ * Return instance of CompleteMessage in case m_message contains the instance,
+ * undefined NULL otherwise
+ */
+ IncompleteMessagePtr get_incomplete_message()
+ {
+ try
+ {
+ IncompleteMessagePtr incomplete = m_message;
+ return incomplete;
+ }
+ catch(std::bad_cast bc)
+ {
+ return IncompleteMessagePtr();
+ }
+ }
/**
- * Setter for m_matching_event.
+ * Retrives matching event of this Event in case this Event has complete
+ * message, otherwise it returns NULL
*/
- void set_matching_event(Event* matching)
+ Event* get_matching_event()
{
- m_matching_event = matching;
+ if(is_matched())
+ {
+ CompleteMessage* complete = get_complete();
+ return (is_send()?complete->get_receive_event():complete->get_send_event());
+ }
+ return NULL;
}
/**
* True iff is sending event.
*/
- bool is_send()
+ bool is_send() const
{
- return get_instance()==m_message->get_sender();
+ if(is_matched())
+ {
+ CompleteMessage* complete = get_complete();
+ return complete->get_send_event()==this;
+ }
+ else
+ {
+ IncompleteMessage* incomplete = get_incomplete();
+ return incomplete->is_lost();
+ }
}
/**
* True iff is receiving event.
*/
- bool is_receive()
+ bool is_receive() const
{
- return get_instance()==m_message->get_receiver();
+ return !is_send();
}
/**
- * Returns true if m_matching_event is set.
+ * Returns true if m_message is complete.
*/
- bool is_matched()
+ bool is_matched() const
{
- return m_matching_event!=NULL;
+ return get_complete();
}
/**
* Returns instance which this event occures at
*/
- virtual Instance* get_instance()=0;
+ virtual Instance* get_instance() const=0;
+
+ const std::string& get_receiver_label() const
+ {
+ if(is_matched())
+ {
+ CompleteMessage* complete = get_complete();
+ return complete->get_receiver()->get_label();
+ }
+ else
+ {
+ if(is_send())
+ {
+ IncompleteMessage* incomplete = get_incomplete();
+ return incomplete->get_instance_label();
+ }
+ else
+ {
+ return get_instance()->get_label();
+ }
+ }
+ }
+
+ const std::string& get_sender_label() const
+ {
+ if(is_matched())
+ {
+ CompleteMessage* complete = get_complete();
+ return complete->get_sender()->get_label();
+ }
+ else
+ {
+ if(is_receive())
+ {
+ IncompleteMessage* incomplete = get_incomplete();
+ return incomplete->get_instance_label();
+ }
+ else
+ {
+ return get_instance()->get_label();
+ }
+ }
+ }
};
@@ -1149,25 +1302,12 @@
TArea* m_area;
/**
- * @param message - message which is sent from this Event or is received
* @param original - original Event of this Event
*/
- EventTmpl(MscMessagePtr message, Event* original=NULL)
- :Event(message,original)
+ EventTmpl(Event* original=NULL)
+ :Event(original)
{
}
-
- /**
- * @param message - matching Event of this Event (send or receive Event)
- * @param original - original Event of this Event
- *
- * It is supposed parameter matching to have set message which will be same
- * for this Event.
- */
- EventTmpl(Event* matching, Event* original=NULL)
- :Event(matching,original)
- {
- }
public:
@@ -1216,21 +1356,12 @@
/**
* See Event constructor for details
*/
- StrictEvent(MscMessagePtr message, Event* original=NULL)
- :EventTmpl<StrictOrderArea>(message,original)
+ StrictEvent(Event* original=NULL)
+ :EventTmpl<StrictOrderArea>(original)
{
m_predecessor = NULL;
}
- /**
- * See Event constructor for details
- */
- StrictEvent(Event* matching_event, Event* original=NULL)
- :EventTmpl<StrictOrderArea>(matching_event,original)
- {
- m_predecessor = NULL;
- }
-
virtual ~StrictEvent()
{
@@ -1347,20 +1478,11 @@
/**
* See Event constructor for details
*/
- CoregionEvent(MscMessagePtr message, Event* original=NULL)
- :EventTmpl<CoregionArea>(message,original)
+ CoregionEvent(Event* original=NULL)
+ :EventTmpl<CoregionArea>(original)
{
-
}
- /**
- * See Event constructor for details
- */
- CoregionEvent(Event* matching)
- :EventTmpl<CoregionArea>(matching)
- {
- }
-
virtual ~CoregionEvent();
/**
Modified: trunk/src/data/msc_visual.h
===================================================================
--- trunk/src/data/msc_visual.h 2008-10-19 15:53:21 UTC (rev 113)
+++ trunk/src/data/msc_visual.h 2008-11-09 14:10:12 UTC (rev 114)
@@ -33,12 +33,6 @@
COLUMN
} InstanceAxisForm;
-typedef enum
-{
- LEFT,
- RIGHT
-} PositionOnAxis;
-
class Point
{
private:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|