summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/kernel.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2015-01-10 15:19:21 -0500
committerGravatar bunnei2015-01-10 15:19:21 -0500
commit5a4b361f6065d33fd9efb73b3654910f74d5e3cd (patch)
treecb6506c96f7880ef38f783221d4dd5b34978e3ef /src/core/hle/kernel/kernel.cpp
parentFix Windows build (diff)
parentKernel: Start using boost::intrusive_ptr for lifetime management (diff)
downloadyuzu-5a4b361f6065d33fd9efb73b3654910f74d5e3cd.tar.gz
yuzu-5a4b361f6065d33fd9efb73b3654910f74d5e3cd.tar.xz
yuzu-5a4b361f6065d33fd9efb73b3654910f74d5e3cd.zip
Merge pull request #455 from yuriks/handle-reform3
Kernel Lifetime Reform Pt. 3
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r--src/core/hle/kernel/kernel.cpp24
1 files changed, 11 insertions, 13 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index a1bc6c5d8..d3684896f 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -14,7 +14,7 @@
14 14
15namespace Kernel { 15namespace Kernel {
16 16
17Thread* g_main_thread = nullptr; 17SharedPtr<Thread> g_main_thread = nullptr;
18HandleTable g_handle_table; 18HandleTable g_handle_table;
19u64 g_program_id = 0; 19u64 g_program_id = 0;
20 20
@@ -23,7 +23,7 @@ HandleTable::HandleTable() {
23 Clear(); 23 Clear();
24} 24}
25 25
26ResultVal<Handle> HandleTable::Create(Object* obj) { 26ResultVal<Handle> HandleTable::Create(SharedPtr<Object> obj) {
27 _dbg_assert_(Kernel, obj != nullptr); 27 _dbg_assert_(Kernel, obj != nullptr);
28 28
29 u16 slot = next_free_slot; 29 u16 slot = next_free_slot;
@@ -39,22 +39,23 @@ ResultVal<Handle> HandleTable::Create(Object* obj) {
39 // CTR-OS doesn't use generation 0, so skip straight to 1. 39 // CTR-OS doesn't use generation 0, so skip straight to 1.
40 if (next_generation >= (1 << 15)) next_generation = 1; 40 if (next_generation >= (1 << 15)) next_generation = 1;
41 41
42 Handle handle = generation | (slot << 15);
43 if (obj->handle == INVALID_HANDLE)
44 obj->handle = handle;
45
42 generations[slot] = generation; 46 generations[slot] = generation;
43 intrusive_ptr_add_ref(obj); 47 objects[slot] = std::move(obj);
44 objects[slot] = obj;
45 48
46 Handle handle = generation | (slot << 15);
47 obj->handle = handle;
48 return MakeResult<Handle>(handle); 49 return MakeResult<Handle>(handle);
49} 50}
50 51
51ResultVal<Handle> HandleTable::Duplicate(Handle handle) { 52ResultVal<Handle> HandleTable::Duplicate(Handle handle) {
52 Object* object = GetGeneric(handle); 53 SharedPtr<Object> object = GetGeneric(handle);
53 if (object == nullptr) { 54 if (object == nullptr) {
54 LOG_ERROR(Kernel, "Tried to duplicate invalid handle: %08X", handle); 55 LOG_ERROR(Kernel, "Tried to duplicate invalid handle: %08X", handle);
55 return ERR_INVALID_HANDLE; 56 return ERR_INVALID_HANDLE;
56 } 57 }
57 return Create(object); 58 return Create(std::move(object));
58} 59}
59 60
60ResultCode HandleTable::Close(Handle handle) { 61ResultCode HandleTable::Close(Handle handle) {
@@ -64,7 +65,6 @@ ResultCode HandleTable::Close(Handle handle) {
64 size_t slot = GetSlot(handle); 65 size_t slot = GetSlot(handle);
65 u16 generation = GetGeneration(handle); 66 u16 generation = GetGeneration(handle);
66 67
67 intrusive_ptr_release(objects[slot]);
68 objects[slot] = nullptr; 68 objects[slot] = nullptr;
69 69
70 generations[generation] = next_free_slot; 70 generations[generation] = next_free_slot;
@@ -79,7 +79,7 @@ bool HandleTable::IsValid(Handle handle) const {
79 return slot < MAX_COUNT && objects[slot] != nullptr && generations[slot] == generation; 79 return slot < MAX_COUNT && objects[slot] != nullptr && generations[slot] == generation;
80} 80}
81 81
82Object* HandleTable::GetGeneric(Handle handle) const { 82SharedPtr<Object> HandleTable::GetGeneric(Handle handle) const {
83 if (handle == CurrentThread) { 83 if (handle == CurrentThread) {
84 return GetCurrentThread(); 84 return GetCurrentThread();
85 } else if (handle == CurrentProcess) { 85 } else if (handle == CurrentProcess) {
@@ -96,8 +96,6 @@ Object* HandleTable::GetGeneric(Handle handle) const {
96void HandleTable::Clear() { 96void HandleTable::Clear() {
97 for (size_t i = 0; i < MAX_COUNT; ++i) { 97 for (size_t i = 0; i < MAX_COUNT; ++i) {
98 generations[i] = i + 1; 98 generations[i] = i + 1;
99 if (objects[i] != nullptr)
100 intrusive_ptr_release(objects[i]);
101 objects[i] = nullptr; 99 objects[i] = nullptr;
102 } 100 }
103 next_free_slot = 0; 101 next_free_slot = 0;
@@ -125,7 +123,7 @@ bool LoadExec(u32 entry_point) {
125 Core::g_app_core->SetPC(entry_point); 123 Core::g_app_core->SetPC(entry_point);
126 124
127 // 0x30 is the typical main thread priority I've seen used so far 125 // 0x30 is the typical main thread priority I've seen used so far
128 g_main_thread = Kernel::SetupMainThread(0x30); 126 g_main_thread = Kernel::SetupMainThread(0x30, Kernel::DEFAULT_STACK_SIZE);
129 // Setup the idle thread 127 // Setup the idle thread
130 Kernel::SetupIdleThread(); 128 Kernel::SetupIdleThread();
131 129