mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Kernel: replace usage of Core::System::GetInstance().PrepareReschedule() with callback
This commit is contained in:
		
							parent
							
								
									eb050b8403
								
							
						
					
					
						commit
						20f47583f6
					
				
					 9 changed files with 25 additions and 13 deletions
				
			
		|  | @ -174,7 +174,8 @@ System::ResultStatus System::Init(EmuWindow& emu_window, u32 system_mode) { | ||||||
| 
 | 
 | ||||||
|     timing = std::make_unique<Timing>(); |     timing = std::make_unique<Timing>(); | ||||||
| 
 | 
 | ||||||
|     kernel = std::make_unique<Kernel::KernelSystem>(*memory, *timing, system_mode); |     kernel = std::make_unique<Kernel::KernelSystem>(*memory, *timing, | ||||||
|  |                                                     [this] { PrepareReschedule(); }, system_mode); | ||||||
| 
 | 
 | ||||||
|     if (Settings::values.use_cpu_jit) { |     if (Settings::values.use_cpu_jit) { | ||||||
| #ifdef ARCHITECTURE_x86_64 | #ifdef ARCHITECTURE_x86_64 | ||||||
|  |  | ||||||
|  | @ -16,8 +16,10 @@ | ||||||
| namespace Kernel { | namespace Kernel { | ||||||
| 
 | 
 | ||||||
| /// Initialize the kernel
 | /// Initialize the kernel
 | ||||||
| KernelSystem::KernelSystem(Memory::MemorySystem& memory, Core::Timing& timing, u32 system_mode) | KernelSystem::KernelSystem(Memory::MemorySystem& memory, Core::Timing& timing, | ||||||
|     : memory(memory), timing(timing) { |                            std::function<void()> prepare_reschedule_callback, u32 system_mode) | ||||||
|  |     : memory(memory), timing(timing), | ||||||
|  |       prepare_reschedule_callback(std::move(prepare_reschedule_callback)) { | ||||||
|     MemoryInit(system_mode); |     MemoryInit(system_mode); | ||||||
| 
 | 
 | ||||||
|     resource_limits = std::make_unique<ResourceLimitList>(*this); |     resource_limits = std::make_unique<ResourceLimitList>(*this); | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ | ||||||
| 
 | 
 | ||||||
| #include <array> | #include <array> | ||||||
| #include <atomic> | #include <atomic> | ||||||
|  | #include <functional> | ||||||
| #include <memory> | #include <memory> | ||||||
| #include <string> | #include <string> | ||||||
| #include <unordered_map> | #include <unordered_map> | ||||||
|  | @ -82,7 +83,8 @@ using SharedPtr = boost::intrusive_ptr<T>; | ||||||
| 
 | 
 | ||||||
| class KernelSystem { | class KernelSystem { | ||||||
| public: | public: | ||||||
|     explicit KernelSystem(Memory::MemorySystem& memory, Core::Timing& timing, u32 system_mode); |     explicit KernelSystem(Memory::MemorySystem& memory, Core::Timing& timing, | ||||||
|  |                           std::function<void()> prepare_reschedule_callback, u32 system_mode); | ||||||
|     ~KernelSystem(); |     ~KernelSystem(); | ||||||
| 
 | 
 | ||||||
|     /**
 |     /**
 | ||||||
|  | @ -228,6 +230,10 @@ public: | ||||||
|     /// Adds a port to the named port table
 |     /// Adds a port to the named port table
 | ||||||
|     void AddNamedPort(std::string name, SharedPtr<ClientPort> port); |     void AddNamedPort(std::string name, SharedPtr<ClientPort> port); | ||||||
| 
 | 
 | ||||||
|  |     void PrepareReschedule() { | ||||||
|  |         prepare_reschedule_callback(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /// Map of named ports managed by the kernel, which can be retrieved using the ConnectToPort
 |     /// Map of named ports managed by the kernel, which can be retrieved using the ConnectToPort
 | ||||||
|     std::unordered_map<std::string, SharedPtr<ClientPort>> named_ports; |     std::unordered_map<std::string, SharedPtr<ClientPort>> named_ports; | ||||||
| 
 | 
 | ||||||
|  | @ -238,6 +244,8 @@ public: | ||||||
| private: | private: | ||||||
|     void MemoryInit(u32 mem_type); |     void MemoryInit(u32 mem_type); | ||||||
| 
 | 
 | ||||||
|  |     std::function<void()> prepare_reschedule_callback; | ||||||
|  | 
 | ||||||
|     std::unique_ptr<ResourceLimitList> resource_limits; |     std::unique_ptr<ResourceLimitList> resource_limits; | ||||||
|     std::atomic<u32> next_object_id{0}; |     std::atomic<u32> next_object_id{0}; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -24,7 +24,7 @@ void ReleaseThreadMutexes(Thread* thread) { | ||||||
|     thread->held_mutexes.clear(); |     thread->held_mutexes.clear(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Mutex::Mutex(KernelSystem& kernel) : WaitObject(kernel) {} | Mutex::Mutex(KernelSystem& kernel) : WaitObject(kernel), kernel(kernel) {} | ||||||
| Mutex::~Mutex() {} | Mutex::~Mutex() {} | ||||||
| 
 | 
 | ||||||
| SharedPtr<Mutex> KernelSystem::CreateMutex(bool initial_locked, std::string name) { | SharedPtr<Mutex> KernelSystem::CreateMutex(bool initial_locked, std::string name) { | ||||||
|  | @ -54,7 +54,7 @@ void Mutex::Acquire(Thread* thread) { | ||||||
|         thread->held_mutexes.insert(this); |         thread->held_mutexes.insert(this); | ||||||
|         holding_thread = thread; |         holding_thread = thread; | ||||||
|         thread->UpdatePriority(); |         thread->UpdatePriority(); | ||||||
|         Core::System::GetInstance().PrepareReschedule(); |         kernel.PrepareReschedule(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     lock_count++; |     lock_count++; | ||||||
|  | @ -87,7 +87,7 @@ ResultCode Mutex::Release(Thread* thread) { | ||||||
|         holding_thread->UpdatePriority(); |         holding_thread->UpdatePriority(); | ||||||
|         holding_thread = nullptr; |         holding_thread = nullptr; | ||||||
|         WakeupAllWaitingThreads(); |         WakeupAllWaitingThreads(); | ||||||
|         Core::System::GetInstance().PrepareReschedule(); |         kernel.PrepareReschedule(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return RESULT_SUCCESS; |     return RESULT_SUCCESS; | ||||||
|  |  | ||||||
|  | @ -57,6 +57,7 @@ private: | ||||||
|     ~Mutex() override; |     ~Mutex() override; | ||||||
| 
 | 
 | ||||||
|     friend class KernelSystem; |     friend class KernelSystem; | ||||||
|  |     KernelSystem& kernel; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  |  | ||||||
|  | @ -224,7 +224,7 @@ void Thread::ResumeFromWait() { | ||||||
| 
 | 
 | ||||||
|     thread_manager.ready_queue.push_back(current_priority, this); |     thread_manager.ready_queue.push_back(current_priority, this); | ||||||
|     status = ThreadStatus::Ready; |     status = ThreadStatus::Ready; | ||||||
|     Core::System::GetInstance().PrepareReschedule(); |     thread_manager.kernel.PrepareReschedule(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ThreadManager::DebugThreadQueue() { | void ThreadManager::DebugThreadQueue() { | ||||||
|  |  | ||||||
|  | @ -21,8 +21,8 @@ TestEnvironment::TestEnvironment(bool mutable_memory_) | ||||||
|     Core::System::GetInstance().timing = std::make_unique<Core::Timing>(); |     Core::System::GetInstance().timing = std::make_unique<Core::Timing>(); | ||||||
|     Core::System::GetInstance().memory = std::make_unique<Memory::MemorySystem>(); |     Core::System::GetInstance().memory = std::make_unique<Memory::MemorySystem>(); | ||||||
|     Memory::MemorySystem& memory = *Core::System::GetInstance().memory; |     Memory::MemorySystem& memory = *Core::System::GetInstance().memory; | ||||||
|     Core::System::GetInstance().kernel = |     Core::System::GetInstance().kernel = std::make_unique<Kernel::KernelSystem>( | ||||||
|         std::make_unique<Kernel::KernelSystem>(memory, *Core::System::GetInstance().timing, 0); |         memory, *Core::System::GetInstance().timing, [] {}, 0); | ||||||
|     kernel = Core::System::GetInstance().kernel.get(); |     kernel = Core::System::GetInstance().kernel.get(); | ||||||
| 
 | 
 | ||||||
|     kernel->SetCurrentProcess(kernel->CreateProcess(kernel->CreateCodeSet("", 0))); |     kernel->SetCurrentProcess(kernel->CreateProcess(kernel->CreateCodeSet("", 0))); | ||||||
|  |  | ||||||
|  | @ -24,7 +24,7 @@ TEST_CASE("HLERequestContext::PopulateFromIncomingCommandBuffer", "[core][kernel | ||||||
|     // HACK: see comments of member timing
 |     // HACK: see comments of member timing
 | ||||||
|     Core::System::GetInstance().timing = std::make_unique<Core::Timing>(); |     Core::System::GetInstance().timing = std::make_unique<Core::Timing>(); | ||||||
|     auto memory = std::make_unique<Memory::MemorySystem>(); |     auto memory = std::make_unique<Memory::MemorySystem>(); | ||||||
|     Kernel::KernelSystem kernel(*memory, *Core::System::GetInstance().timing, 0); |     Kernel::KernelSystem kernel(*memory, *Core::System::GetInstance().timing, [] {}, 0); | ||||||
|     auto session = std::get<SharedPtr<ServerSession>>(kernel.CreateSessionPair()); |     auto session = std::get<SharedPtr<ServerSession>>(kernel.CreateSessionPair()); | ||||||
|     HLERequestContext context(std::move(session)); |     HLERequestContext context(std::move(session)); | ||||||
| 
 | 
 | ||||||
|  | @ -237,7 +237,7 @@ TEST_CASE("HLERequestContext::WriteToOutgoingCommandBuffer", "[core][kernel]") { | ||||||
|     // HACK: see comments of member timing
 |     // HACK: see comments of member timing
 | ||||||
|     Core::System::GetInstance().timing = std::make_unique<Core::Timing>(); |     Core::System::GetInstance().timing = std::make_unique<Core::Timing>(); | ||||||
|     auto memory = std::make_unique<Memory::MemorySystem>(); |     auto memory = std::make_unique<Memory::MemorySystem>(); | ||||||
|     Kernel::KernelSystem kernel(*memory, *Core::System::GetInstance().timing, 0); |     Kernel::KernelSystem kernel(*memory, *Core::System::GetInstance().timing, [] {}, 0); | ||||||
|     auto session = std::get<SharedPtr<ServerSession>>(kernel.CreateSessionPair()); |     auto session = std::get<SharedPtr<ServerSession>>(kernel.CreateSessionPair()); | ||||||
|     HLERequestContext context(std::move(session)); |     HLERequestContext context(std::move(session)); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ TEST_CASE("Memory::IsValidVirtualAddress", "[core][memory]") { | ||||||
|     Core::System::GetInstance().timing = std::make_unique<Core::Timing>(); |     Core::System::GetInstance().timing = std::make_unique<Core::Timing>(); | ||||||
|     Core::System::GetInstance().memory = std::make_unique<Memory::MemorySystem>(); |     Core::System::GetInstance().memory = std::make_unique<Memory::MemorySystem>(); | ||||||
|     Kernel::KernelSystem kernel(*Core::System::GetInstance().memory, |     Kernel::KernelSystem kernel(*Core::System::GetInstance().memory, | ||||||
|                                 *Core::System::GetInstance().timing, 0); |                                 *Core::System::GetInstance().timing, [] {}, 0); | ||||||
|     SECTION("these regions should not be mapped on an empty process") { |     SECTION("these regions should not be mapped on an empty process") { | ||||||
|         auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); |         auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); | ||||||
|         CHECK(Memory::IsValidVirtualAddress(*process, Memory::PROCESS_IMAGE_VADDR) == false); |         CHECK(Memory::IsValidVirtualAddress(*process, Memory::PROCESS_IMAGE_VADDR) == false); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue