summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/kernel.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2015-02-02 13:04:04 -0500
committerGravatar bunnei2015-02-02 13:04:04 -0500
commit7f730ed158bc9bba064100b9644b318134ef0bb3 (patch)
treec4181a69ff882e1af1b7d65bf3596a6cb3dd88b9 /src/core/hle/kernel/kernel.cpp
parentMerge pull request #517 from bunnei/blend-factors (diff)
parentKernel: Stop creating useless Handles during object creation (diff)
downloadyuzu-7f730ed158bc9bba064100b9644b318134ef0bb3.tar.gz
yuzu-7f730ed158bc9bba064100b9644b318134ef0bb3.tar.xz
yuzu-7f730ed158bc9bba064100b9644b318134ef0bb3.zip
Merge pull request #523 from yuriks/kernel-lifetime5
Kernel Lifetime Reform Pt. 5: The Reckoning
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r--src/core/hle/kernel/kernel.cpp17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index d7fa4dcea..7e0b9542e 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -14,14 +14,16 @@
14 14
15namespace Kernel { 15namespace Kernel {
16 16
17unsigned int Object::next_object_id = 0;
18
17SharedPtr<Thread> g_main_thread = nullptr; 19SharedPtr<Thread> g_main_thread = nullptr;
18HandleTable g_handle_table; 20HandleTable g_handle_table;
19u64 g_program_id = 0; 21u64 g_program_id = 0;
20 22
21void WaitObject::AddWaitingThread(Thread* thread) { 23void WaitObject::AddWaitingThread(SharedPtr<Thread> thread) {
22 auto itr = std::find(waiting_threads.begin(), waiting_threads.end(), thread); 24 auto itr = std::find(waiting_threads.begin(), waiting_threads.end(), thread);
23 if (itr == waiting_threads.end()) 25 if (itr == waiting_threads.end())
24 waiting_threads.push_back(thread); 26 waiting_threads.push_back(std::move(thread));
25} 27}
26 28
27void WaitObject::RemoveWaitingThread(Thread* thread) { 29void WaitObject::RemoveWaitingThread(Thread* thread) {
@@ -30,11 +32,11 @@ void WaitObject::RemoveWaitingThread(Thread* thread) {
30 waiting_threads.erase(itr); 32 waiting_threads.erase(itr);
31} 33}
32 34
33Thread* WaitObject::WakeupNextThread() { 35SharedPtr<Thread> WaitObject::WakeupNextThread() {
34 if (waiting_threads.empty()) 36 if (waiting_threads.empty())
35 return nullptr; 37 return nullptr;
36 38
37 auto next_thread = waiting_threads.front(); 39 auto next_thread = std::move(waiting_threads.front());
38 waiting_threads.erase(waiting_threads.begin()); 40 waiting_threads.erase(waiting_threads.begin());
39 41
40 next_thread->ReleaseWaitObject(this); 42 next_thread->ReleaseWaitObject(this);
@@ -74,13 +76,10 @@ ResultVal<Handle> HandleTable::Create(SharedPtr<Object> obj) {
74 // CTR-OS doesn't use generation 0, so skip straight to 1. 76 // CTR-OS doesn't use generation 0, so skip straight to 1.
75 if (next_generation >= (1 << 15)) next_generation = 1; 77 if (next_generation >= (1 << 15)) next_generation = 1;
76 78
77 Handle handle = generation | (slot << 15);
78 if (obj->handle == INVALID_HANDLE)
79 obj->handle = handle;
80
81 generations[slot] = generation; 79 generations[slot] = generation;
82 objects[slot] = std::move(obj); 80 objects[slot] = std::move(obj);
83 81
82 Handle handle = generation | (slot << 15);
84 return MakeResult<Handle>(handle); 83 return MakeResult<Handle>(handle);
85} 84}
86 85
@@ -102,7 +101,7 @@ ResultCode HandleTable::Close(Handle handle) {
102 101
103 objects[slot] = nullptr; 102 objects[slot] = nullptr;
104 103
105 generations[generation] = next_free_slot; 104 generations[slot] = next_free_slot;
106 next_free_slot = slot; 105 next_free_slot = slot;
107 return RESULT_SUCCESS; 106 return RESULT_SUCCESS;
108} 107}