1
0
Fork 0
x64dbg/src/dbg/msgqueue.cpp

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);
}