|
|
@ -55,16 +55,6 @@ inline static u32 const NewThreadId() {
|
|
|
|
Thread::Thread() {}
|
|
|
|
Thread::Thread() {}
|
|
|
|
Thread::~Thread() {}
|
|
|
|
Thread::~Thread() {}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Check if the specified thread is waiting on the specified address to be arbitrated
|
|
|
|
|
|
|
|
* @param thread The thread to test
|
|
|
|
|
|
|
|
* @param wait_address The address to test against
|
|
|
|
|
|
|
|
* @return True if the thread is waiting, false otherwise
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
static bool CheckWait_AddressArbiter(const Thread* thread, VAddr wait_address) {
|
|
|
|
|
|
|
|
return thread->status == THREADSTATUS_WAIT_ARB && wait_address == thread->wait_address;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Thread::Stop() {
|
|
|
|
void Thread::Stop() {
|
|
|
|
// Cancel any outstanding wakeup events for this thread
|
|
|
|
// Cancel any outstanding wakeup events for this thread
|
|
|
|
CoreTiming::UnscheduleEvent(ThreadWakeupEventType, callback_handle);
|
|
|
|
CoreTiming::UnscheduleEvent(ThreadWakeupEventType, callback_handle);
|
|
|
@ -102,12 +92,6 @@ void WaitCurrentThread_Sleep() {
|
|
|
|
thread->status = THREADSTATUS_WAIT_SLEEP;
|
|
|
|
thread->status = THREADSTATUS_WAIT_SLEEP;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void WaitCurrentThread_ArbitrateAddress(VAddr wait_address) {
|
|
|
|
|
|
|
|
Thread* thread = GetCurrentThread();
|
|
|
|
|
|
|
|
thread->wait_address = wait_address;
|
|
|
|
|
|
|
|
thread->status = THREADSTATUS_WAIT_ARB;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ExitCurrentThread() {
|
|
|
|
void ExitCurrentThread() {
|
|
|
|
Thread* thread = GetCurrentThread();
|
|
|
|
Thread* thread = GetCurrentThread();
|
|
|
|
thread->Stop();
|
|
|
|
thread->Stop();
|
|
|
@ -129,7 +113,8 @@ static void ThreadWakeupCallback(u64 thread_handle, int cycles_late) {
|
|
|
|
bool resume = true;
|
|
|
|
bool resume = true;
|
|
|
|
|
|
|
|
|
|
|
|
if (thread->status == THREADSTATUS_WAIT_SYNCH_ANY ||
|
|
|
|
if (thread->status == THREADSTATUS_WAIT_SYNCH_ANY ||
|
|
|
|
thread->status == THREADSTATUS_WAIT_SYNCH_ALL || thread->status == THREADSTATUS_WAIT_ARB) {
|
|
|
|
thread->status == THREADSTATUS_WAIT_SYNCH_ALL ||
|
|
|
|
|
|
|
|
thread->status == THREADSTATUS_WAIT_HLE_EVENT) {
|
|
|
|
|
|
|
|
|
|
|
|
// Remove the thread from each of its waiting objects' waitlists
|
|
|
|
// Remove the thread from each of its waiting objects' waitlists
|
|
|
|
for (auto& object : thread->wait_objects)
|
|
|
|
for (auto& object : thread->wait_objects)
|
|
|
@ -163,7 +148,7 @@ void Thread::ResumeFromWait() {
|
|
|
|
switch (status) {
|
|
|
|
switch (status) {
|
|
|
|
case THREADSTATUS_WAIT_SYNCH_ALL:
|
|
|
|
case THREADSTATUS_WAIT_SYNCH_ALL:
|
|
|
|
case THREADSTATUS_WAIT_SYNCH_ANY:
|
|
|
|
case THREADSTATUS_WAIT_SYNCH_ANY:
|
|
|
|
case THREADSTATUS_WAIT_ARB:
|
|
|
|
case THREADSTATUS_WAIT_HLE_EVENT:
|
|
|
|
case THREADSTATUS_WAIT_SLEEP:
|
|
|
|
case THREADSTATUS_WAIT_SLEEP:
|
|
|
|
case THREADSTATUS_WAIT_IPC:
|
|
|
|
case THREADSTATUS_WAIT_IPC:
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|