Beispiel #1
0
//----------------------------------------------------------------------------
//
//----------------------------------------------------------------------------
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();
    }
}