mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	More base-derived fixes
This commit is contained in:
		
							parent
							
								
									996aba39fe
								
							
						
					
					
						commit
						9525d81344
					
				
					 23 changed files with 75 additions and 3 deletions
				
			
		
							
								
								
									
										5
									
								
								TODO
									
										
									
									
									
								
							
							
						
						
									
										5
									
								
								TODO
									
										
									
									
									
								
							|  | @ -7,6 +7,11 @@ | ||||||
| ☐ Review base class serialization everywhere | ☐ Review base class serialization everywhere | ||||||
|     Make sure that all base/derived relationships are registered |     Make sure that all base/derived relationships are registered | ||||||
| ☐ Serialize codeset with an apploader reference instead | ☐ Serialize codeset with an apploader reference instead | ||||||
|  | ☐ Additional stuff to serialize | ||||||
|  |     ☐ Self-NCCH archive | ||||||
|  |     ☐ File backends | ||||||
|  |     ☐ Directory backends | ||||||
|  |     ☐ File/directory 'services' | ||||||
| ✔ CPU @done(19-08-13 15:41) | ✔ CPU @done(19-08-13 15:41) | ||||||
| ✔ Memory @done(19-08-13 15:41) | ✔ Memory @done(19-08-13 15:41) | ||||||
|     ✔ Page tables @done(20-01-05 16:33) |     ✔ Page tables @done(20-01-05 16:33) | ||||||
|  |  | ||||||
|  | @ -60,6 +60,7 @@ private: | ||||||
|     ArchiveFactory_ExtSaveData() = default; |     ArchiveFactory_ExtSaveData() = default; | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) { |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<ArchiveFactory>(*this); | ||||||
|         ar& shared; |         ar& shared; | ||||||
|         ar& mount_point; |         ar& mount_point; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -116,7 +116,9 @@ public: | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) {} |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<ArchiveFactory>(*this); | ||||||
|  |     } | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -35,6 +35,7 @@ private: | ||||||
|     ArchiveFactory_OtherSaveDataPermitted() = default; |     ArchiveFactory_OtherSaveDataPermitted() = default; | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) { |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<ArchiveFactory>(*this); | ||||||
|         ar& sd_savedata_source; |         ar& sd_savedata_source; | ||||||
|     } |     } | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
|  | @ -62,6 +63,7 @@ private: | ||||||
|     ArchiveFactory_OtherSaveDataGeneral() = default; |     ArchiveFactory_OtherSaveDataGeneral() = default; | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) { |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<ArchiveFactory>(*this); | ||||||
|         ar& sd_savedata_source; |         ar& sd_savedata_source; | ||||||
|     } |     } | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
|  |  | ||||||
|  | @ -34,6 +34,7 @@ private: | ||||||
|     ArchiveFactory_SaveData() = default; |     ArchiveFactory_SaveData() = default; | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) { |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<ArchiveFactory>(*this); | ||||||
|         ar& sd_savedata_source; |         ar& sd_savedata_source; | ||||||
|     } |     } | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
|  |  | ||||||
|  | @ -81,6 +81,7 @@ private: | ||||||
|     ArchiveFactory_SDMC() = default; |     ArchiveFactory_SDMC() = default; | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) { |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<ArchiveFactory>(*this); | ||||||
|         ar& sdmc_directory; |         ar& sdmc_directory; | ||||||
|     } |     } | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
|  |  | ||||||
|  | @ -67,6 +67,7 @@ private: | ||||||
|     ArchiveFactory_SDMCWriteOnly() = default; |     ArchiveFactory_SDMCWriteOnly() = default; | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) { |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<ArchiveFactory>(*this); | ||||||
|         ar& sdmc_directory; |         ar& sdmc_directory; | ||||||
|     } |     } | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
|  |  | ||||||
|  | @ -47,6 +47,12 @@ private: | ||||||
|     /// Mapping of ProgramId -> NCCHData
 |     /// Mapping of ProgramId -> NCCHData
 | ||||||
|     std::unordered_map<u64, NCCHData> |     std::unordered_map<u64, NCCHData> | ||||||
|         ncch_data; // TODO: Remove this, or actually set the values here
 |         ncch_data; // TODO: Remove this, or actually set the values here
 | ||||||
|  | 
 | ||||||
|  |     template <class Archive> | ||||||
|  |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<ArchiveFactory>(*this); | ||||||
|  |     } | ||||||
|  |     friend class boost::serialization::access; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } // namespace FileSys
 | } // namespace FileSys
 | ||||||
|  |  | ||||||
|  | @ -37,6 +37,7 @@ private: | ||||||
|     ArchiveFactory_SystemSaveData() = default; |     ArchiveFactory_SystemSaveData() = default; | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) { |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<ArchiveFactory>(*this); | ||||||
|         ar& base_path; |         ar& base_path; | ||||||
|     } |     } | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
|  |  | ||||||
|  | @ -357,4 +357,5 @@ u64 SaveDataArchive::GetFreeBytes() const { | ||||||
| 
 | 
 | ||||||
| } // namespace FileSys
 | } // namespace FileSys
 | ||||||
| 
 | 
 | ||||||
|  | SERIALIZE_EXPORT_IMPL(FileSys::SaveDataArchive) | ||||||
| SERIALIZE_EXPORT_IMPL(FileSys::SaveDataDelayGenerator) | SERIALIZE_EXPORT_IMPL(FileSys::SaveDataDelayGenerator) | ||||||
|  |  | ||||||
|  | @ -38,10 +38,21 @@ public: | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
|     std::string mount_point; |     std::string mount_point; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     SaveDataArchive() = default; | ||||||
|  | 
 | ||||||
|  |     template <class Archive> | ||||||
|  |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<ArchiveBackend>(*this); | ||||||
|  |         ar& mount_point; | ||||||
|  |     } | ||||||
|  |     friend class boost::serialization::access; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class SaveDataDelayGenerator; | class SaveDataDelayGenerator; | ||||||
| 
 | 
 | ||||||
| } // namespace FileSys
 | } // namespace FileSys
 | ||||||
| 
 | 
 | ||||||
|  | BOOST_CLASS_EXPORT_KEY(FileSys::SaveDataArchive) | ||||||
| BOOST_CLASS_EXPORT_KEY(FileSys::SaveDataDelayGenerator) | BOOST_CLASS_EXPORT_KEY(FileSys::SaveDataDelayGenerator) | ||||||
|  |  | ||||||
|  | @ -70,6 +70,7 @@ private: | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int file_version) { |     void serialize(Archive& ar, const unsigned int file_version) { | ||||||
|  |         ar& boost::serialization::base_object<BackingMem>(*this); | ||||||
|         ar& boost::serialization::make_binary_object(&config_mem, sizeof(config_mem)); |         ar& boost::serialization::make_binary_object(&config_mem, sizeof(config_mem)); | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -50,6 +50,7 @@ private: | ||||||
| 
 | 
 | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) { |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<Kernel::WakeupCallback>(*this); | ||||||
|         ar& callback; |         ar& callback; | ||||||
|         ar& context; |         ar& context; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -222,6 +222,11 @@ public: | ||||||
|         virtual ~WakeupCallback() = default; |         virtual ~WakeupCallback() = default; | ||||||
|         virtual void WakeUp(std::shared_ptr<Thread> thread, HLERequestContext& context, |         virtual void WakeUp(std::shared_ptr<Thread> thread, HLERequestContext& context, | ||||||
|                             ThreadWakeupReason reason) = 0; |                             ThreadWakeupReason reason) = 0; | ||||||
|  | 
 | ||||||
|  |     private: | ||||||
|  |         template <class Archive> | ||||||
|  |         void serialize(Archive& ar, const unsigned int) {} | ||||||
|  |         friend class boost::serialization::access; | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     /**
 |     /**
 | ||||||
|  |  | ||||||
|  | @ -111,7 +111,7 @@ private: | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int file_version) { |     void serialize(Archive& ar, const unsigned int file_version) { | ||||||
|         ar& boost::serialization::base_object<Object>(*this); |         ar& boost::serialization::base_object<WaitObject>(*this); | ||||||
|         ar& name; |         ar& name; | ||||||
|         ar& parent; |         ar& parent; | ||||||
|         ar& hle_handler; |         ar& hle_handler; | ||||||
|  |  | ||||||
|  | @ -109,6 +109,7 @@ private: | ||||||
| 
 | 
 | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int file_version) { |     void serialize(Archive& ar, const unsigned int file_version) { | ||||||
|  |         ar& boost::serialization::base_object<Object>(*this); | ||||||
|         ar& linear_heap_phys_offset; |         ar& linear_heap_phys_offset; | ||||||
|         ar& backing_blocks; |         ar& backing_blocks; | ||||||
|         ar& size; |         ar& size; | ||||||
|  |  | ||||||
|  | @ -117,6 +117,7 @@ private: | ||||||
| 
 | 
 | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) { |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<BackingMem>(*this); | ||||||
|         ar& boost::serialization::make_binary_object(&shared_page, sizeof(shared_page)); |         ar& boost::serialization::make_binary_object(&shared_page, sizeof(shared_page)); | ||||||
|     } |     } | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
|  |  | ||||||
|  | @ -434,6 +434,7 @@ private: | ||||||
|     SVC_SyncCallback() = default; |     SVC_SyncCallback() = default; | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) { |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<Kernel::WakeupCallback>(*this); | ||||||
|         ar& do_output; |         ar& do_output; | ||||||
|     } |     } | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
|  | @ -466,7 +467,9 @@ private: | ||||||
|     SVC_IPCCallback() : system(Core::Global<Core::System>()) {} |     SVC_IPCCallback() : system(Core::Global<Core::System>()) {} | ||||||
| 
 | 
 | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) {} |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<Kernel::WakeupCallback>(*this); | ||||||
|  |     } | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -32,6 +32,7 @@ namespace Kernel { | ||||||
| 
 | 
 | ||||||
| template <class Archive> | template <class Archive> | ||||||
| void Thread::serialize(Archive& ar, const unsigned int file_version) { | void Thread::serialize(Archive& ar, const unsigned int file_version) { | ||||||
|  |     ar& boost::serialization::base_object<Object>(*this); | ||||||
|     ar&* context.get(); |     ar&* context.get(); | ||||||
|     ar& thread_id; |     ar& thread_id; | ||||||
|     ar& status; |     ar& status; | ||||||
|  |  | ||||||
|  | @ -66,6 +66,11 @@ public: | ||||||
|     virtual ~WakeupCallback() = default; |     virtual ~WakeupCallback() = default; | ||||||
|     virtual void WakeUp(ThreadWakeupReason reason, std::shared_ptr<Thread> thread, |     virtual void WakeUp(ThreadWakeupReason reason, std::shared_ptr<Thread> thread, | ||||||
|                         std::shared_ptr<WaitObject> object) = 0; |                         std::shared_ptr<WaitObject> object) = 0; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     template <class Archive> | ||||||
|  |     void serialize(Archive& ar, const unsigned int) {} | ||||||
|  |     friend class boost::serialization::access; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class ThreadManager { | class ThreadManager { | ||||||
|  |  | ||||||
|  | @ -1189,6 +1189,7 @@ private: | ||||||
| 
 | 
 | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) { |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<Kernel::HLERequestContext::WakeupCallback>(*this); | ||||||
|         ar& command_id; |         ar& command_id; | ||||||
|     } |     } | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
|  |  | ||||||
|  | @ -3,6 +3,9 @@ | ||||||
| // Refer to the license.txt file included.
 | // Refer to the license.txt file included.
 | ||||||
| 
 | 
 | ||||||
| #include <tuple> | #include <tuple> | ||||||
|  | #include <boost/serialization/shared_ptr.hpp> | ||||||
|  | #include <boost/serialization/string.hpp> | ||||||
|  | #include <boost/serialization/unordered_map.hpp> | ||||||
| #include "common/archives.h" | #include "common/archives.h" | ||||||
| #include "common/common_types.h" | #include "common/common_types.h" | ||||||
| #include "common/logging/log.h" | #include "common/logging/log.h" | ||||||
|  | @ -21,8 +24,19 @@ | ||||||
| #include "core/hle/service/sm/sm.h" | #include "core/hle/service/sm/sm.h" | ||||||
| #include "core/hle/service/sm/srv.h" | #include "core/hle/service/sm/srv.h" | ||||||
| 
 | 
 | ||||||
|  | SERVICE_CONSTRUCT_IMPL(Service::SM::SRV) | ||||||
|  | SERIALIZE_EXPORT_IMPL(Service::SM::SRV) | ||||||
|  | 
 | ||||||
| namespace Service::SM { | namespace Service::SM { | ||||||
| 
 | 
 | ||||||
|  | template <class Archive> | ||||||
|  | void SRV::serialize(Archive& ar, const unsigned int) { | ||||||
|  |     ar& boost::serialization::base_object<Kernel::SessionRequestHandler>(*this); | ||||||
|  |     ar& notification_semaphore; | ||||||
|  |     ar& get_service_handle_delayed_map; | ||||||
|  | } | ||||||
|  | SERIALIZE_IMPL(SRV) | ||||||
|  | 
 | ||||||
| constexpr int MAX_PENDING_NOTIFICATIONS = 16; | constexpr int MAX_PENDING_NOTIFICATIONS = 16; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -107,6 +121,7 @@ private: | ||||||
| 
 | 
 | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) { |     void serialize(Archive& ar, const unsigned int) { | ||||||
|  |         ar& boost::serialization::base_object<Kernel::HLERequestContext::WakeupCallback>(*this); | ||||||
|         ar& name; |         ar& name; | ||||||
|     } |     } | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
|  |  | ||||||
|  | @ -40,8 +40,14 @@ private: | ||||||
|     Core::System& system; |     Core::System& system; | ||||||
|     std::shared_ptr<Kernel::Semaphore> notification_semaphore; |     std::shared_ptr<Kernel::Semaphore> notification_semaphore; | ||||||
|     std::unordered_map<std::string, std::shared_ptr<Kernel::Event>> get_service_handle_delayed_map; |     std::unordered_map<std::string, std::shared_ptr<Kernel::Event>> get_service_handle_delayed_map; | ||||||
|  | 
 | ||||||
|  |     template <class Archive> | ||||||
|  |     void serialize(Archive& ar, const unsigned int); | ||||||
|  |     friend class boost::serialization::access; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } // namespace Service::SM
 | } // namespace Service::SM
 | ||||||
| 
 | 
 | ||||||
|  | SERVICE_CONSTRUCT(Service::SM::SRV) | ||||||
|  | BOOST_CLASS_EXPORT_KEY(Service::SM::SRV) | ||||||
| BOOST_CLASS_EXPORT_KEY(Service::SM::SRV::ThreadCallback) | BOOST_CLASS_EXPORT_KEY(Service::SM::SRV::ThreadCallback) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue