70 lines
1.6 KiB
C++
70 lines
1.6 KiB
C++
#include "msgqueue.h"
|
|
|
|
// Allocate a message stack
|
|
MESSAGE_STACK* MsgAllocStack()
|
|
{
|
|
auto stack = new MESSAGE_STACK;
|
|
|
|
stack->WaitingCalls = 0;
|
|
stack->Destroy = false;
|
|
|
|
return stack;
|
|
}
|
|
|
|
// Free a message stack
|
|
void MsgFreeStack(MESSAGE_STACK* Stack)
|
|
{
|
|
ASSERT_NONNULL(Stack);
|
|
|
|
// Update termination variable
|
|
Stack->Destroy = true;
|
|
|
|
// Notify each thread
|
|
for(int i = 0; i < Stack->WaitingCalls + 1; i++) //TODO: found crash here on exit
|
|
{
|
|
MESSAGE newMessage;
|
|
Stack->msgs.enqueue(newMessage);
|
|
}
|
|
|
|
// Delete allocated structure
|
|
delete Stack;
|
|
}
|
|
|
|
// Add a message to the stack
|
|
bool MsgSend(MESSAGE_STACK* Stack, int Msg, duint Param1, duint Param2)
|
|
{
|
|
if(Stack->Destroy)
|
|
return false;
|
|
|
|
MESSAGE newMessage;
|
|
newMessage.msg = Msg;
|
|
newMessage.param1 = Param1;
|
|
newMessage.param2 = Param2;
|
|
|
|
// Asynchronous send
|
|
asend(Stack->msgs, newMessage);
|
|
return true;
|
|
}
|
|
|
|
// Get a message from the stack (will return false when there are no messages)
|
|
bool MsgGet(MESSAGE_STACK* Stack, MESSAGE* Msg)
|
|
{
|
|
if(Stack->Destroy)
|
|
return false;
|
|
|
|
// Don't increment the wait count because this does not wait
|
|
return try_receive(Stack->msgs, *Msg);
|
|
}
|
|
|
|
// Wait for a message on the specified stack
|
|
void MsgWait(MESSAGE_STACK* Stack, MESSAGE* Msg)
|
|
{
|
|
if(Stack->Destroy)
|
|
return;
|
|
|
|
// Increment/decrement wait count
|
|
InterlockedIncrement((volatile long*)&Stack->WaitingCalls);
|
|
*Msg = Stack->msgs.dequeue();
|
|
InterlockedDecrement((volatile long*)&Stack->WaitingCalls);
|
|
}
|