|
|
|
@ -37,6 +37,10 @@ void Thread::Acquire() {
|
|
|
|
|
ASSERT_MSG(!ShouldWait(), "object unavailable!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO(yuriks): This can be removed if Thread objects are explicitly pooled in the future, allowing
|
|
|
|
|
// us to simply use a pool index or similar.
|
|
|
|
|
static Kernel::HandleTable wakeup_callback_handle_table;
|
|
|
|
|
|
|
|
|
|
// Lists all thread ids that aren't deleted/etc.
|
|
|
|
|
static std::vector<SharedPtr<Thread>> thread_list;
|
|
|
|
|
|
|
|
|
@ -93,6 +97,8 @@ void Thread::Stop() {
|
|
|
|
|
|
|
|
|
|
// Cancel any outstanding wakeup events for this thread
|
|
|
|
|
CoreTiming::UnscheduleEvent(ThreadWakeupEventType, callback_handle);
|
|
|
|
|
wakeup_callback_handle_table.Close(callback_handle);
|
|
|
|
|
callback_handle = 0;
|
|
|
|
|
|
|
|
|
|
// Clean up thread from ready queue
|
|
|
|
|
// This is only needed when the thread is termintated forcefully (SVC TerminateProcess)
|
|
|
|
@ -108,6 +114,7 @@ void Thread::Stop() {
|
|
|
|
|
for (auto& wait_object : wait_objects) {
|
|
|
|
|
wait_object->RemoveWaitingThread(this);
|
|
|
|
|
}
|
|
|
|
|
wait_objects.clear();
|
|
|
|
|
|
|
|
|
|
Kernel::g_current_process->used_tls_slots[tls_index] = false;
|
|
|
|
|
|
|
|
|
@ -268,10 +275,6 @@ void WaitCurrentThread_ArbitrateAddress(VAddr wait_address) {
|
|
|
|
|
thread->status = THREADSTATUS_WAIT_ARB;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO(yuriks): This can be removed if Thread objects are explicitly pooled in the future, allowing
|
|
|
|
|
// us to simply use a pool index or similar.
|
|
|
|
|
static Kernel::HandleTable wakeup_callback_handle_table;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Callback that will wake up the thread it was scheduled for
|
|
|
|
|
* @param thread_handle The handle of the thread that's been awoken
|
|
|
|
@ -503,12 +506,16 @@ void ThreadingInit() {
|
|
|
|
|
|
|
|
|
|
current_thread = nullptr;
|
|
|
|
|
next_thread_id = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ThreadingShutdown() {
|
|
|
|
|
current_thread = nullptr;
|
|
|
|
|
|
|
|
|
|
for (auto& t : thread_list) {
|
|
|
|
|
t->Stop();
|
|
|
|
|
}
|
|
|
|
|
thread_list.clear();
|
|
|
|
|
ready_queue.clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ThreadingShutdown() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|