124 lines
3.1 KiB
C++
124 lines
3.1 KiB
C++
#include <thread/msgqueue.hpp>
|
|
|
|
WORD MessageQueue::postMessage(ThreadMessage &someThreadMessage)
|
|
{
|
|
mMutexSemaphore.requestMutex();
|
|
mNamedEvent.resetEvent();
|
|
if(isQueueLocked()){mMutexSemaphore.releaseMutex();return FALSE;}
|
|
putQueueMessage(someThreadMessage);
|
|
mNamedEvent.setEvent();
|
|
mMutexSemaphore.releaseMutex();
|
|
return TRUE;
|
|
}
|
|
|
|
WORD MessageQueue::itemsInQueue(void)
|
|
{
|
|
WORD queueMessages;
|
|
|
|
mMutexSemaphore.requestMutex();
|
|
queueMessages=mMessageQueueHigh.size();
|
|
queueMessages+=mMessageQueueNormal.size();
|
|
queueMessages+=mMessageQueueLow.size();
|
|
mMutexSemaphore.releaseMutex();
|
|
return queueMessages;
|
|
}
|
|
|
|
WORD MessageQueue::waitMessage(ThreadMessage &someThreadMessage)
|
|
{
|
|
mNamedEvent.waitEvent(INFINITE,mIsAlertable);
|
|
mMutexSemaphore.requestMutex();
|
|
if(!getQueueMessage(someThreadMessage))
|
|
{
|
|
mMutexSemaphore.releaseMutex();
|
|
mNamedEvent.resetEvent();
|
|
return FALSE;
|
|
}
|
|
if(isQueueEmpty())mNamedEvent.resetEvent();
|
|
mMutexSemaphore.releaseMutex();
|
|
return TRUE;
|
|
}
|
|
|
|
WORD MessageQueue::peekMessage(ThreadMessage &someThreadMessage)
|
|
{
|
|
WORD returnCode;
|
|
mMutexSemaphore.requestMutex();
|
|
returnCode=peekQueueMessage(someThreadMessage);
|
|
mMutexSemaphore.releaseMutex();
|
|
return returnCode;
|
|
}
|
|
|
|
WORD MessageQueue::putQueueMessage(ThreadMessage &someThreadMessage)
|
|
{
|
|
if(ThreadMessage::PriorityNormal==someThreadMessage.priority())
|
|
mMessageQueueNormal.insert(&someThreadMessage);
|
|
else if(ThreadMessage::PriorityHigh==someThreadMessage.priority())
|
|
mMessageQueueHigh.insert(&someThreadMessage);
|
|
else mMessageQueueLow.insert(&someThreadMessage);
|
|
return TRUE;
|
|
}
|
|
|
|
WORD MessageQueue::getQueueMessage(ThreadMessage &someThreadMessage)
|
|
{
|
|
if(isQueueEmpty())return FALSE;
|
|
|
|
if(mMessageQueueHigh.size())
|
|
{
|
|
someThreadMessage=mMessageQueueHigh[0];
|
|
mMessageQueueHigh.remove(0L);
|
|
}
|
|
else if(mMessageQueueNormal.size())
|
|
{
|
|
someThreadMessage=mMessageQueueNormal[0];
|
|
mMessageQueueNormal.remove(0L);
|
|
}
|
|
else
|
|
{
|
|
someThreadMessage=mMessageQueueLow[0];
|
|
mMessageQueueLow.remove(0L);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
WORD MessageQueue::peekQueueMessage(ThreadMessage &someThreadMessage)
|
|
{
|
|
if(isQueueEmpty())return FALSE;
|
|
if(mMessageQueueHigh.size())someThreadMessage=mMessageQueueHigh[mMessageQueueHigh.size()-1];
|
|
else if(mMessageQueueNormal.size())someThreadMessage=mMessageQueueNormal[mMessageQueueNormal.size()-1];
|
|
else if(mMessageQueueLow.size())someThreadMessage=mMessageQueueLow[mMessageQueueLow.size()-1];
|
|
else return FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
WORD MessageQueue::isQueueEmpty(void)const
|
|
{
|
|
WORD queueMessages;
|
|
|
|
queueMessages=mMessageQueueHigh.size();
|
|
queueMessages+=mMessageQueueNormal.size();
|
|
queueMessages+=mMessageQueueLow.size();
|
|
return (0==queueMessages);
|
|
}
|
|
|
|
void MessageQueue::shutdownQueue(void)
|
|
{
|
|
mMutexSemaphore.requestMutex();
|
|
mMessageQueueHigh.remove();
|
|
mMessageQueueNormal.remove();
|
|
mMessageQueueLow.remove();
|
|
mQueueStatus=QueueLocked;
|
|
mMutexSemaphore.releaseMutex();
|
|
mNamedEvent.setEvent();
|
|
}
|
|
|
|
void MessageQueue::restartQueue(void)
|
|
{
|
|
mMutexSemaphore.requestMutex();
|
|
mMessageQueueHigh.remove();
|
|
mMessageQueueNormal.remove();
|
|
mMessageQueueLow.remove();
|
|
mQueueStatus=QueueOpen;
|
|
mMutexSemaphore.releaseMutex();
|
|
mNamedEvent.setEvent();
|
|
}
|
|
|