mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	kernel: Move object class to its own source files
General moving to keep kernel object types separate from the direct kernel code. Also essentially a preliminary cleanup before eliminating global kernel state in the kernel code.
This commit is contained in:
		
							parent
							
								
									47025552c7
								
							
						
					
					
						commit
						63c7b44ba8
					
				
					 30 changed files with 172 additions and 144 deletions
				
			
		|  | @ -6,7 +6,7 @@ | |||
| 
 | ||||
| #include <vector> | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/result.h" | ||||
| 
 | ||||
| // Address arbiters are an underlying kernel synchronization object that can be created/used via
 | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| #include "core/hle/kernel/client_session.h" | ||||
| #include "core/hle/kernel/errors.h" | ||||
| #include "core/hle/kernel/hle_ipc.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/server_port.h" | ||||
| #include "core/hle/kernel/server_session.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ | |||
| 
 | ||||
| #include <string> | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/result.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| #include <memory> | ||||
| #include <string> | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/result.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| #include <vector> | ||||
| #include "common/assert.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/thread.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/wait_object.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
|  |  | |||
|  | @ -7,7 +7,6 @@ | |||
| #include "common/logging/log.h" | ||||
| #include "core/hle/kernel/errors.h" | ||||
| #include "core/hle/kernel/handle_table.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
| #include "core/hle/kernel/thread.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| #include <array> | ||||
| #include <cstddef> | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/result.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ | |||
| #include "common/common_types.h" | ||||
| #include "common/swap.h" | ||||
| #include "core/hle/ipc.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/server_session.h" | ||||
| 
 | ||||
| namespace Service { | ||||
|  |  | |||
|  | @ -4,128 +4,10 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <cstddef> | ||||
| #include <string> | ||||
| #include <utility> | ||||
| #include <boost/smart_ptr/intrusive_ptr.hpp> | ||||
| #include "common/assert.h" | ||||
| #include "common/common_types.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| using Handle = u32; | ||||
| 
 | ||||
| enum class HandleType : u32 { | ||||
|     Unknown, | ||||
|     Event, | ||||
|     Mutex, | ||||
|     SharedMemory, | ||||
|     Thread, | ||||
|     Process, | ||||
|     AddressArbiter, | ||||
|     Semaphore, | ||||
|     Timer, | ||||
|     ResourceLimit, | ||||
|     CodeSet, | ||||
|     ClientPort, | ||||
|     ServerPort, | ||||
|     ClientSession, | ||||
|     ServerSession, | ||||
| }; | ||||
| 
 | ||||
| enum { | ||||
|     DEFAULT_STACK_SIZE = 0x4000, | ||||
| }; | ||||
| 
 | ||||
| enum class ResetType { | ||||
|     OneShot, | ||||
|     Sticky, | ||||
|     Pulse, | ||||
| }; | ||||
| 
 | ||||
| class Object : NonCopyable { | ||||
| public: | ||||
|     virtual ~Object() {} | ||||
| 
 | ||||
|     /// Returns a unique identifier for the object. For debugging purposes only.
 | ||||
|     unsigned int GetObjectId() const { | ||||
|         return object_id; | ||||
|     } | ||||
| 
 | ||||
|     virtual std::string GetTypeName() const { | ||||
|         return "[BAD KERNEL OBJECT TYPE]"; | ||||
|     } | ||||
|     virtual std::string GetName() const { | ||||
|         return "[UNKNOWN KERNEL OBJECT]"; | ||||
|     } | ||||
|     virtual Kernel::HandleType GetHandleType() const = 0; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Check if a thread can wait on the object | ||||
|      * @return True if a thread can wait on the object, otherwise false | ||||
|      */ | ||||
|     bool IsWaitable() const { | ||||
|         switch (GetHandleType()) { | ||||
|         case HandleType::Event: | ||||
|         case HandleType::Mutex: | ||||
|         case HandleType::Thread: | ||||
|         case HandleType::Semaphore: | ||||
|         case HandleType::Timer: | ||||
|         case HandleType::ServerPort: | ||||
|         case HandleType::ServerSession: | ||||
|             return true; | ||||
| 
 | ||||
|         case HandleType::Unknown: | ||||
|         case HandleType::SharedMemory: | ||||
|         case HandleType::Process: | ||||
|         case HandleType::AddressArbiter: | ||||
|         case HandleType::ResourceLimit: | ||||
|         case HandleType::CodeSet: | ||||
|         case HandleType::ClientPort: | ||||
|         case HandleType::ClientSession: | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         UNREACHABLE(); | ||||
|     } | ||||
| 
 | ||||
| public: | ||||
|     static unsigned int next_object_id; | ||||
| 
 | ||||
| private: | ||||
|     friend void intrusive_ptr_add_ref(Object*); | ||||
|     friend void intrusive_ptr_release(Object*); | ||||
| 
 | ||||
|     unsigned int ref_count = 0; | ||||
|     unsigned int object_id = next_object_id++; | ||||
| }; | ||||
| 
 | ||||
| // Special functions used by boost::instrusive_ptr to do automatic ref-counting
 | ||||
| inline void intrusive_ptr_add_ref(Object* object) { | ||||
|     ++object->ref_count; | ||||
| } | ||||
| 
 | ||||
| inline void intrusive_ptr_release(Object* object) { | ||||
|     if (--object->ref_count == 0) { | ||||
|         delete object; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| template <typename T> | ||||
| using SharedPtr = boost::intrusive_ptr<T>; | ||||
| 
 | ||||
| /**
 | ||||
|  * Attempts to downcast the given Object pointer to a pointer to T. | ||||
|  * @return Derived pointer to the object, or `nullptr` if `object` isn't of type T. | ||||
|  */ | ||||
| template <typename T> | ||||
| inline SharedPtr<T> DynamicObjectCast(SharedPtr<Object> object) { | ||||
|     if (object != nullptr && object->GetHandleType() == T::HANDLE_TYPE) { | ||||
|         return boost::static_pointer_cast<T>(std::move(object)); | ||||
|     } | ||||
|     return nullptr; | ||||
| } | ||||
| 
 | ||||
| /// Initialize the kernel with the specified system mode.
 | ||||
| void Init(u32 system_mode); | ||||
| 
 | ||||
|  |  | |||
|  | @ -10,6 +10,7 @@ | |||
| #include "core/hle/kernel/errors.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/mutex.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/thread.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
|  |  | |||
							
								
								
									
										37
									
								
								src/core/hle/kernel/object.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/core/hle/kernel/object.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,37 @@ | |||
| // Copyright 2018 Citra Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include "common/assert.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| Object::~Object() = default; | ||||
| 
 | ||||
| bool Object::IsWaitable() const { | ||||
|     switch (GetHandleType()) { | ||||
|     case HandleType::Event: | ||||
|     case HandleType::Mutex: | ||||
|     case HandleType::Thread: | ||||
|     case HandleType::Semaphore: | ||||
|     case HandleType::Timer: | ||||
|     case HandleType::ServerPort: | ||||
|     case HandleType::ServerSession: | ||||
|         return true; | ||||
| 
 | ||||
|     case HandleType::Unknown: | ||||
|     case HandleType::SharedMemory: | ||||
|     case HandleType::Process: | ||||
|     case HandleType::AddressArbiter: | ||||
|     case HandleType::ResourceLimit: | ||||
|     case HandleType::CodeSet: | ||||
|     case HandleType::ClientPort: | ||||
|     case HandleType::ClientSession: | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     UNREACHABLE(); | ||||
| } | ||||
| 
 | ||||
| } // namespace Kernel
 | ||||
							
								
								
									
										106
									
								
								src/core/hle/kernel/object.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								src/core/hle/kernel/object.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,106 @@ | |||
| // Copyright 2018 Citra Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <string> | ||||
| #include <utility> | ||||
| 
 | ||||
| #include <boost/smart_ptr/intrusive_ptr.hpp> | ||||
| 
 | ||||
| #include "common/common_types.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| using Handle = u32; | ||||
| 
 | ||||
| enum class HandleType : u32 { | ||||
|     Unknown, | ||||
|     Event, | ||||
|     Mutex, | ||||
|     SharedMemory, | ||||
|     Thread, | ||||
|     Process, | ||||
|     AddressArbiter, | ||||
|     Semaphore, | ||||
|     Timer, | ||||
|     ResourceLimit, | ||||
|     CodeSet, | ||||
|     ClientPort, | ||||
|     ServerPort, | ||||
|     ClientSession, | ||||
|     ServerSession, | ||||
| }; | ||||
| 
 | ||||
| enum { | ||||
|     DEFAULT_STACK_SIZE = 0x4000, | ||||
| }; | ||||
| 
 | ||||
| enum class ResetType { | ||||
|     OneShot, | ||||
|     Sticky, | ||||
|     Pulse, | ||||
| }; | ||||
| 
 | ||||
| class Object : NonCopyable { | ||||
| public: | ||||
|     virtual ~Object(); | ||||
| 
 | ||||
|     /// Returns a unique identifier for the object. For debugging purposes only.
 | ||||
|     unsigned int GetObjectId() const { | ||||
|         return object_id; | ||||
|     } | ||||
| 
 | ||||
|     virtual std::string GetTypeName() const { | ||||
|         return "[BAD KERNEL OBJECT TYPE]"; | ||||
|     } | ||||
|     virtual std::string GetName() const { | ||||
|         return "[UNKNOWN KERNEL OBJECT]"; | ||||
|     } | ||||
|     virtual HandleType GetHandleType() const = 0; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Check if a thread can wait on the object | ||||
|      * @return True if a thread can wait on the object, otherwise false | ||||
|      */ | ||||
|     bool IsWaitable() const; | ||||
| 
 | ||||
| public: | ||||
|     static unsigned int next_object_id; | ||||
| 
 | ||||
| private: | ||||
|     friend void intrusive_ptr_add_ref(Object*); | ||||
|     friend void intrusive_ptr_release(Object*); | ||||
| 
 | ||||
|     unsigned int ref_count = 0; | ||||
|     unsigned int object_id = next_object_id++; | ||||
| }; | ||||
| 
 | ||||
| // Special functions used by boost::instrusive_ptr to do automatic ref-counting
 | ||||
| inline void intrusive_ptr_add_ref(Object* object) { | ||||
|     ++object->ref_count; | ||||
| } | ||||
| 
 | ||||
| inline void intrusive_ptr_release(Object* object) { | ||||
|     if (--object->ref_count == 0) { | ||||
|         delete object; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| template <typename T> | ||||
| using SharedPtr = boost::intrusive_ptr<T>; | ||||
| 
 | ||||
| /**
 | ||||
|  * Attempts to downcast the given Object pointer to a pointer to T. | ||||
|  * @return Derived pointer to the object, or `nullptr` if `object` isn't of type T. | ||||
|  */ | ||||
| template <typename T> | ||||
| inline SharedPtr<T> DynamicObjectCast(SharedPtr<Object> object) { | ||||
|     if (object != nullptr && object->GetHandleType() == T::HANDLE_TYPE) { | ||||
|         return boost::static_pointer_cast<T>(std::move(object)); | ||||
|     } | ||||
|     return nullptr; | ||||
| } | ||||
| 
 | ||||
| } // namespace Kernel
 | ||||
|  | @ -12,7 +12,7 @@ | |||
| #include <boost/container/static_vector.hpp> | ||||
| #include "common/bit_field.h" | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/vm_manager.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| #include <string> | ||||
| #include <queue> | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/wait_object.h" | ||||
| #include "core/hle/result.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ | |||
| #include "common/assert.h" | ||||
| #include "core/hle/kernel/client_port.h" | ||||
| #include "core/hle/kernel/errors.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/server_port.h" | ||||
| #include "core/hle/kernel/server_session.h" | ||||
| #include "core/hle/kernel/thread.h" | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ | |||
| #include <string> | ||||
| #include <tuple> | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/wait_object.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ | |||
| #include <string> | ||||
| #include "common/assert.h" | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/wait_object.h" | ||||
| #include "core/hle/result.h" | ||||
| #include "core/memory.h" | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ | |||
| 
 | ||||
| #include <string> | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
| #include "core/hle/result.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ | |||
| #include <boost/container/flat_set.hpp> | ||||
| #include "common/common_types.h" | ||||
| #include "core/arm/arm_interface.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/wait_object.h" | ||||
| #include "core/hle/result.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| #include "common/logging/log.h" | ||||
| #include "core/core_timing.h" | ||||
| #include "core/hle/kernel/handle_table.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/thread.h" | ||||
| #include "core/hle/kernel/timer.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/wait_object.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| #include <vector> | ||||
| #include <boost/smart_ptr/intrusive_ptr.hpp> | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
|  |  | |||
|  | @ -10,11 +10,10 @@ | |||
| #include <string> | ||||
| #include <unordered_map> | ||||
| #include <boost/container/flat_map.hpp> | ||||
| #include "common/bit_field.h" | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/hle_ipc.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/service/sm/sm.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| 
 | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Namespace Service
 | ||||
|  |  | |||
|  | @ -4,9 +4,11 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include <unordered_map> | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| 
 | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/result.h" | ||||
| #include "core/hle/service/service.h" | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue