forked from suyu/suyu
Thread: Modernize two functions that slipped through previous rebases
This commit is contained in:
parent
6e11570862
commit
664c79ff47
4 changed files with 16 additions and 18 deletions
|
@ -51,7 +51,7 @@ ResultCode AddressArbiter::ArbitrateAddress(ArbitrationType type, VAddr address,
|
||||||
case ArbitrationType::WaitIfLessThanWithTimeout:
|
case ArbitrationType::WaitIfLessThanWithTimeout:
|
||||||
if ((s32)Memory::Read32(address) <= value) {
|
if ((s32)Memory::Read32(address) <= value) {
|
||||||
Kernel::WaitCurrentThread_ArbitrateAddress(address);
|
Kernel::WaitCurrentThread_ArbitrateAddress(address);
|
||||||
Kernel::WakeThreadAfterDelay(GetCurrentThread(), nanoseconds);
|
GetCurrentThread()->WakeAfterDelay(nanoseconds);
|
||||||
HLE::Reschedule(__func__);
|
HLE::Reschedule(__func__);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -71,7 +71,7 @@ ResultCode AddressArbiter::ArbitrateAddress(ArbitrationType type, VAddr address,
|
||||||
Memory::Write32(address, memory_value);
|
Memory::Write32(address, memory_value);
|
||||||
if (memory_value <= value) {
|
if (memory_value <= value) {
|
||||||
Kernel::WaitCurrentThread_ArbitrateAddress(address);
|
Kernel::WaitCurrentThread_ArbitrateAddress(address);
|
||||||
Kernel::WakeThreadAfterDelay(GetCurrentThread(), nanoseconds);
|
GetCurrentThread()->WakeAfterDelay(nanoseconds);
|
||||||
HLE::Reschedule(__func__);
|
HLE::Reschedule(__func__);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -248,14 +248,13 @@ static void ThreadWakeupCallback(u64 parameter, int cycles_late) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void WakeThreadAfterDelay(Thread* thread, s64 nanoseconds) {
|
void Thread::WakeAfterDelay(s64 nanoseconds) {
|
||||||
// Don't schedule a wakeup if the thread wants to wait forever
|
// Don't schedule a wakeup if the thread wants to wait forever
|
||||||
if (nanoseconds == -1)
|
if (nanoseconds == -1)
|
||||||
return;
|
return;
|
||||||
_dbg_assert_(Kernel, thread != nullptr);
|
|
||||||
|
|
||||||
u64 microseconds = nanoseconds / 1000;
|
u64 microseconds = nanoseconds / 1000;
|
||||||
CoreTiming::ScheduleEvent(usToCycles(microseconds), ThreadWakeupEventType, thread->GetHandle());
|
CoreTiming::ScheduleEvent(usToCycles(microseconds), ThreadWakeupEventType, GetHandle());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Thread::ReleaseWaitObject(WaitObject* wait_object) {
|
void Thread::ReleaseWaitObject(WaitObject* wait_object) {
|
||||||
|
@ -418,7 +417,7 @@ void Thread::SetPriority(s32 priority) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle SetupIdleThread() {
|
SharedPtr<Thread> SetupIdleThread() {
|
||||||
// We need to pass a few valid values to get around parameter checking in Thread::Create.
|
// We need to pass a few valid values to get around parameter checking in Thread::Create.
|
||||||
auto thread_res = Thread::Create("idle", Memory::KERNEL_MEMORY_VADDR, THREADPRIO_LOWEST, 0,
|
auto thread_res = Thread::Create("idle", Memory::KERNEL_MEMORY_VADDR, THREADPRIO_LOWEST, 0,
|
||||||
THREADPROCESSORID_0, 0, Kernel::DEFAULT_STACK_SIZE);
|
THREADPROCESSORID_0, 0, Kernel::DEFAULT_STACK_SIZE);
|
||||||
|
@ -427,7 +426,7 @@ Handle SetupIdleThread() {
|
||||||
|
|
||||||
thread->idle = true;
|
thread->idle = true;
|
||||||
CallThread(thread.get());
|
CallThread(thread.get());
|
||||||
return thread->GetHandle();
|
return thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<Thread> SetupMainThread(s32 priority, u32 stack_size) {
|
SharedPtr<Thread> SetupMainThread(s32 priority, u32 stack_size) {
|
||||||
|
|
|
@ -77,6 +77,12 @@ public:
|
||||||
/// Resumes a thread from waiting by marking it as "ready"
|
/// Resumes a thread from waiting by marking it as "ready"
|
||||||
void ResumeFromWait();
|
void ResumeFromWait();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedules an event to wake up the specified thread after the specified delay.
|
||||||
|
* @param nanoseconds The time this thread will be allowed to sleep for.
|
||||||
|
*/
|
||||||
|
void WakeAfterDelay(s64 nanoseconds);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the result after the thread awakens (from either WaitSynchronization SVC)
|
* Sets the result after the thread awakens (from either WaitSynchronization SVC)
|
||||||
* @param result Value to set to the returned result
|
* @param result Value to set to the returned result
|
||||||
|
@ -150,20 +156,13 @@ void WaitCurrentThread_WaitSynchronization(SharedPtr<WaitObject> wait_object, bo
|
||||||
*/
|
*/
|
||||||
void WaitCurrentThread_ArbitrateAddress(VAddr wait_address);
|
void WaitCurrentThread_ArbitrateAddress(VAddr wait_address);
|
||||||
|
|
||||||
/**
|
|
||||||
* Schedules an event to wake up the specified thread after the specified delay.
|
|
||||||
* @param handle The thread handle.
|
|
||||||
* @param nanoseconds The time this thread will be allowed to sleep for.
|
|
||||||
*/
|
|
||||||
void WakeThreadAfterDelay(Thread* thread, s64 nanoseconds);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets up the idle thread, this is a thread that is intended to never execute instructions,
|
* Sets up the idle thread, this is a thread that is intended to never execute instructions,
|
||||||
* only to advance the timing. It is scheduled when there are no other ready threads in the thread queue
|
* only to advance the timing. It is scheduled when there are no other ready threads in the thread queue
|
||||||
* and will try to yield on every call.
|
* and will try to yield on every call.
|
||||||
* @returns The handle of the idle thread
|
* @returns The handle of the idle thread
|
||||||
*/
|
*/
|
||||||
Handle SetupIdleThread();
|
SharedPtr<Thread> SetupIdleThread();
|
||||||
|
|
||||||
/// Initialize threading
|
/// Initialize threading
|
||||||
void ThreadingInit();
|
void ThreadingInit();
|
||||||
|
|
|
@ -152,7 +152,7 @@ static ResultCode WaitSynchronization1(Handle handle, s64 nano_seconds) {
|
||||||
Kernel::WaitCurrentThread_WaitSynchronization(object, false, false);
|
Kernel::WaitCurrentThread_WaitSynchronization(object, false, false);
|
||||||
|
|
||||||
// Create an event to wake the thread up after the specified nanosecond delay has passed
|
// Create an event to wake the thread up after the specified nanosecond delay has passed
|
||||||
Kernel::WakeThreadAfterDelay(Kernel::GetCurrentThread(), nano_seconds);
|
Kernel::GetCurrentThread()->WakeAfterDelay(nano_seconds);
|
||||||
|
|
||||||
HLE::Reschedule(__func__);
|
HLE::Reschedule(__func__);
|
||||||
|
|
||||||
|
@ -228,7 +228,7 @@ static ResultCode WaitSynchronizationN(s32* out, Handle* handles, s32 handle_cou
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create an event to wake the thread up after the specified nanosecond delay has passed
|
// Create an event to wake the thread up after the specified nanosecond delay has passed
|
||||||
Kernel::WakeThreadAfterDelay(Kernel::GetCurrentThread(), nano_seconds);
|
Kernel::GetCurrentThread()->WakeAfterDelay(nano_seconds);
|
||||||
|
|
||||||
HLE::Reschedule(__func__);
|
HLE::Reschedule(__func__);
|
||||||
|
|
||||||
|
@ -540,7 +540,7 @@ static void SleepThread(s64 nanoseconds) {
|
||||||
Kernel::WaitCurrentThread_Sleep();
|
Kernel::WaitCurrentThread_Sleep();
|
||||||
|
|
||||||
// Create an event to wake the thread up after the specified nanosecond delay has passed
|
// Create an event to wake the thread up after the specified nanosecond delay has passed
|
||||||
Kernel::WakeThreadAfterDelay(Kernel::GetCurrentThread(), nanoseconds);
|
Kernel::GetCurrentThread()->WakeAfterDelay(nanoseconds);
|
||||||
|
|
||||||
HLE::Reschedule(__func__);
|
HLE::Reschedule(__func__);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue