mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Use load_construct_data for kernel objects
This commit is contained in:
		
							parent
							
								
									3ed8d95866
								
							
						
					
					
						commit
						6917eaf53b
					
				
					 35 changed files with 158 additions and 113 deletions
				
			
		
							
								
								
									
										5
									
								
								TODO
									
										
									
									
									
								
							
							
						
						
									
										5
									
								
								TODO
									
										
									
									
									
								
							|  | @ -3,7 +3,7 @@ | |||
| ✔ Memory @done(19-08-13 15:41) | ||||
|     ☐ Page tables | ||||
|     ☐ Skip N3DS RAM if unused | ||||
| ✔ DSP @done(19-08-13 15:41) | ||||
| ☐ DSP | ||||
| ✔ Service manager @started(19-12-23 00:36) @done(19-12-23 11:38) @lasted(11h2m3s) | ||||
|     ✔ Fix or ignore inverse map @done(19-12-23 12:46) | ||||
| ☐ App loader | ||||
|  | @ -16,6 +16,7 @@ | |||
| ☐ Telemetry session | ||||
| ☐ Replace SERIALIZE_AS_POD with BOOST_IS_BITWISE_SERIALIZABLE | ||||
| ☐ Review constructor/initialization code | ||||
| ☐ Fix CI | ||||
| ✔ HW @done(19-08-13 15:41) | ||||
|     ✔ GPU regs @done(19-08-13 15:41) | ||||
|     ✔ LCD regs @done(19-08-13 15:41) | ||||
|  | @ -78,7 +79,7 @@ | |||
|         ✔ DSP @done(19-12-26 18:10) | ||||
|         ✔ ERR @done(19-12-26 18:14) | ||||
|         ✔ FRD @done(19-12-26 19:09) | ||||
|         ☐ FS | ||||
|         ✔ FS @done(19-12-27 11:46) | ||||
|         ☐ GSP | ||||
|         ☐ HID | ||||
|         ☐ HTTP | ||||
|  |  | |||
|  | @ -6,7 +6,6 @@ | |||
| 
 | ||||
| #include <memory> | ||||
| #include <vector> | ||||
| #include "boost/serialization/array.hpp" | ||||
| #include "audio_core/audio_types.h" | ||||
| #include "audio_core/time_stretch.h" | ||||
| #include "common/common_types.h" | ||||
|  |  | |||
|  | @ -54,6 +54,7 @@ add_custom_command(OUTPUT scm_rev.cpp | |||
| add_library(common STATIC | ||||
|     alignment.h | ||||
|     announce_multiplayer_room.h | ||||
|     archives.h | ||||
|     assert.h | ||||
|     detached_tasks.cpp | ||||
|     detached_tasks.h | ||||
|  | @ -66,6 +67,7 @@ add_library(common STATIC | |||
|     common_funcs.h | ||||
|     common_paths.h | ||||
|     common_types.h | ||||
|     construct.h | ||||
|     file_util.cpp | ||||
|     file_util.h | ||||
|     hash.h | ||||
|  | @ -91,8 +93,10 @@ add_library(common STATIC | |||
|     scm_rev.h | ||||
|     scope_exit.h | ||||
|     serialization/atomic.h | ||||
|     serialization/boost_discrete_interval.hpp | ||||
|     serialization/boost_flat_set.h | ||||
|     serialization/boost_vector.hpp | ||||
|     serialization/optional.h | ||||
|     string_util.cpp | ||||
|     string_util.h | ||||
|     swap.h | ||||
|  |  | |||
|  | @ -6,12 +6,12 @@ using iarchive = boost::archive::binary_iarchive; | |||
| using oarchive = boost::archive::binary_oarchive; | ||||
| 
 | ||||
| #define SERIALIZE_IMPL(A) template void A::serialize<iarchive>( \ | ||||
|     iarchive & ar, \ | ||||
|     const unsigned int file_version \ | ||||
| ); \ | ||||
| template void A::serialize<oarchive>( \ | ||||
|     oarchive & ar, \ | ||||
|     const unsigned int file_version \ | ||||
|     iarchive & ar,                                              \ | ||||
|     const unsigned int file_version                             \ | ||||
| );                                                              \ | ||||
| template void A::serialize<oarchive>(                           \ | ||||
|     oarchive & ar,                                              \ | ||||
|     const unsigned int file_version                             \ | ||||
| ); | ||||
| 
 | ||||
| #define SERIALIZE_EXPORT_IMPL(A) \ | ||||
|  |  | |||
|  | @ -12,20 +12,18 @@ public: | |||
|     } | ||||
| }; | ||||
| 
 | ||||
| #define BOOST_SERIALIZATION_CONSTRUCT(T) \ | ||||
| namespace boost { namespace serialization { \ | ||||
| \ | ||||
|     template<class Archive> \ | ||||
|     inline void save_construct_data( \ | ||||
|         Archive & ar, const T * t, const unsigned int file_version \ | ||||
|     ){ \ | ||||
|         construct_access::save_construct(ar, t, file_version); \ | ||||
|     } \ | ||||
| \ | ||||
|     template<class Archive> \ | ||||
|     inline void load_construct_data( \ | ||||
|         Archive & ar, T * t, const unsigned int file_version \ | ||||
|     ){ \ | ||||
|         construct_access::load_construct(ar, t, file_version); \ | ||||
|     } \ | ||||
| #define BOOST_SERIALIZATION_CONSTRUCT(T)                          \ | ||||
| namespace boost { namespace serialization {                       \ | ||||
| template<class Archive>                                           \ | ||||
| inline void save_construct_data(                                  \ | ||||
|     Archive & ar, const T * t, const unsigned int file_version    \ | ||||
| ){                                                                \ | ||||
|     construct_access::save_construct(ar, t, file_version);        \ | ||||
| }                                                                 \ | ||||
| template<class Archive>                                           \ | ||||
| inline void load_construct_data(                                  \ | ||||
|     Archive & ar, T * t, const unsigned int file_version          \ | ||||
| ){                                                                \ | ||||
|     construct_access::load_construct(ar, t, file_version);        \ | ||||
| }                                                                 \ | ||||
| }} | ||||
|  |  | |||
|  | @ -3,26 +3,26 @@ | |||
| #include <atomic> | ||||
| #include <boost/serialization/split_free.hpp> | ||||
| 
 | ||||
| namespace boost::serialization | ||||
| namespace boost::serialization { | ||||
| 
 | ||||
| template <class Archive, class T> | ||||
| void serialize(Archive& ar, std::atomic<T>& value, const unsigned int file_version) | ||||
| { | ||||
|     template <class Archive, class T> | ||||
|     void serialize(Archive& ar, std::atomic<T>& value, const unsigned int file_version) | ||||
|     { | ||||
|         boost::serialization::split_free(ar, value, file_version); | ||||
|     } | ||||
|     boost::serialization::split_free(ar, value, file_version); | ||||
| } | ||||
| 
 | ||||
|     template <class Archive, class T> | ||||
|     void save(Archive& ar, const std::atomic<T>& value, const unsigned int file_version) | ||||
|     { | ||||
|         ar << value.load(); | ||||
|     } | ||||
| template <class Archive, class T> | ||||
| void save(Archive& ar, const std::atomic<T>& value, const unsigned int file_version) | ||||
| { | ||||
|     ar << value.load(); | ||||
| } | ||||
| 
 | ||||
|     template <class Archive, class T> | ||||
|     void load(Archive& ar, std::atomic<T>& value, const unsigned int file_version) | ||||
|     { | ||||
|         T tmp; | ||||
|         ar >> tmp; | ||||
|         value.store(tmp); | ||||
|     } | ||||
| template <class Archive, class T> | ||||
| void load(Archive& ar, std::atomic<T>& value, const unsigned int file_version) | ||||
| { | ||||
|     T tmp; | ||||
|     ar >> tmp; | ||||
|     value.store(tmp); | ||||
| } | ||||
| 
 | ||||
| } // namespace boost::serialization
 | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
| 
 | ||||
| #include <memory> | ||||
| #include <utility> | ||||
| #include "boost/serialization/array.hpp" | ||||
| #include <boost/serialization/array.hpp> | ||||
| #include "audio_core/dsp_interface.h" | ||||
| #include "audio_core/hle/hle.h" | ||||
| #include "audio_core/lle/lle.h" | ||||
|  |  | |||
|  | @ -69,12 +69,11 @@ std::shared_ptr<Thread> AddressArbiter::ResumeHighestPriorityThread(VAddr addres | |||
|     return thread; | ||||
| } | ||||
| 
 | ||||
| AddressArbiter::AddressArbiter() : kernel(Core::Global<KernelSystem>()) {} | ||||
| AddressArbiter::AddressArbiter(KernelSystem& kernel) : Object(kernel), kernel(kernel) {} | ||||
| AddressArbiter::~AddressArbiter() {} | ||||
| 
 | ||||
| std::shared_ptr<AddressArbiter> KernelSystem::CreateAddressArbiter(std::string name) { | ||||
|     auto address_arbiter{std::make_shared<AddressArbiter>()}; | ||||
|     address_arbiter->Init(*this); | ||||
|     auto address_arbiter{std::make_shared<AddressArbiter>(*this)}; | ||||
| 
 | ||||
|     address_arbiter->name = std::move(name); | ||||
| 
 | ||||
|  |  | |||
|  | @ -36,7 +36,7 @@ enum class ArbitrationType : u32 { | |||
| 
 | ||||
| class AddressArbiter final : public Object { | ||||
| public: | ||||
|     explicit AddressArbiter(); | ||||
|     explicit AddressArbiter(KernelSystem& kernel); | ||||
|     ~AddressArbiter() override; | ||||
| 
 | ||||
|     std::string GetTypeName() const override { | ||||
|  | @ -85,3 +85,4 @@ private: | |||
| } // namespace Kernel
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(Kernel::AddressArbiter) | ||||
| CONSTRUCT_KERNEL_OBJECT(Kernel::AddressArbiter) | ||||
|  |  | |||
|  | @ -17,6 +17,9 @@ SERIALIZE_EXPORT_IMPL(Kernel::ClientPort) | |||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| ClientPort::ClientPort(KernelSystem& kernel) : Object(kernel), kernel(kernel) {} | ||||
| ClientPort::~ClientPort() = default; | ||||
| 
 | ||||
| ResultVal<std::shared_ptr<ClientSession>> ClientPort::Connect() { | ||||
|     // Note: Threads do not wait for the server endpoint to call
 | ||||
|     // AcceptSession before returning from this call.
 | ||||
|  | @ -27,7 +30,7 @@ ResultVal<std::shared_ptr<ClientSession>> ClientPort::Connect() { | |||
|     active_sessions++; | ||||
| 
 | ||||
|     // Create a new session pair, let the created sessions inherit the parent port's HLE handler.
 | ||||
|     auto [server, client] = Core::Global<KernelSystem>().CreateSessionPair(server_port->GetName(), SharedFrom(this)); | ||||
|     auto [server, client] = kernel.CreateSessionPair(server_port->GetName(), SharedFrom(this)); | ||||
| 
 | ||||
|     if (server_port->hle_handler) | ||||
|         server_port->hle_handler->ClientConnected(server); | ||||
|  |  | |||
|  | @ -18,6 +18,8 @@ class ClientSession; | |||
| 
 | ||||
| class ClientPort final : public Object { | ||||
| public: | ||||
|     explicit ClientPort(KernelSystem& kernel); | ||||
|     ~ClientPort() override; | ||||
| 
 | ||||
|     friend class ServerPort; | ||||
|     std::string GetTypeName() const override { | ||||
|  | @ -51,6 +53,7 @@ public: | |||
|     void ConnectionClosed(); | ||||
| 
 | ||||
| private: | ||||
|     KernelSystem& kernel; | ||||
|     std::shared_ptr<ServerPort> server_port; ///< ServerPort associated with this client port.
 | ||||
|     u32 max_sessions = 0;    ///< Maximum number of simultaneous sessions the port can have
 | ||||
|     u32 active_sessions = 0; ///< Number of currently open sessions to this port
 | ||||
|  | @ -75,3 +78,4 @@ private: | |||
| } // namespace Kernel
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(Kernel::ClientPort) | ||||
| CONSTRUCT_KERNEL_OBJECT(Kernel::ClientPort) | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ SERIALIZE_EXPORT_IMPL(Kernel::ClientSession) | |||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| ClientSession::ClientSession() = default; | ||||
| ClientSession::ClientSession(KernelSystem& kernel) : Object(kernel) {} | ||||
| ClientSession::~ClientSession() { | ||||
|     // This destructor will be called automatically when the last ClientSession handle is closed by
 | ||||
|     // the emulated application.
 | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ class Thread; | |||
| 
 | ||||
| class ClientSession final : public Object { | ||||
| public: | ||||
|     explicit ClientSession(); | ||||
|     explicit ClientSession(KernelSystem& kernel); | ||||
|     ~ClientSession() override; | ||||
| 
 | ||||
|     friend class KernelSystem; | ||||
|  | @ -64,3 +64,4 @@ private: | |||
| } // namespace Kernel
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(Kernel::ClientSession) | ||||
| CONSTRUCT_KERNEL_OBJECT(Kernel::ClientSession) | ||||
|  |  | |||
|  | @ -15,11 +15,11 @@ SERIALIZE_EXPORT_IMPL(Kernel::Event) | |||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| Event::Event() : WaitObject() {} | ||||
| Event::Event(KernelSystem& kernel) : WaitObject(kernel) {} | ||||
| Event::~Event() {} | ||||
| 
 | ||||
| std::shared_ptr<Event> KernelSystem::CreateEvent(ResetType reset_type, std::string name) { | ||||
|     auto evt{std::make_shared<Event>()}; | ||||
|     auto evt{std::make_shared<Event>(*this)}; | ||||
| 
 | ||||
|     evt->signaled = false; | ||||
|     evt->reset_type = reset_type; | ||||
|  |  | |||
|  | @ -13,7 +13,7 @@ namespace Kernel { | |||
| 
 | ||||
| class Event final : public WaitObject { | ||||
| public: | ||||
|     explicit Event(); | ||||
|     explicit Event(KernelSystem& kernel); | ||||
|     ~Event() override; | ||||
| 
 | ||||
|     std::string GetTypeName() const override { | ||||
|  | @ -65,3 +65,4 @@ private: | |||
| } // namespace Kernel
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(Kernel::Event) | ||||
| CONSTRUCT_KERNEL_OBJECT(Kernel::Event) | ||||
|  |  | |||
|  | @ -27,12 +27,11 @@ void ReleaseThreadMutexes(Thread* thread) { | |||
|     thread->held_mutexes.clear(); | ||||
| } | ||||
| 
 | ||||
| Mutex::Mutex() : kernel(Core::Global<KernelSystem>()) {} | ||||
| Mutex::Mutex(KernelSystem& kernel) : WaitObject(kernel), kernel(kernel) {} | ||||
| Mutex::~Mutex() {} | ||||
| 
 | ||||
| std::shared_ptr<Mutex> KernelSystem::CreateMutex(bool initial_locked, std::string name) { | ||||
|     auto mutex{std::make_shared<Mutex>()}; | ||||
|     mutex->Init(*this); | ||||
|     auto mutex{std::make_shared<Mutex>(*this)}; | ||||
| 
 | ||||
|     mutex->lock_count = 0; | ||||
|     mutex->name = std::move(name); | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ class Thread; | |||
| 
 | ||||
| class Mutex final : public WaitObject { | ||||
| public: | ||||
|     explicit Mutex(); | ||||
|     explicit Mutex(KernelSystem& kernel); | ||||
|     ~Mutex() override; | ||||
| 
 | ||||
|     std::string GetTypeName() const override { | ||||
|  | @ -81,3 +81,4 @@ void ReleaseThreadMutexes(Thread* thread); | |||
| } // namespace Kernel
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(Kernel::Mutex) | ||||
| CONSTRUCT_KERNEL_OBJECT(Kernel::Mutex) | ||||
|  |  | |||
|  | @ -8,17 +8,7 @@ | |||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| // TODO: Remove this
 | ||||
| Object::Object(KernelSystem& kernel) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| Object::Object() = default; | ||||
| 
 | ||||
| void Object::Init(KernelSystem& kernel) | ||||
| { | ||||
|     object_id = kernel.GenerateObjectID(); | ||||
| } | ||||
| Object::Object(KernelSystem& kernel) : object_id{kernel.GenerateObjectID()} {} | ||||
| 
 | ||||
| Object::~Object() = default; | ||||
| 
 | ||||
|  |  | |||
|  | @ -8,9 +8,12 @@ | |||
| #include <memory> | ||||
| #include <string> | ||||
| #include <boost/serialization/access.hpp> | ||||
| #include <boost/serialization/assume_abstract.hpp> | ||||
| #include <boost/serialization/export.hpp> | ||||
| #include "common/serialization/atomic.h" | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/global.h" | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
|  | @ -43,11 +46,8 @@ enum { | |||
| class Object : NonCopyable, public std::enable_shared_from_this<Object> { | ||||
| public: | ||||
|     explicit Object(KernelSystem& kernel); | ||||
|     Object(); | ||||
|     virtual ~Object(); | ||||
| 
 | ||||
|     virtual void Init(KernelSystem& kernel); | ||||
| 
 | ||||
|     /// Returns a unique identifier for the object. For debugging purposes only.
 | ||||
|     u32 GetObjectId() const { | ||||
|         return object_id.load(std::memory_order_relaxed); | ||||
|  | @ -99,3 +99,14 @@ inline std::shared_ptr<T> DynamicObjectCast(std::shared_ptr<Object> object) { | |||
| } | ||||
| 
 | ||||
| } // namespace Kernel
 | ||||
| 
 | ||||
| BOOST_SERIALIZATION_ASSUME_ABSTRACT(Kernel::Object) | ||||
| 
 | ||||
| #define CONSTRUCT_KERNEL_OBJECT(T)                                \ | ||||
| namespace boost::serialization {                                  \ | ||||
| template<class Archive>                                           \ | ||||
| inline void load_construct_data(                                  \ | ||||
|     Archive & ar, T * t, const unsigned int file_version          \ | ||||
| ){                                                                \ | ||||
|     ::new(t)T(Core::Global<Kernel::KernelSystem>());              \ | ||||
| }} | ||||
|  |  | |||
|  | @ -20,6 +20,9 @@ | |||
| #include "core/memory.h" | ||||
| #include "core/global.h" | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(Kernel::Process) | ||||
| SERIALIZE_EXPORT_IMPL(Kernel::CodeSet) | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| template <class Archive> | ||||
|  | @ -46,8 +49,7 @@ void Process::serialize(Archive& ar, const unsigned int file_version) | |||
| SERIALIZE_IMPL(Process) | ||||
| 
 | ||||
| std::shared_ptr<CodeSet> KernelSystem::CreateCodeSet(std::string name, u64 program_id) { | ||||
|     auto codeset{std::make_shared<CodeSet>()}; | ||||
|     codeset->Init(*this); | ||||
|     auto codeset{std::make_shared<CodeSet>(*this)}; | ||||
| 
 | ||||
|     codeset->name = std::move(name); | ||||
|     codeset->program_id = program_id; | ||||
|  | @ -55,9 +57,11 @@ std::shared_ptr<CodeSet> KernelSystem::CreateCodeSet(std::string name, u64 progr | |||
|     return codeset; | ||||
| } | ||||
| 
 | ||||
| CodeSet::CodeSet(KernelSystem& kernel) : Object(kernel) {} | ||||
| CodeSet::~CodeSet() {} | ||||
| 
 | ||||
| std::shared_ptr<Process> KernelSystem::CreateProcess(std::shared_ptr<CodeSet> code_set) { | ||||
|     auto process{std::make_shared<Process>()}; | ||||
|     process->Init(*this); | ||||
|     auto process{std::make_shared<Process>(*this)}; | ||||
| 
 | ||||
|     process->codeset = std::move(code_set); | ||||
|     process->flags.raw = 0; | ||||
|  | @ -428,12 +432,8 @@ ResultCode Process::Unmap(VAddr target, VAddr source, u32 size, VMAPermission pe | |||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| 
 | ||||
| Kernel::Process::Process() : Kernel::Process::Process(Core::Global<KernelSystem>()) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| Kernel::Process::Process(KernelSystem& kernel) : kernel(kernel), handle_table(kernel), vm_manager(kernel.memory) | ||||
| { | ||||
| Kernel::Process::Process(KernelSystem& kernel) | ||||
|     : Object(kernel), handle_table(kernel), vm_manager(kernel.memory), kernel(kernel) { | ||||
|     kernel.memory.RegisterPageTable(&vm_manager.page_table); | ||||
| } | ||||
| Kernel::Process::~Process() { | ||||
|  |  | |||
|  | @ -65,6 +65,9 @@ struct MemoryRegionInfo; | |||
| 
 | ||||
| class CodeSet final : public Object { | ||||
| public: | ||||
|     explicit CodeSet(KernelSystem& kernel); | ||||
|     ~CodeSet() override; | ||||
| 
 | ||||
|     struct Segment { | ||||
|         std::size_t offset = 0; | ||||
|         VAddr addr = 0; | ||||
|  | @ -143,8 +146,7 @@ private: | |||
| 
 | ||||
| class Process final : public Object { | ||||
| public: | ||||
|     Process(); | ||||
|     explicit Process(KernelSystem& kernel); | ||||
|     explicit Process(Kernel::KernelSystem& kernel); | ||||
|     ~Process() override; | ||||
| 
 | ||||
|     std::string GetTypeName() const override { | ||||
|  | @ -235,3 +237,8 @@ private: | |||
|     void serialize(Archive& ar, const unsigned int file_version); | ||||
| }; | ||||
| } // namespace Kernel
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(Kernel::CodeSet) | ||||
| BOOST_CLASS_EXPORT_KEY(Kernel::Process) | ||||
| CONSTRUCT_KERNEL_OBJECT(Kernel::CodeSet) | ||||
| CONSTRUCT_KERNEL_OBJECT(Kernel::Process) | ||||
|  |  | |||
|  | @ -3,15 +3,20 @@ | |||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include <cstring> | ||||
| #include "common/archives.h" | ||||
| #include "common/assert.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "core/hle/kernel/resource_limit.h" | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(Kernel::ResourceLimit) | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| ResourceLimit::ResourceLimit(KernelSystem& kernel) : Object(kernel) {} | ||||
| ResourceLimit::~ResourceLimit() {} | ||||
| 
 | ||||
| std::shared_ptr<ResourceLimit> ResourceLimit::Create(KernelSystem& kernel, std::string name) { | ||||
|     auto resource_limit{std::make_shared<ResourceLimit>()}; | ||||
|     resource_limit->Init(kernel); | ||||
|     auto resource_limit{std::make_shared<ResourceLimit>(kernel)}; | ||||
| 
 | ||||
|     resource_limit->name = std::move(name); | ||||
|     return resource_limit; | ||||
|  |  | |||
|  | @ -35,6 +35,8 @@ enum ResourceTypes { | |||
| 
 | ||||
| class ResourceLimit final : public Object { | ||||
| public: | ||||
|     explicit ResourceLimit(KernelSystem& kernel); | ||||
|     ~ResourceLimit() override; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Creates a resource limit object. | ||||
|  | @ -165,3 +167,6 @@ private: | |||
| }; | ||||
| 
 | ||||
| } // namespace Kernel
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(Kernel::ResourceLimit) | ||||
| CONSTRUCT_KERNEL_OBJECT(Kernel::ResourceLimit) | ||||
|  |  | |||
|  | @ -13,7 +13,7 @@ SERIALIZE_EXPORT_IMPL(Kernel::Semaphore) | |||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| Semaphore::Semaphore() : WaitObject() {} | ||||
| Semaphore::Semaphore(KernelSystem& kernel) : WaitObject(kernel) {} | ||||
| Semaphore::~Semaphore() {} | ||||
| 
 | ||||
| ResultVal<std::shared_ptr<Semaphore>> KernelSystem::CreateSemaphore(s32 initial_count, | ||||
|  | @ -23,7 +23,7 @@ ResultVal<std::shared_ptr<Semaphore>> KernelSystem::CreateSemaphore(s32 initial_ | |||
|     if (initial_count > max_count) | ||||
|         return ERR_INVALID_COMBINATION_KERNEL; | ||||
| 
 | ||||
|     auto semaphore{std::make_shared<Semaphore>()}; | ||||
|     auto semaphore{std::make_shared<Semaphore>(*this)}; | ||||
| 
 | ||||
|     // When the semaphore is created, some slots are reserved for other threads,
 | ||||
|     // and the rest is reserved for the caller thread
 | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ namespace Kernel { | |||
| 
 | ||||
| class Semaphore final : public WaitObject { | ||||
| public: | ||||
|     explicit Semaphore(); | ||||
|     explicit Semaphore(KernelSystem& kernel); | ||||
|     ~Semaphore() override; | ||||
| 
 | ||||
|     std::string GetTypeName() const override { | ||||
|  | @ -60,3 +60,4 @@ private: | |||
| } // namespace Kernel
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(Kernel::Semaphore) | ||||
| CONSTRUCT_KERNEL_OBJECT(Kernel::Semaphore) | ||||
|  |  | |||
|  | @ -17,6 +17,9 @@ SERIALIZE_EXPORT_IMPL(Kernel::ServerPort) | |||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| ServerPort::ServerPort(KernelSystem& kernel) : WaitObject(kernel) {} | ||||
| ServerPort::~ServerPort() {} | ||||
| 
 | ||||
| ResultVal<std::shared_ptr<ServerSession>> ServerPort::Accept() { | ||||
|     if (pending_sessions.empty()) { | ||||
|         return ERR_NO_PENDING_SESSIONS; | ||||
|  | @ -37,10 +40,8 @@ void ServerPort::Acquire(Thread* thread) { | |||
| } | ||||
| 
 | ||||
| KernelSystem::PortPair KernelSystem::CreatePortPair(u32 max_sessions, std::string name) { | ||||
|     auto server_port{std::make_shared<ServerPort>()}; | ||||
|     server_port->Init(*this); | ||||
|     auto client_port{std::make_shared<ClientPort>()}; | ||||
|     client_port->Init(*this); | ||||
|     auto server_port{std::make_shared<ServerPort>(*this)}; | ||||
|     auto client_port{std::make_shared<ClientPort>(*this)}; | ||||
| 
 | ||||
|     server_port->name = name + "_Server"; | ||||
|     client_port->name = name + "_Client"; | ||||
|  |  | |||
|  | @ -25,6 +25,8 @@ class SessionRequestHandler; | |||
| 
 | ||||
| class ServerPort final : public WaitObject { | ||||
| public: | ||||
|     explicit ServerPort(KernelSystem& kernel); | ||||
|     ~ServerPort() override; | ||||
| 
 | ||||
|     std::string GetTypeName() const override { | ||||
|         return "ServerPort"; | ||||
|  | @ -73,3 +75,4 @@ private: | |||
| } // namespace Kernel
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(Kernel::ServerPort) | ||||
| CONSTRUCT_KERNEL_OBJECT(Kernel::ServerPort) | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ SERIALIZE_EXPORT_IMPL(Kernel::ServerSession) | |||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| ServerSession::ServerSession() : kernel(Core::Global<KernelSystem>()) {} | ||||
| ServerSession::ServerSession(KernelSystem& kernel) : WaitObject(kernel), kernel(kernel) {} | ||||
| ServerSession::~ServerSession() { | ||||
|     // This destructor will be called automatically when the last ServerSession handle is closed by
 | ||||
|     // the emulated application.
 | ||||
|  | @ -33,8 +33,7 @@ ServerSession::~ServerSession() { | |||
| 
 | ||||
| ResultVal<std::shared_ptr<ServerSession>> ServerSession::Create(KernelSystem& kernel, | ||||
|                                                                 std::string name) { | ||||
|     auto server_session{std::make_shared<ServerSession>()}; | ||||
|     server_session->Init(kernel); | ||||
|     auto server_session{std::make_shared<ServerSession>(kernel)}; | ||||
| 
 | ||||
|     server_session->name = std::move(name); | ||||
|     server_session->parent = nullptr; | ||||
|  | @ -127,8 +126,7 @@ ResultCode ServerSession::HandleSyncRequest(std::shared_ptr<Thread> thread) { | |||
| KernelSystem::SessionPair KernelSystem::CreateSessionPair(const std::string& name, | ||||
|                                                           std::shared_ptr<ClientPort> port) { | ||||
|     auto server_session = ServerSession::Create(*this, name + "_Server").Unwrap(); | ||||
|     auto client_session{std::make_shared<ClientSession>()}; | ||||
|     client_session->Init(*this); | ||||
|     auto client_session{std::make_shared<ClientSession>(*this)}; | ||||
|     client_session->name = name + "_Client"; | ||||
| 
 | ||||
|     std::shared_ptr<Session> parent(new Session); | ||||
|  |  | |||
|  | @ -42,7 +42,7 @@ class Thread; | |||
| class ServerSession final : public WaitObject { | ||||
| public: | ||||
|     ~ServerSession() override; | ||||
|     explicit ServerSession(); | ||||
|     explicit ServerSession(KernelSystem& kernel); | ||||
| 
 | ||||
|     std::string GetName() const override { | ||||
|         return name; | ||||
|  | @ -125,3 +125,4 @@ private: | |||
| } // namespace Kernel
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(Kernel::ServerSession) | ||||
| CONSTRUCT_KERNEL_OBJECT(Kernel::ServerSession) | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ | |||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include <cstring> | ||||
| #include "common/archives.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "core/hle/kernel/errors.h" | ||||
| #include "core/hle/kernel/memory.h" | ||||
|  | @ -10,9 +11,11 @@ | |||
| #include "core/memory.h" | ||||
| #include "core/global.h" | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(Kernel::SharedMemory) | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| SharedMemory::SharedMemory() : Object(Core::Global<KernelSystem>()), kernel(Core::Global<KernelSystem>()) {} | ||||
| SharedMemory::SharedMemory(KernelSystem& kernel) : Object(kernel), kernel(kernel) {} | ||||
| SharedMemory::~SharedMemory() { | ||||
|     for (const auto& interval : holding_memory) { | ||||
|         kernel.GetMemoryRegion(MemoryRegion::SYSTEM) | ||||
|  | @ -28,7 +31,7 @@ SharedMemory::~SharedMemory() { | |||
| ResultVal<std::shared_ptr<SharedMemory>> KernelSystem::CreateSharedMemory( | ||||
|     Process* owner_process, u32 size, MemoryPermission permissions, | ||||
|     MemoryPermission other_permissions, VAddr address, MemoryRegion region, std::string name) { | ||||
|     auto shared_memory{std::make_shared<SharedMemory>()}; | ||||
|     auto shared_memory{std::make_shared<SharedMemory>(*this)}; | ||||
| 
 | ||||
|     shared_memory->owner_process = owner_process; | ||||
|     shared_memory->name = std::move(name); | ||||
|  | @ -73,7 +76,7 @@ ResultVal<std::shared_ptr<SharedMemory>> KernelSystem::CreateSharedMemory( | |||
| std::shared_ptr<SharedMemory> KernelSystem::CreateSharedMemoryForApplet( | ||||
|     u32 offset, u32 size, MemoryPermission permissions, MemoryPermission other_permissions, | ||||
|     std::string name) { | ||||
|     auto shared_memory{std::make_shared<SharedMemory>()}; | ||||
|     auto shared_memory{std::make_shared<SharedMemory>(*this)}; | ||||
| 
 | ||||
|     // Allocate memory in heap
 | ||||
|     MemoryRegionInfo* memory_region = GetMemoryRegion(MemoryRegion::SYSTEM); | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ namespace Kernel { | |||
| 
 | ||||
| class SharedMemory final : public Object { | ||||
| public: | ||||
|     explicit SharedMemory(); | ||||
|     explicit SharedMemory(KernelSystem& kernel); | ||||
|     ~SharedMemory() override; | ||||
| 
 | ||||
|     std::string GetTypeName() const override { | ||||
|  | @ -123,3 +123,6 @@ private: | |||
| }; | ||||
| 
 | ||||
| } // namespace Kernel
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(Kernel::SharedMemory) | ||||
| CONSTRUCT_KERNEL_OBJECT(Kernel::SharedMemory) | ||||
|  |  | |||
|  | @ -66,9 +66,9 @@ u32 ThreadManager::NewThreadId() { | |||
|     return next_thread_id++; | ||||
| } | ||||
| 
 | ||||
| Thread::Thread() | ||||
|     : context(Core::Global<KernelSystem>().GetThreadManager().NewContext()), | ||||
|       thread_manager(Core::Global<KernelSystem>().GetThreadManager()) {} | ||||
| Thread::Thread(KernelSystem& kernel) | ||||
|     : WaitObject(kernel), context(kernel.GetThreadManager().NewContext()), | ||||
|       thread_manager(kernel.GetThreadManager()) {} | ||||
| Thread::~Thread() {} | ||||
| 
 | ||||
| Thread* ThreadManager::GetCurrentThread() const { | ||||
|  | @ -338,8 +338,7 @@ ResultVal<std::shared_ptr<Thread>> KernelSystem::CreateThread(std::string name, | |||
|                           ErrorSummary::InvalidArgument, ErrorLevel::Permanent); | ||||
|     } | ||||
| 
 | ||||
|     auto thread{std::make_shared<Thread>()}; | ||||
|     thread->Init(*this); | ||||
|     auto thread{std::make_shared<Thread>(*this)}; | ||||
| 
 | ||||
|     thread_manager->thread_list.push_back(thread); | ||||
|     thread_manager->ready_queue.prepare(priority); | ||||
|  |  | |||
|  | @ -164,7 +164,7 @@ private: | |||
| 
 | ||||
| class Thread final : public WaitObject { | ||||
| public: | ||||
|     explicit Thread(); | ||||
|     explicit Thread(KernelSystem&); | ||||
|     ~Thread() override; | ||||
| 
 | ||||
|     std::string GetName() const override { | ||||
|  | @ -340,3 +340,4 @@ std::shared_ptr<Thread> SetupMainThread(KernelSystem& kernel, u32 entry_point, u | |||
| } // namespace Kernel
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(Kernel::Thread) | ||||
| CONSTRUCT_KERNEL_OBJECT(Kernel::Thread) | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ | |||
| 
 | ||||
| #include <cinttypes> | ||||
| #include <unordered_map> | ||||
| #include "common/archives.h" | ||||
| #include "common/assert.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "core/core.h" | ||||
|  | @ -13,17 +14,19 @@ | |||
| #include "core/hle/kernel/timer.h" | ||||
| #include "core/global.h" | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(Kernel::Timer) | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| Timer::Timer() : kernel(Core::Global<KernelSystem>()), timer_manager(Core::Global<KernelSystem>().GetTimerManager()) {} | ||||
| Timer::Timer(KernelSystem& kernel) | ||||
|     : WaitObject(kernel), kernel(kernel), timer_manager(kernel.GetTimerManager()) {} | ||||
| Timer::~Timer() { | ||||
|     Cancel(); | ||||
|     timer_manager.timer_callback_table.erase(callback_id); | ||||
| } | ||||
| 
 | ||||
| std::shared_ptr<Timer> KernelSystem::CreateTimer(ResetType reset_type, std::string name) { | ||||
|     auto timer{std::make_shared<Timer>()}; | ||||
|     timer->Init(*this); | ||||
|     auto timer{std::make_shared<Timer>(*this)}; | ||||
| 
 | ||||
|     timer->reset_type = reset_type; | ||||
|     timer->signaled = false; | ||||
|  |  | |||
|  | @ -46,7 +46,7 @@ private: | |||
| 
 | ||||
| class Timer final : public WaitObject { | ||||
| public: | ||||
|     explicit Timer(); | ||||
|     explicit Timer(KernelSystem& kernel); | ||||
|     ~Timer() override; | ||||
| 
 | ||||
|     std::string GetTypeName() const override { | ||||
|  | @ -127,3 +127,6 @@ private: | |||
| }; | ||||
| 
 | ||||
| } // namespace Kernel
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(Kernel::Timer) | ||||
| CONSTRUCT_KERNEL_OBJECT(Kernel::Timer) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue