diff --git a/externals/boost b/externals/boost index 48130d387..19ccdcc6f 160000 --- a/externals/boost +++ b/externals/boost @@ -1 +1 @@ -Subproject commit 48130d387975d17aed1b34ef75c21020f2d710a8 +Subproject commit 19ccdcc6fbd026f98ed83dea32ff0398120fbb32 diff --git a/src/common/archives.h b/src/common/archives.h index 490710d3c..f30886d90 100644 --- a/src/common/archives.h +++ b/src/common/archives.h @@ -12,3 +12,8 @@ template void A::serialize( \ oarchive & ar, \ const unsigned int file_version \ ); + +#define SERIALIZE_EXPORT_IMPL(A) \ +BOOST_SERIALIZATION_REGISTER_ARCHIVE(iarchive) \ +BOOST_SERIALIZATION_REGISTER_ARCHIVE(oarchive) \ +BOOST_CLASS_EXPORT_IMPLEMENT(A) diff --git a/src/core/hle/kernel/address_arbiter.cpp b/src/core/hle/kernel/address_arbiter.cpp index e52c0f272..c4fb4fd99 100644 --- a/src/core/hle/kernel/address_arbiter.cpp +++ b/src/core/hle/kernel/address_arbiter.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include +#include "common/archives.h" #include "common/common_types.h" #include "common/logging/log.h" #include "core/hle/kernel/address_arbiter.h" @@ -14,6 +15,8 @@ //////////////////////////////////////////////////////////////////////////////////////////////////// // Kernel namespace +SERIALIZE_EXPORT_IMPL(Kernel::AddressArbiter) + namespace Kernel { void AddressArbiter::WaitThread(std::shared_ptr thread, VAddr wait_address) { @@ -65,11 +68,12 @@ std::shared_ptr AddressArbiter::ResumeHighestPriorityThread(VAddr addres return thread; } -AddressArbiter::AddressArbiter(KernelSystem& kernel) : Object(kernel), kernel(kernel) {} +AddressArbiter::AddressArbiter() : kernel(*g_kernel) {} AddressArbiter::~AddressArbiter() {} std::shared_ptr KernelSystem::CreateAddressArbiter(std::string name) { - auto address_arbiter{std::make_shared(*this)}; + auto address_arbiter{std::make_shared()}; + address_arbiter->Init(*this); address_arbiter->name = std::move(name); diff --git a/src/core/hle/kernel/address_arbiter.h b/src/core/hle/kernel/address_arbiter.h index a4aff6a6e..3b29a84a4 100644 --- a/src/core/hle/kernel/address_arbiter.h +++ b/src/core/hle/kernel/address_arbiter.h @@ -6,6 +6,10 @@ #include #include +#include +#include +#include +#include #include "common/common_types.h" #include "core/hle/kernel/object.h" #include "core/hle/result.h" @@ -32,7 +36,7 @@ enum class ArbitrationType : u32 { class AddressArbiter final : public Object { public: - explicit AddressArbiter(KernelSystem& kernel); + explicit AddressArbiter(); ~AddressArbiter() override; std::string GetTypeName() const override { @@ -67,6 +71,17 @@ private: /// Threads waiting for the address arbiter to be signaled. std::vector> waiting_threads; + + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int file_version) + { + ar & boost::serialization::base_object(*this); + ar & name; + ar & waiting_threads; + } }; } // namespace Kernel + +BOOST_CLASS_EXPORT_KEY(Kernel::AddressArbiter) diff --git a/src/core/hle/kernel/object.h b/src/core/hle/kernel/object.h index 8998cb88d..6adba034e 100644 --- a/src/core/hle/kernel/object.h +++ b/src/core/hle/kernel/object.h @@ -8,6 +8,7 @@ #include #include #include +#include "common/serialization/atomic.h" #include "common/common_types.h" #include "core/hle/kernel/kernel.h"