Service serialization framework; done AC

This commit is contained in:
Hamish Milne 2019-12-24 22:39:02 +00:00 committed by zhupengfei
parent ac0337d8df
commit 3fd5c431f1
7 changed files with 51 additions and 47 deletions

2
TODO
View File

@ -61,7 +61,7 @@
Just need to figure out backing_mem (a u8*) Just need to figure out backing_mem (a u8*)
✔ Wait object @done(19-08-13 16:46) ✔ Wait object @done(19-08-13 16:46)
☐ Service @started(19-12-23 12:49) ☐ Service @started(19-12-23 12:49)
☐ AC @started(19-12-23 12:48) ✔ AC @started(19-12-23 12:48) @done(19-12-24 22:38) @lasted(1d9h50m3s)
☐ ACT ☐ ACT
☐ AM ☐ AM
☐ APT ☐ APT

View File

@ -1,9 +1,5 @@
#include <boost/serialization/serialization.hpp> #include <boost/serialization/serialization.hpp>
#define BOOST_SERIALIZATION_FRIENDS \
friend class boost::serialization::access; \
friend class construct_access;
class construct_access { class construct_access {
public: public:
template<class Archive, class T> template<class Archive, class T>

View File

@ -17,8 +17,6 @@
#include "core/hle/service/ac/ac_u.h" #include "core/hle/service/ac/ac_u.h"
#include "core/memory.h" #include "core/memory.h"
SERIALIZE_EXPORT_IMPL(Service::AC::Module::Interface)
namespace Service::AC { namespace Service::AC {
void Module::Interface::CreateDefaultConfig(Kernel::HLERequestContext& ctx) { void Module::Interface::CreateDefaultConfig(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx, 0x1, 0, 0); IPC::RequestParser rp(ctx, 0x1, 0, 0);
@ -182,4 +180,16 @@ void InstallInterfaces(Core::System& system) {
std::make_shared<AC_U>(ac)->InstallAsService(service_manager); std::make_shared<AC_U>(ac)->InstallAsService(service_manager);
} }
template <class Archive>
void Module::serialize(Archive& ar, const unsigned int)
{
ar & ac_connected;
ar & close_event;
ar & connect_event;
ar & disconnect_event;
// default_config is never written to
}
} // namespace Service::AC } // namespace Service::AC
SERIALIZE_IMPL(Service::AC::Module)

View File

@ -8,7 +8,6 @@
#include <memory> #include <memory>
#include <boost/serialization/base_object.hpp> #include <boost/serialization/base_object.hpp>
#include <boost/serialization/shared_ptr.hpp> #include <boost/serialization/shared_ptr.hpp>
#include "common/construct.h"
#include "core/hle/service/service.h" #include "core/hle/service/service.h"
namespace Core { namespace Core {
@ -19,6 +18,8 @@ namespace Kernel {
class Event; class Event;
} }
BOOST_SERIALIZATION_ASSUME_ABSTRACT(Service::AC::Module::Interface)
namespace Service::AC { namespace Service::AC {
class Module final { class Module final {
public: public:
@ -142,34 +143,6 @@ public:
protected: protected:
std::shared_ptr<Module> ac; std::shared_ptr<Module> ac;
private:
template <class Archive>
void save_construct(Archive& ar, const unsigned int file_version) const
{
ar << ac;
ar << GetServiceName();
ar << GetMaxSessions();
}
template <class Archive>
static void load_construct(Archive& ar, Interface* t, const unsigned int file_version)
{
std::shared_ptr<Module> ac;
std::string name;
u32 max_sessions;
ar >> ac;
ar >> name;
ar >> max_sessions;
::new(t)Interface(ac, name.c_str(), max_sessions);
}
template <class Archive>
void serialize(Archive& ar, const unsigned int file_version)
{
ar & boost::serialization::base_object<Kernel::SessionRequestHandler>(*this);
}
BOOST_SERIALIZATION_FRIENDS
}; };
protected: protected:
@ -187,20 +160,10 @@ protected:
private: 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 & ac_connected;
ar & close_event;
ar & connect_event;
ar & disconnect_event;
// default_config is never written to
}
friend class boost::serialization::access; friend class boost::serialization::access;
}; };
void InstallInterfaces(Core::System& system); void InstallInterfaces(Core::System& system);
} // namespace Service::AC } // namespace Service::AC
BOOST_SERIALIZATION_CONSTRUCT(Service::AC::Module::Interface)
BOOST_CLASS_EXPORT_KEY(Service::AC::Module::Interface)

View File

@ -3,6 +3,7 @@
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include "core/hle/service/ac/ac_i.h" #include "core/hle/service/ac/ac_i.h"
#include "common/archives.h"
namespace Service::AC { namespace Service::AC {
@ -33,3 +34,5 @@ AC_I::AC_I(std::shared_ptr<Module> ac) : Module::Interface(std::move(ac), "ac:i"
} }
} // namespace Service::AC } // namespace Service::AC
SERIALIZE_EXPORT_IMPL(Service::AC::AC_I)

View File

@ -5,6 +5,7 @@
#pragma once #pragma once
#include <memory> #include <memory>
#include <boost/serialization/base_object.hpp>
#include "core/hle/service/ac/ac.h" #include "core/hle/service/ac/ac.h"
namespace Service::AC { namespace Service::AC {
@ -12,6 +13,12 @@ namespace Service::AC {
class AC_I final : public Module::Interface { class AC_I final : public Module::Interface {
public: public:
explicit AC_I(std::shared_ptr<Module> ac); explicit AC_I(std::shared_ptr<Module> ac);
private:
SERVICE_SERIALIZATION(AC_I, ac)
}; };
} // namespace Service::AC } // namespace Service::AC
BOOST_CLASS_EXPORT_KEY(Service::AC::AC_I)
BOOST_SERIALIZATION_CONSTRUCT(Service::AC::AC_I)

View File

@ -10,7 +10,9 @@
#include <memory> #include <memory>
#include <string> #include <string>
#include <boost/container/flat_map.hpp> #include <boost/container/flat_map.hpp>
#include <boost/serialization/assume_abstract.hpp>
#include "common/common_types.h" #include "common/common_types.h"
#include "common/construct.h"
#include "core/hle/kernel/hle_ipc.h" #include "core/hle/kernel/hle_ipc.h"
#include "core/hle/kernel/object.h" #include "core/hle/kernel/object.h"
#include "core/hle/service/sm/sm.h" #include "core/hle/service/sm/sm.h"
@ -194,3 +196,26 @@ struct ServiceModuleInfo {
extern const std::array<ServiceModuleInfo, 40> service_module_map; extern const std::array<ServiceModuleInfo, 40> service_module_map;
} // namespace Service } // namespace Service
#define SERVICE_SERIALIZATION(T, MFIELD) \
template <class Archive> \
void save_construct(Archive& ar, const unsigned int file_version) const \
{ \
ar << MFIELD; \
} \
\
template <class Archive> \
static void load_construct(Archive& ar, T* t, const unsigned int file_version) \
{ \
std::shared_ptr<Module> MFIELD; \
ar >> MFIELD; \
::new(t)T(MFIELD); \
} \
\
template <class Archive> \
void serialize(Archive& ar, const unsigned int) \
{ \
ar & boost::serialization::base_object<Kernel::SessionRequestHandler>(*this); \
} \
friend class boost::serialization::access; \
friend class construct_access;