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. |