1
1
Fork 0
forked from suyu/suyu

Merge pull request #4346 from lioncash/thread

kernel/handle_table: Remove usages of the global system instance
This commit is contained in:
David 2020-07-16 23:02:04 +10:00 committed by GitHub
commit 0648e023ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 26 additions and 35 deletions

View file

@ -8,7 +8,9 @@
#include "core/core.h" #include "core/core.h"
#include "core/hle/kernel/errors.h" #include "core/hle/kernel/errors.h"
#include "core/hle/kernel/handle_table.h" #include "core/hle/kernel/handle_table.h"
#include "core/hle/kernel/kernel.h"
#include "core/hle/kernel/process.h" #include "core/hle/kernel/process.h"
#include "core/hle/kernel/scheduler.h"
#include "core/hle/kernel/thread.h" #include "core/hle/kernel/thread.h"
namespace Kernel { namespace Kernel {
@ -22,7 +24,7 @@ constexpr u16 GetGeneration(Handle handle) {
} }
} // Anonymous namespace } // Anonymous namespace
HandleTable::HandleTable() { HandleTable::HandleTable(KernelCore& kernel) : kernel{kernel} {
Clear(); Clear();
} }
@ -103,9 +105,9 @@ bool HandleTable::IsValid(Handle handle) const {
std::shared_ptr<Object> HandleTable::GetGeneric(Handle handle) const { std::shared_ptr<Object> HandleTable::GetGeneric(Handle handle) const {
if (handle == CurrentThread) { if (handle == CurrentThread) {
return SharedFrom(GetCurrentThread()); return SharedFrom(kernel.CurrentScheduler().GetCurrentThread());
} else if (handle == CurrentProcess) { } else if (handle == CurrentProcess) {
return SharedFrom(Core::System::GetInstance().CurrentProcess()); return SharedFrom(kernel.CurrentProcess());
} }
if (!IsValid(handle)) { if (!IsValid(handle)) {

View file

@ -14,6 +14,8 @@
namespace Kernel { namespace Kernel {
class KernelCore;
enum KernelHandle : Handle { enum KernelHandle : Handle {
InvalidHandle = 0, InvalidHandle = 0,
CurrentThread = 0xFFFF8000, CurrentThread = 0xFFFF8000,
@ -48,7 +50,7 @@ public:
/// This is the maximum limit of handles allowed per process in Horizon /// This is the maximum limit of handles allowed per process in Horizon
static constexpr std::size_t MAX_COUNT = 1024; static constexpr std::size_t MAX_COUNT = 1024;
HandleTable(); explicit HandleTable(KernelCore& kernel);
~HandleTable(); ~HandleTable();
/** /**
@ -134,6 +136,9 @@ private:
/// Head of the free slots linked list. /// Head of the free slots linked list.
u16 next_free_slot = 0; u16 next_free_slot = 0;
/// Underlying kernel instance that this handle table operates under.
KernelCore& kernel;
}; };
} // namespace Kernel } // namespace Kernel

View file

@ -50,7 +50,8 @@ namespace Kernel {
struct KernelCore::Impl { struct KernelCore::Impl {
explicit Impl(Core::System& system, KernelCore& kernel) explicit Impl(Core::System& system, KernelCore& kernel)
: global_scheduler{kernel}, synchronization{system}, time_manager{system}, system{system} {} : global_scheduler{kernel}, synchronization{system}, time_manager{system},
global_handle_table{kernel}, system{system} {}
void SetMulticore(bool is_multicore) { void SetMulticore(bool is_multicore) {
this->is_multicore = is_multicore; this->is_multicore = is_multicore;
@ -307,7 +308,7 @@ struct KernelCore::Impl {
// This is the kernel's handle table or supervisor handle table which // This is the kernel's handle table or supervisor handle table which
// stores all the objects in place. // stores all the objects in place.
Kernel::HandleTable global_handle_table; HandleTable global_handle_table;
/// Map of named ports managed by the kernel, which can be retrieved using /// Map of named ports managed by the kernel, which can be retrieved using
/// the ConnectToPort SVC. /// the ConnectToPort SVC.

View file

@ -408,7 +408,7 @@ void Process::LoadModule(CodeSet code_set, VAddr base_addr) {
Process::Process(Core::System& system) Process::Process(Core::System& system)
: SynchronizationObject{system.Kernel()}, page_table{std::make_unique<Memory::PageTable>( : SynchronizationObject{system.Kernel()}, page_table{std::make_unique<Memory::PageTable>(
system)}, system)},
address_arbiter{system}, mutex{system}, system{system} {} handle_table{system.Kernel()}, address_arbiter{system}, mutex{system}, system{system} {}
Process::~Process() = default; Process::~Process() = default;

View file

@ -382,12 +382,6 @@ private:
/// List of threads waiting for a condition variable /// List of threads waiting for a condition variable
std::unordered_map<VAddr, std::list<std::shared_ptr<Thread>>> cond_var_threads; std::unordered_map<VAddr, std::list<std::shared_ptr<Thread>>> cond_var_threads;
/// System context
Core::System& system;
/// Name of this process
std::string name;
/// Address of the top of the main thread's stack /// Address of the top of the main thread's stack
VAddr main_thread_stack_top{}; VAddr main_thread_stack_top{};
@ -399,6 +393,12 @@ private:
/// Process total image size /// Process total image size
std::size_t image_size{}; std::size_t image_size{};
/// Name of this process
std::string name;
/// System context
Core::System& system;
}; };
} // namespace Kernel } // namespace Kernel

View file

@ -13,16 +13,8 @@
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/thread_queue_list.h" #include "common/thread_queue_list.h"
#include "core/arm/arm_interface.h" #include "core/arm/arm_interface.h"
#ifdef ARCHITECTURE_x86_64
#include "core/arm/dynarmic/arm_dynarmic_32.h"
#include "core/arm/dynarmic/arm_dynarmic_64.h"
#endif
#include "core/arm/cpu_interrupt_handler.h"
#include "core/arm/exclusive_monitor.h"
#include "core/arm/unicorn/arm_unicorn.h" #include "core/arm/unicorn/arm_unicorn.h"
#include "core/core.h" #include "core/core.h"
#include "core/core_timing.h"
#include "core/core_timing_util.h"
#include "core/cpu_manager.h" #include "core/cpu_manager.h"
#include "core/hardware_properties.h" #include "core/hardware_properties.h"
#include "core/hle/kernel/errors.h" #include "core/hle/kernel/errors.h"
@ -36,6 +28,11 @@
#include "core/hle/result.h" #include "core/hle/result.h"
#include "core/memory.h" #include "core/memory.h"
#ifdef ARCHITECTURE_x86_64
#include "core/arm/dynarmic/arm_dynarmic_32.h"
#include "core/arm/dynarmic/arm_dynarmic_64.h"
#endif
namespace Kernel { namespace Kernel {
bool Thread::ShouldWait(const Thread* thread) const { bool Thread::ShouldWait(const Thread* thread) const {
@ -540,13 +537,4 @@ ResultCode Thread::SetCoreAndAffinityMask(s32 new_core, u64 new_affinity_mask) {
return RESULT_SUCCESS; return RESULT_SUCCESS;
} }
////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Gets the current thread
*/
Thread* GetCurrentThread() {
return Core::System::GetInstance().CurrentScheduler().GetCurrentThread();
}
} // namespace Kernel } // namespace Kernel

View file

@ -680,9 +680,4 @@ private:
std::string name; std::string name;
}; };
/**
* Gets the current thread
*/
Thread* GetCurrentThread();
} // namespace Kernel } // namespace Kernel