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:
commit
0648e023ea
7 changed files with 26 additions and 35 deletions
|
@ -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)) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -680,9 +680,4 @@ private:
|
||||||
std::string name;
|
std::string name;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the current thread
|
|
||||||
*/
|
|
||||||
Thread* GetCurrentThread();
|
|
||||||
|
|
||||||
} // namespace Kernel
|
} // namespace Kernel
|
||||||
|
|
Loading…
Reference in a new issue