|
From: <cn...@us...> - 2009-11-13 07:43:20
|
Revision: 615
http://hgengine.svn.sourceforge.net/hgengine/?rev=615&view=rev
Author: cnlohr
Date: 2009-11-13 07:43:08 +0000 (Fri, 13 Nov 2009)
Log Message:
-----------
Add BroadcastMessage for immediate sending AND Modify the MESSAGEMAN macro to include Instance().
Modified Paths:
--------------
Mercury2/src/Mercury2.cpp
Mercury2/src/MercuryMessageManager.cpp
Mercury2/src/MercuryMessageManager.h
Modified: Mercury2/src/Mercury2.cpp
===================================================================
--- Mercury2/src/Mercury2.cpp 2009-11-13 07:40:16 UTC (rev 614)
+++ Mercury2/src/Mercury2.cpp 2009-11-13 07:43:08 UTC (rev 615)
@@ -130,7 +130,7 @@
do
{
timer.Touch();
- MESSAGEMAN::GetInstance().PumpMessages( timer.MicrosecondsSinceInit() );
+ MESSAGEMAN.PumpMessages( timer.MicrosecondsSinceInit() );
root->RecursiveUpdate( timer.Age() ); //comment to use threads
Modified: Mercury2/src/MercuryMessageManager.cpp
===================================================================
--- Mercury2/src/MercuryMessageManager.cpp 2009-11-13 07:40:16 UTC (rev 614)
+++ Mercury2/src/MercuryMessageManager.cpp 2009-11-13 07:43:08 UTC (rev 615)
@@ -46,6 +46,36 @@
}
}
+void MercuryMessageManager::BroadcastMessage( const MString & message, MessageData * data )
+{
+ std::list< MessagePair > recipients;
+ {
+ //copy list first (quick lock)
+ MSemaphoreLock lock(&m_recipientLock);
+ std::list< MessagePair > * r = m_messageRecipients.get( message );
+ if ( r ) recipients = *r;
+ }
+
+ if ( !recipients.empty() )
+ {
+ std::list< MessagePair >::iterator recipient = recipients.begin();
+ for (; recipient != recipients.end(); ++recipient)
+ {
+ MessagePair & mp = *recipient;
+ //Okay, the following lines look horrible. Reason is we're using
+ //a horrible horrible c++ construct from the anals of pointerdom.
+ //The idea is we're using a delegate. If we have a delegate, use it.
+ //If you are receiving a delegate, you do not need the message name.
+ //Otherwise, send a standard message through the old interface.
+ if( mp.d )
+ (mp.h->*(mp.d))( *(data) );
+ else
+ mp.h->HandleMessage(message, *(data) );
+ }
+ }
+
+}
+
void MercuryMessageManager::UnRegisterForMessage(const MString& message, MessageHandler* ptr)
{
MSemaphoreLock lock(&m_recipientLock);
Modified: Mercury2/src/MercuryMessageManager.h
===================================================================
--- Mercury2/src/MercuryMessageManager.h 2009-11-13 07:40:16 UTC (rev 614)
+++ Mercury2/src/MercuryMessageManager.h 2009-11-13 07:43:08 UTC (rev 615)
@@ -35,7 +35,13 @@
{
public:
MercuryMessageManager() : m_messageQueue( MessageHolder::Compare ) { }
+
+ ///Dispatch message whenever the message manager gets control again; delay after now.
void PostMessage(const MString& message, MessageData* data, float delay);
+
+ ///Immediately dispatch message
+ void BroadcastMessage( const MString & message, MessageData * data );
+
void PumpMessages(const uint64_t& currTime);
void RegisterForMessage(const MString& message, MessageHandler* ptr, Delegate d = 0 );
@@ -65,11 +71,11 @@
static InstanceCounter<MercuryMessageManager> MMcounter("MessageManager");
-#define MESSAGEMAN MercuryMessageManager
-#define REGISTER_MESSAGE_WITH_DELEGATE(x, d) MESSAGEMAN::GetInstance().RegisterForMessage(x, this, (Delegate)d)
-#define REGISTER_FOR_MESSAGE(x) MESSAGEMAN::GetInstance().RegisterForMessage(x, this)
-#define UNREGISTER_FOR_MESSAGE(x) MESSAGEMAN::GetInstance().UnRegisterForMessage(x, this)
-#define POST_MESSAGE(x,data,delay) MESSAGEMAN::GetInstance().PostMessage(x, data, delay)
+#define MESSAGEMAN MercuryMessageManager::GetInstance()
+#define REGISTER_MESSAGE_WITH_DELEGATE(x, d) MESSAGEMAN.RegisterForMessage(x, this, (Delegate)d)
+#define REGISTER_FOR_MESSAGE(x) MESSAGEMAN.RegisterForMessage(x, this)
+#define UNREGISTER_FOR_MESSAGE(x) MESSAGEMAN.UnRegisterForMessage(x, this)
+#define POST_MESSAGE(x,data,delay) MESSAGEMAN.PostMessage(x, data, delay)
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|