mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	thread: Add THREADSTATUS_WAIT_HLE_EVENT, remove THREADSTATUS_WAIT_ARB.
This commit is contained in:
		@@ -55,16 +55,6 @@ inline static u32 const NewThreadId() {
 | 
			
		||||
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() {
 | 
			
		||||
    // Cancel any outstanding wakeup events for this thread
 | 
			
		||||
    CoreTiming::UnscheduleEvent(ThreadWakeupEventType, callback_handle);
 | 
			
		||||
@@ -102,12 +92,6 @@ void WaitCurrentThread_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() {
 | 
			
		||||
    Thread* thread = GetCurrentThread();
 | 
			
		||||
    thread->Stop();
 | 
			
		||||
@@ -129,7 +113,8 @@ static void ThreadWakeupCallback(u64 thread_handle, int cycles_late) {
 | 
			
		||||
    bool resume = true;
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
        for (auto& object : thread->wait_objects)
 | 
			
		||||
@@ -163,7 +148,7 @@ void Thread::ResumeFromWait() {
 | 
			
		||||
    switch (status) {
 | 
			
		||||
    case THREADSTATUS_WAIT_SYNCH_ALL:
 | 
			
		||||
    case THREADSTATUS_WAIT_SYNCH_ANY:
 | 
			
		||||
    case THREADSTATUS_WAIT_ARB:
 | 
			
		||||
    case THREADSTATUS_WAIT_HLE_EVENT:
 | 
			
		||||
    case THREADSTATUS_WAIT_SLEEP:
 | 
			
		||||
    case THREADSTATUS_WAIT_IPC:
 | 
			
		||||
        break;
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ enum ThreadProcessorId : s32 {
 | 
			
		||||
enum ThreadStatus {
 | 
			
		||||
    THREADSTATUS_RUNNING,        ///< Currently running
 | 
			
		||||
    THREADSTATUS_READY,          ///< Ready to run
 | 
			
		||||
    THREADSTATUS_WAIT_ARB,       ///< Waiting on an address arbiter
 | 
			
		||||
    THREADSTATUS_WAIT_HLE_EVENT, ///< Waiting for hle event to finish
 | 
			
		||||
    THREADSTATUS_WAIT_SLEEP,     ///< Waiting due to a SleepThread SVC
 | 
			
		||||
    THREADSTATUS_WAIT_IPC,       ///< Waiting for the reply from an IPC request
 | 
			
		||||
    THREADSTATUS_WAIT_SYNCH_ANY, ///< Waiting due to WaitSynch1 or WaitSynchN with wait_all = false
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,8 @@ SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() {
 | 
			
		||||
    for (const auto& thread : waiting_threads) {
 | 
			
		||||
        // The list of waiting threads must not contain threads that are not waiting to be awakened.
 | 
			
		||||
        ASSERT_MSG(thread->status == THREADSTATUS_WAIT_SYNCH_ANY ||
 | 
			
		||||
                       thread->status == THREADSTATUS_WAIT_SYNCH_ALL,
 | 
			
		||||
                       thread->status == THREADSTATUS_WAIT_SYNCH_ALL ||
 | 
			
		||||
                       thread->status == THREADSTATUS_WAIT_HLE_EVENT,
 | 
			
		||||
                   "Inconsistent thread statuses in waiting_threads");
 | 
			
		||||
 | 
			
		||||
        if (thread->current_priority >= candidate_priority)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user