diff options
| author | 2015-01-10 15:19:21 -0500 | |
|---|---|---|
| committer | 2015-01-10 15:19:21 -0500 | |
| commit | 5a4b361f6065d33fd9efb73b3654910f74d5e3cd (patch) | |
| tree | cb6506c96f7880ef38f783221d4dd5b34978e3ef /src/core/hle/kernel/kernel.cpp | |
| parent | Fix Windows build (diff) | |
| parent | Kernel: Start using boost::intrusive_ptr for lifetime management (diff) | |
| download | yuzu-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.cpp | 24 |
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 | ||
| 15 | namespace Kernel { | 15 | namespace Kernel { |
| 16 | 16 | ||
| 17 | Thread* g_main_thread = nullptr; | 17 | SharedPtr<Thread> g_main_thread = nullptr; |
| 18 | HandleTable g_handle_table; | 18 | HandleTable g_handle_table; |
| 19 | u64 g_program_id = 0; | 19 | u64 g_program_id = 0; |
| 20 | 20 | ||
| @@ -23,7 +23,7 @@ HandleTable::HandleTable() { | |||
| 23 | Clear(); | 23 | Clear(); |
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | ResultVal<Handle> HandleTable::Create(Object* obj) { | 26 | ResultVal<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 | ||
| 51 | ResultVal<Handle> HandleTable::Duplicate(Handle handle) { | 52 | ResultVal<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 | ||
| 60 | ResultCode HandleTable::Close(Handle handle) { | 61 | ResultCode 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 | ||
| 82 | Object* HandleTable::GetGeneric(Handle handle) const { | 82 | SharedPtr<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 { | |||
| 96 | void HandleTable::Clear() { | 96 | void 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 | ||