diff --git a/Source/Utility/Async/NAsyncWorkThread.cpp b/Source/Utility/Async/NAsyncWorkThread.cpp index c71b9745..1d5c0f20 100644 --- a/Source/Utility/Async/NAsyncWorkThread.cpp +++ b/Source/Utility/Async/NAsyncWorkThread.cpp @@ -3,7 +3,8 @@ // OFFSET: 0x00732980 // FUNCTION: fn_07576 NAsyncWorkThread::NAsyncWorkThread(NAsyncWorkRequestQueue* requests, NAsyncWorkResponseQueue* responses) - : NThread("AsyncWorkThread"), m_registered(false), m_requests(requests), m_responses(responses) { + : NThread("AsyncWorkThread"), m_requests(requests), m_responses(responses) { + this->m_registered = false; g_messageMgr->Register(this->m_objectId, static_cast(this)); this->m_registered = true; } @@ -45,10 +46,8 @@ unsigned NAsyncWorkThread::Run() { HANDLE handles[2] = {this->m_messages.m_semaphore, this->m_requests->m_semaphore}; DWORD ready = WaitForMultipleObjects(2, handles, FALSE, INFINITE); if (ready == WAIT_OBJECT_0) { - NMessage message; - this->m_messages.Pop(&message); - - if (message.valid && message.argumentLow == 0x50000) { + NMessage message = this->m_messages.Pop(); + if (message.valid == true && message.argumentLow == 0x50000) { return 0; } } else if (ready == WAIT_OBJECT_0 + 1) { diff --git a/Source/Utility/Async/NMessageQueue.cpp b/Source/Utility/Async/NMessageQueue.cpp index 2ae77c67..496523e3 100644 --- a/Source/Utility/Async/NMessageQueue.cpp +++ b/Source/Utility/Async/NMessageQueue.cpp @@ -25,23 +25,15 @@ NMessageQueue::~NMessageQueue() { // OFFSET: 0x00736590 // FUNCTION: fn_07622 -NMessage* NMessageQueue::Pop(NMessage* message) { +NMessage NMessageQueue::Pop() { NSyncObject held(&this->m_criticalSection); - if (!this->m_messages.empty()) { - Record record = this->m_messages.front(); - this->m_messages.pop_front(); - message->id = record.id; - message->argumentHigh = record.argumentHigh; - message->argumentLow = record.argumentLow; - message->valid = true; - } else { - message->id = 0; - message->argumentHigh = 0; - message->argumentLow = 0; - message->valid = false; + if (this->m_messages.empty()) { + return NMessage(); } - return message; + Record record = this->m_messages.front(); + this->m_messages.pop_front(); + return NMessage(record.id, record.argumentHigh, record.argumentLow); } // OFFSET: 0x00736660 diff --git a/Source/Utility/Async/NMessageQueue.h b/Source/Utility/Async/NMessageQueue.h index 1e8657a0..9575a64f 100644 --- a/Source/Utility/Async/NMessageQueue.h +++ b/Source/Utility/Async/NMessageQueue.h @@ -7,6 +7,13 @@ #include struct NMessage { + NMessage() : id(0), argumentHigh(0), argumentLow(0), valid(false) { + } + + NMessage(std::uint32_t id, std::uint32_t argumentHigh, std::uint32_t argumentLow) + : id(id), argumentHigh(argumentHigh), argumentLow(argumentLow), valid(true) { + } + /* 0000 */ std::uint32_t id; /* 0004 */ std::uint32_t argumentHigh; /* 0008 */ std::uint32_t argumentLow; @@ -20,7 +27,7 @@ public: NMessageQueue(); virtual ~NMessageQueue(); - NMessage* Pop(NMessage* message); + NMessage Pop(); void Push(std::uint64_t argument, std::uint32_t id); void Clear();