From c22bac6398ff1705992fc44b2c29775c84cff662 Mon Sep 17 00:00:00 2001 From: bunnei Date: Wed, 14 Jan 2015 19:22:50 -0500 Subject: Kernel: Added WaitObject and changed "waitable" objects inherit from it. --- src/core/hle/kernel/kernel.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'src/core/hle/kernel/kernel.cpp') diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index d3684896f..07e96e633 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -18,6 +18,32 @@ SharedPtr g_main_thread = nullptr; HandleTable g_handle_table; u64 g_program_id = 0; +void WaitObject::AddWaitingThread(Thread* thread) { + if (std::find(waiting_threads.begin(), waiting_threads.end(), thread) == waiting_threads.end()) { + waiting_threads.push_back(thread); + } +} + +Thread* WaitObject::ResumeNextThread() { + if (waiting_threads.empty()) return nullptr; + + auto next_thread = waiting_threads.front(); + + next_thread->ResumeFromWait(); + waiting_threads.erase(waiting_threads.begin()); + + return next_thread.get(); +} + +void WaitObject::ReleaseAllWaitingThreads() { + auto waiting_threads_copy = waiting_threads; + + for (auto thread : waiting_threads_copy) + thread->ReleaseWaitObject(this); + + waiting_threads.clear(); +} + HandleTable::HandleTable() { next_generation = 1; Clear(); -- cgit v1.2.3 From 5e77e2e1de73ce7786f52f2a74c28182fa4aa845 Mon Sep 17 00:00:00 2001 From: bunnei Date: Wed, 14 Jan 2015 23:19:22 -0500 Subject: WaitObject: Added RemoveWaitingThread, fixed a bug, and cleanup. --- src/core/hle/kernel/kernel.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src/core/hle/kernel/kernel.cpp') diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 07e96e633..1dba85939 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -19,13 +19,20 @@ HandleTable g_handle_table; u64 g_program_id = 0; void WaitObject::AddWaitingThread(Thread* thread) { - if (std::find(waiting_threads.begin(), waiting_threads.end(), thread) == waiting_threads.end()) { + auto itr = std::find(waiting_threads.begin(), waiting_threads.end(), thread); + if (itr == waiting_threads.end()) waiting_threads.push_back(thread); - } +} + +void WaitObject::RemoveWaitingThread(Thread* thread) { + auto itr = std::find(waiting_threads.begin(), waiting_threads.end(), thread); + if (itr != waiting_threads.end()) + waiting_threads.erase(itr); } Thread* WaitObject::ResumeNextThread() { - if (waiting_threads.empty()) return nullptr; + if (waiting_threads.empty()) + return nullptr; auto next_thread = waiting_threads.front(); -- cgit v1.2.3 From 7faf2d8e06e705d1866fa0d7848ff43541a4b172 Mon Sep 17 00:00:00 2001 From: bunnei Date: Sat, 17 Jan 2015 02:03:44 -0500 Subject: WaitSynchronizationN: Implement return values --- src/core/hle/kernel/kernel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/core/hle/kernel/kernel.cpp') diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 1dba85939..be3495412 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -30,13 +30,13 @@ void WaitObject::RemoveWaitingThread(Thread* thread) { waiting_threads.erase(itr); } -Thread* WaitObject::ResumeNextThread() { +Thread* WaitObject::ReleaseNextThread() { if (waiting_threads.empty()) return nullptr; auto next_thread = waiting_threads.front(); - next_thread->ResumeFromWait(); + next_thread->ReleaseFromWait(this); waiting_threads.erase(waiting_threads.begin()); return next_thread.get(); -- cgit v1.2.3 From e5a9f1c64483e01b7856c581ae5685d0c5ad88dc Mon Sep 17 00:00:00 2001 From: bunnei Date: Sun, 18 Jan 2015 13:25:51 -0500 Subject: Kernel: Get rid of WaitTypes and simplify lots of code, removing hacks. --- src/core/hle/kernel/kernel.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/core/hle/kernel/kernel.cpp') diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index be3495412..57e0e8df7 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -42,13 +42,15 @@ Thread* WaitObject::ReleaseNextThread() { return next_thread.get(); } -void WaitObject::ReleaseAllWaitingThreads() { +void WaitObject::WakeupAllWaitingThreads() { auto waiting_threads_copy = waiting_threads; + // We use a copy because ReleaseWaitObject will remove the thread from this object's + // waiting_threads list for (auto thread : waiting_threads_copy) thread->ReleaseWaitObject(this); - waiting_threads.clear(); + _assert_msg_(Kernel, waiting_threads.empty(), "failed to awaken all waiting threads!"); } HandleTable::HandleTable() { -- cgit v1.2.3 From 254e4ebd58a31e8462b70799f95f096d0d0038f2 Mon Sep 17 00:00:00 2001 From: bunnei Date: Sun, 18 Jan 2015 13:56:40 -0500 Subject: AddressArbiter: Changed to Kernel::Object, big cleanup, removed code that made no sense. --- src/core/hle/kernel/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core/hle/kernel/kernel.cpp') diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 57e0e8df7..b3ca78ed6 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -36,7 +36,7 @@ Thread* WaitObject::ReleaseNextThread() { auto next_thread = waiting_threads.front(); - next_thread->ReleaseFromWait(this); + next_thread->ReleaseWaitObject(this); waiting_threads.erase(waiting_threads.begin()); return next_thread.get(); -- cgit v1.2.3 From d2759c578e8cf24277767f701d5682f7b1792a9f Mon Sep 17 00:00:00 2001 From: bunnei Date: Sun, 18 Jan 2015 18:01:58 -0500 Subject: Kernel: Reschedule on SignalEvent and SendSyncRequest, fix some bugs. --- src/core/hle/kernel/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core/hle/kernel/kernel.cpp') diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index b3ca78ed6..6f1dced70 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -35,9 +35,9 @@ Thread* WaitObject::ReleaseNextThread() { return nullptr; auto next_thread = waiting_threads.front(); + waiting_threads.erase(waiting_threads.begin()); next_thread->ReleaseWaitObject(this); - waiting_threads.erase(waiting_threads.begin()); return next_thread.get(); } -- cgit v1.2.3 From 9e6ec3b6cd23a7cef80a1d62fda515018f080083 Mon Sep 17 00:00:00 2001 From: bunnei Date: Sun, 18 Jan 2015 20:40:53 -0500 Subject: Session: Change to a WaitObject. --- src/core/hle/kernel/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core/hle/kernel/kernel.cpp') diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 6f1dced70..692349857 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -39,7 +39,7 @@ Thread* WaitObject::ReleaseNextThread() { next_thread->ReleaseWaitObject(this); - return next_thread.get(); + return next_thread; } void WaitObject::WakeupAllWaitingThreads() { -- cgit v1.2.3 From f09806aed24b2f7de7d969cbfdb3b9d18ab90c61 Mon Sep 17 00:00:00 2001 From: bunnei Date: Tue, 20 Jan 2015 18:20:47 -0500 Subject: Kernel: Renamed some functions for clarity. - ReleaseNextThread->WakeupNextThread - ReleaseAllWaitingThreads->WakeupAllWaitingThreads. --- src/core/hle/kernel/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core/hle/kernel/kernel.cpp') diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 692349857..d7fa4dcea 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -30,7 +30,7 @@ void WaitObject::RemoveWaitingThread(Thread* thread) { waiting_threads.erase(itr); } -Thread* WaitObject::ReleaseNextThread() { +Thread* WaitObject::WakeupNextThread() { if (waiting_threads.empty()) return nullptr; -- cgit v1.2.3