//---------------------------------------------------------------------------- // //---------------------------------------------------------------------------- void MsgMgr::threadMailboxUpdate() { bool bCallNotificationCallback = false; bool bContinue = true; while(bContinue) { bContinue = false; ChannelId msgChannelFrom = InvalidChannelId; MsgChannel * channel = mChannelList->getHeadChannelList(); while(channel) { bool signalNewMessages = false; ListenedChannel * listened = channel->getHeadListenedChannel(); while(listened) { if(listened->mListener->mCurrentMsg) { int numMsgs = 0; StoredMsg * msg = listened->mListener->mCurrentMsg->getNext(); while(msg) { StoredMsg * newMsg = channel->createStoredMsg(); newMsg->copyFrom(*msg); channel->linkStoredMsg(newMsg); signalNewMessages = true; listened->mListener->mCurrentMsg = listened->mListener->mCurrentMsg->getNext(); numMsgs++; if(numMsgs > NumMaxMsgsDispatched) // avoid one sender collapse the msg system { bContinue = true; msg = NULL; } else { msg = listened->mListener->mCurrentMsg->getNext(); } } } listened = listened->getNext(); } if(signalNewMessages) { ChannelListener * listener = channel->getHeadListenerChannel(); while(listener) { if(listener->mEventMessagesAvailable) { listener->mEventMessagesAvailable->signal(); } listener = listener->getNext(); } bCallNotificationCallback = true; } channel = channel->getNext(); } threadPurgeMessages(); // zzz pending : add min time between purges? } if(bCallNotificationCallback && mNotificationCallback) { mNotificationCallback->msgMgrNotification(); } }