Initial rodecomp source snapshot
This commit is contained in:
commit
d456e8f64a
916 changed files with 156023 additions and 0 deletions
72
Source/Utility/NAsyncWorkThread.cpp
Normal file
72
Source/Utility/NAsyncWorkThread.cpp
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
#include "Utility/NAsyncWorkThread.h"
|
||||
|
||||
// OFFSET: 0x00732980
|
||||
// FUNCTION: fn_07576
|
||||
NAsyncWorkThread::NAsyncWorkThread(NAsyncWorkRequestQueue* requests, NAsyncWorkResponseQueue* responses)
|
||||
: NThread("AsyncWorkThread"), m_registered(false), m_requests(requests), m_responses(responses) {
|
||||
g_messageMgr->Register(this->m_objectId, static_cast<NInter*>(this));
|
||||
this->m_registered = true;
|
||||
}
|
||||
|
||||
// OFFSET: 0x00732A80
|
||||
// FUNCTION: fn_07577
|
||||
// OFFSET: 0x00732B40
|
||||
// FUNCTION: fn_07581
|
||||
NAsyncWorkThread::~NAsyncWorkThread() {
|
||||
// Original ownership requires Stop before destruction: the message queue is
|
||||
// destroyed before NThread's base destructor performs its own state check.
|
||||
g_messageMgr->Unregister(this->m_objectId, static_cast<NInter*>(this));
|
||||
}
|
||||
|
||||
// OFFSET: 0x00732C40
|
||||
// FUNCTION: fn_07584
|
||||
void NAsyncWorkThread::Receive(std::uint64_t argument, std::uint32_t id) {
|
||||
this->m_messages.Push(argument, id);
|
||||
}
|
||||
|
||||
// OFFSET: 0x00732C20
|
||||
// FUNCTION: fn_07583
|
||||
void NAsyncWorkThread::RequestStop() {
|
||||
// Pushes low/high argument 0x50000/0, then message ID zero.
|
||||
this->m_messages.Push(0x50000, 0);
|
||||
}
|
||||
|
||||
// OFFSET: 0x00732C50
|
||||
// FUNCTION: fn_07585
|
||||
bool NAsyncWorkThread::Start() {
|
||||
return this->NThread::Start();
|
||||
}
|
||||
|
||||
// OFFSET: 0x00732C60
|
||||
// FUNCTION: fn_07586
|
||||
void NAsyncWorkThread::Stop() {
|
||||
this->NThread::Stop();
|
||||
}
|
||||
|
||||
// OFFSET: 0x00732C70
|
||||
// FUNCTION: fn_07587
|
||||
unsigned NAsyncWorkThread::Run() {
|
||||
for (;;) {
|
||||
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);
|
||||
// Original tests argumentLow, not message ID, for the stop token.
|
||||
if (message.valid && message.argumentLow == 0x50000) {
|
||||
return 0;
|
||||
}
|
||||
} else if (ready == WAIT_OBJECT_0 + 1) {
|
||||
NAsyncWorkPtr work = this->m_requests->Pop();
|
||||
if (work.Get()) {
|
||||
auto group = work.Get()->GroupKey();
|
||||
if (work.Get()->Execute()) {
|
||||
this->m_requests->PushFront(work);
|
||||
} else {
|
||||
this->m_responses->Push(work);
|
||||
}
|
||||
this->m_requests->Complete(group.first, group.second);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue