mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Kernel: pass ref to session pair
This commit is contained in:
		
							parent
							
								
									1213a298df
								
							
						
					
					
						commit
						13c26b4371
					
				
					 18 changed files with 71 additions and 48 deletions
				
			
		|  | @ -193,7 +193,7 @@ System::ResultStatus System::Init(EmuWindow& emu_window, u32 system_mode) { | ||||||
| 
 | 
 | ||||||
|     service_manager = std::make_shared<Service::SM::ServiceManager>(*this); |     service_manager = std::make_shared<Service::SM::ServiceManager>(*this); | ||||||
|     shared_page_handler = std::make_shared<SharedPage::Handler>(); |     shared_page_handler = std::make_shared<SharedPage::Handler>(); | ||||||
|     archive_manager = std::make_unique<Service::FS::ArchiveManager>(); |     archive_manager = std::make_unique<Service::FS::ArchiveManager>(*this); | ||||||
| 
 | 
 | ||||||
|     HW::Init(); |     HW::Init(); | ||||||
|     kernel = std::make_unique<Kernel::KernelSystem>(system_mode); |     kernel = std::make_unique<Kernel::KernelSystem>(system_mode); | ||||||
|  |  | ||||||
|  | @ -13,7 +13,7 @@ | ||||||
| 
 | 
 | ||||||
| namespace Kernel { | namespace Kernel { | ||||||
| 
 | 
 | ||||||
| ClientPort::ClientPort(KernelSystem& kernel) {} | ClientPort::ClientPort(KernelSystem& kernel) : kernel(kernel) {} | ||||||
| ClientPort::~ClientPort() = default; | ClientPort::~ClientPort() = default; | ||||||
| 
 | 
 | ||||||
| ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() { | ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() { | ||||||
|  | @ -26,7 +26,7 @@ ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() { | ||||||
|     active_sessions++; |     active_sessions++; | ||||||
| 
 | 
 | ||||||
|     // Create a new session pair, let the created sessions inherit the parent port's HLE handler.
 |     // Create a new session pair, let the created sessions inherit the parent port's HLE handler.
 | ||||||
|     auto sessions = ServerSession::CreateSessionPair(server_port->GetName(), this); |     auto sessions = kernel.CreateSessionPair(server_port->GetName(), this); | ||||||
| 
 | 
 | ||||||
|     if (server_port->hle_handler) |     if (server_port->hle_handler) | ||||||
|         server_port->hle_handler->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions)); |         server_port->hle_handler->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions)); | ||||||
|  |  | ||||||
|  | @ -51,6 +51,7 @@ private: | ||||||
|     explicit ClientPort(KernelSystem& kernel); |     explicit ClientPort(KernelSystem& kernel); | ||||||
|     ~ClientPort() override; |     ~ClientPort() override; | ||||||
| 
 | 
 | ||||||
|  |     KernelSystem& kernel; | ||||||
|     SharedPtr<ServerPort> server_port; ///< ServerPort associated with this client port.
 |     SharedPtr<ServerPort> server_port; ///< ServerPort associated with this client port.
 | ||||||
|     u32 max_sessions = 0;    ///< Maximum number of simultaneous sessions the port can have
 |     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
 |     u32 active_sessions = 0; ///< Number of currently open sessions to this port
 | ||||||
|  |  | ||||||
|  | @ -13,7 +13,7 @@ | ||||||
| 
 | 
 | ||||||
| namespace Kernel { | namespace Kernel { | ||||||
| 
 | 
 | ||||||
| ClientSession::ClientSession() = default; | ClientSession::ClientSession(KernelSystem& kernel) {} | ||||||
| ClientSession::~ClientSession() { | ClientSession::~ClientSession() { | ||||||
|     // This destructor will be called automatically when the last ClientSession handle is closed by
 |     // This destructor will be called automatically when the last ClientSession handle is closed by
 | ||||||
|     // the emulated application.
 |     // the emulated application.
 | ||||||
|  |  | ||||||
|  | @ -12,13 +12,12 @@ | ||||||
| 
 | 
 | ||||||
| namespace Kernel { | namespace Kernel { | ||||||
| 
 | 
 | ||||||
| class ServerSession; |  | ||||||
| class Session; | class Session; | ||||||
| class Thread; | class Thread; | ||||||
| 
 | 
 | ||||||
| class ClientSession final : public Object { | class ClientSession final : public Object { | ||||||
| public: | public: | ||||||
|     friend class ServerSession; |     friend class KernelSystem; | ||||||
| 
 | 
 | ||||||
|     std::string GetTypeName() const override { |     std::string GetTypeName() const override { | ||||||
|         return "ClientSession"; |         return "ClientSession"; | ||||||
|  | @ -46,7 +45,7 @@ public: | ||||||
|     std::shared_ptr<Session> parent; |     std::shared_ptr<Session> parent; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     ClientSession(); |     explicit ClientSession(KernelSystem& kernel); | ||||||
|     ~ClientSession() override; |     ~ClientSession() override; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -21,6 +21,8 @@ class Semaphore; | ||||||
| class Timer; | class Timer; | ||||||
| class ClientPort; | class ClientPort; | ||||||
| class ServerPort; | class ServerPort; | ||||||
|  | class ClientSession; | ||||||
|  | class ServerSession; | ||||||
| 
 | 
 | ||||||
| enum class ResetType { | enum class ResetType { | ||||||
|     OneShot, |     OneShot, | ||||||
|  | @ -105,6 +107,15 @@ public: | ||||||
|      */ |      */ | ||||||
|     std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair( |     std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair( | ||||||
|         u32 max_sessions, std::string name = "UnknownPort"); |         u32 max_sessions, std::string name = "UnknownPort"); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * Creates a pair of ServerSession and an associated ClientSession. | ||||||
|  |      * @param name        Optional name of the ports. | ||||||
|  |      * @param client_port Optional The ClientPort that spawned this session. | ||||||
|  |      * @return The created session tuple | ||||||
|  |      */ | ||||||
|  |     std::tuple<SharedPtr<ServerSession>, SharedPtr<ClientSession>> CreateSessionPair( | ||||||
|  |         const std::string& name = "Unknown", SharedPtr<ClientPort> client_port = nullptr); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } // namespace Kernel
 | } // namespace Kernel
 | ||||||
|  |  | ||||||
|  | @ -13,7 +13,7 @@ | ||||||
| 
 | 
 | ||||||
| namespace Kernel { | namespace Kernel { | ||||||
| 
 | 
 | ||||||
| ServerSession::ServerSession() = default; | ServerSession::ServerSession(KernelSystem& kernel) {} | ||||||
| ServerSession::~ServerSession() { | ServerSession::~ServerSession() { | ||||||
|     // This destructor will be called automatically when the last ServerSession handle is closed by
 |     // This destructor will be called automatically when the last ServerSession handle is closed by
 | ||||||
|     // the emulated application.
 |     // the emulated application.
 | ||||||
|  | @ -28,8 +28,8 @@ ServerSession::~ServerSession() { | ||||||
|     parent->server = nullptr; |     parent->server = nullptr; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ResultVal<SharedPtr<ServerSession>> ServerSession::Create(std::string name) { | ResultVal<SharedPtr<ServerSession>> ServerSession::Create(KernelSystem& kernel, std::string name) { | ||||||
|     SharedPtr<ServerSession> server_session(new ServerSession); |     SharedPtr<ServerSession> server_session(new ServerSession(kernel)); | ||||||
| 
 | 
 | ||||||
|     server_session->name = std::move(name); |     server_session->name = std::move(name); | ||||||
|     server_session->parent = nullptr; |     server_session->parent = nullptr; | ||||||
|  | @ -100,10 +100,10 @@ ResultCode ServerSession::HandleSyncRequest(SharedPtr<Thread> thread) { | ||||||
|     return RESULT_SUCCESS; |     return RESULT_SUCCESS; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ServerSession::SessionPair ServerSession::CreateSessionPair(const std::string& name, | std::tuple<SharedPtr<ServerSession>, SharedPtr<ClientSession>> KernelSystem::CreateSessionPair( | ||||||
|                                                             SharedPtr<ClientPort> port) { |     const std::string& name, SharedPtr<ClientPort> port) { | ||||||
|     auto server_session = ServerSession::Create(name + "_Server").Unwrap(); |     auto server_session = ServerSession::Create(*this, name + "_Server").Unwrap(); | ||||||
|     SharedPtr<ClientSession> client_session(new ClientSession); |     SharedPtr<ClientSession> client_session(new ClientSession(*this)); | ||||||
|     client_session->name = name + "_Client"; |     client_session->name = name + "_Client"; | ||||||
| 
 | 
 | ||||||
|     std::shared_ptr<Session> parent(new Session); |     std::shared_ptr<Session> parent(new Session); | ||||||
|  |  | ||||||
|  | @ -48,17 +48,6 @@ public: | ||||||
|         return HANDLE_TYPE; |         return HANDLE_TYPE; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     using SessionPair = std::tuple<SharedPtr<ServerSession>, SharedPtr<ClientSession>>; |  | ||||||
| 
 |  | ||||||
|     /**
 |  | ||||||
|      * Creates a pair of ServerSession and an associated ClientSession. |  | ||||||
|      * @param name        Optional name of the ports. |  | ||||||
|      * @param client_port Optional The ClientPort that spawned this session. |  | ||||||
|      * @return The created session tuple |  | ||||||
|      */ |  | ||||||
|     static SessionPair CreateSessionPair(const std::string& name = "Unknown", |  | ||||||
|                                          SharedPtr<ClientPort> client_port = nullptr); |  | ||||||
| 
 |  | ||||||
|     /**
 |     /**
 | ||||||
|      * Sets the HLE handler for the session. This handler will be called to service IPC requests |      * Sets the HLE handler for the session. This handler will be called to service IPC requests | ||||||
|      * instead of the regular IPC machinery. (The regular IPC machinery is currently not |      * instead of the regular IPC machinery. (The regular IPC machinery is currently not | ||||||
|  | @ -95,16 +84,20 @@ public: | ||||||
|     SharedPtr<Thread> currently_handling; |     SharedPtr<Thread> currently_handling; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     ServerSession(); |     explicit ServerSession(KernelSystem& kernel); | ||||||
|     ~ServerSession() override; |     ~ServerSession() override; | ||||||
| 
 | 
 | ||||||
|     /**
 |     /**
 | ||||||
|      * Creates a server session. The server session can have an optional HLE handler, |      * Creates a server session. The server session can have an optional HLE handler, | ||||||
|      * which will be invoked to handle the IPC requests that this session receives. |      * which will be invoked to handle the IPC requests that this session receives. | ||||||
|  |      * @param kernel The kernel instance to create the server session on | ||||||
|      * @param name Optional name of the server session. |      * @param name Optional name of the server session. | ||||||
|      * @return The created server session |      * @return The created server session | ||||||
|      */ |      */ | ||||||
|     static ResultVal<SharedPtr<ServerSession>> Create(std::string name = "Unknown"); |     static ResultVal<SharedPtr<ServerSession>> Create(KernelSystem& kernel, | ||||||
|  |                                                       std::string name = "Unknown"); | ||||||
|  | 
 | ||||||
|  |     friend class KernelSystem; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } // namespace Kernel
 | } // namespace Kernel
 | ||||||
|  |  | ||||||
|  | @ -1142,7 +1142,7 @@ static ResultCode CreateSessionToPort(Handle* out_client_session, Handle client_ | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static ResultCode CreateSession(Handle* server_session, Handle* client_session) { | static ResultCode CreateSession(Handle* server_session, Handle* client_session) { | ||||||
|     auto sessions = ServerSession::CreateSessionPair(); |     auto sessions = Core::System::GetInstance().Kernel().CreateSessionPair(); | ||||||
| 
 | 
 | ||||||
|     auto& server = std::get<SharedPtr<ServerSession>>(sessions); |     auto& server = std::get<SharedPtr<ServerSession>>(sessions); | ||||||
|     CASCADE_RESULT(*server_session, g_handle_table.Create(std::move(server))); |     CASCADE_RESULT(*server_session, g_handle_table.Create(std::move(server))); | ||||||
|  |  | ||||||
|  | @ -1026,8 +1026,8 @@ void Module::Interface::BeginImportProgram(Kernel::HLERequestContext& ctx) { | ||||||
|     // Create our CIAFile handle for the app to write to, and while the app writes
 |     // Create our CIAFile handle for the app to write to, and while the app writes
 | ||||||
|     // Citra will store contents out to sdmc/nand
 |     // Citra will store contents out to sdmc/nand
 | ||||||
|     const FileSys::Path cia_path = {}; |     const FileSys::Path cia_path = {}; | ||||||
|     auto file = |     auto file = std::make_shared<Service::FS::File>( | ||||||
|         std::make_shared<Service::FS::File>(std::make_unique<CIAFile>(media_type), cia_path); |         am->system, std::make_unique<CIAFile>(media_type), cia_path); | ||||||
| 
 | 
 | ||||||
|     am->cia_installing = true; |     am->cia_installing = true; | ||||||
| 
 | 
 | ||||||
|  | @ -1053,8 +1053,8 @@ void Module::Interface::BeginImportProgramTemporarily(Kernel::HLERequestContext& | ||||||
|     // Create our CIAFile handle for the app to write to, and while the app writes Citra will store
 |     // Create our CIAFile handle for the app to write to, and while the app writes Citra will store
 | ||||||
|     // contents out to sdmc/nand
 |     // contents out to sdmc/nand
 | ||||||
|     const FileSys::Path cia_path = {}; |     const FileSys::Path cia_path = {}; | ||||||
|     auto file = std::make_shared<Service::FS::File>(std::make_unique<CIAFile>(FS::MediaType::NAND), |     auto file = std::make_shared<Service::FS::File>( | ||||||
|                                                     cia_path); |         am->system, std::make_unique<CIAFile>(FS::MediaType::NAND), cia_path); | ||||||
| 
 | 
 | ||||||
|     am->cia_installing = true; |     am->cia_installing = true; | ||||||
| 
 | 
 | ||||||
|  | @ -1455,7 +1455,7 @@ void Module::Interface::GetMetaDataFromCia(Kernel::HLERequestContext& ctx) { | ||||||
|     rb.PushMappedBuffer(output_buffer); |     rb.PushMappedBuffer(output_buffer); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Module::Module(Core::System& system) { | Module::Module(Core::System& system) : system(system) { | ||||||
|     ScanForAllTitles(); |     ScanForAllTitles(); | ||||||
|     system_updater_mutex = system.Kernel().CreateMutex(false, "AM::SystemUpdaterMutex"); |     system_updater_mutex = system.Kernel().CreateMutex(false, "AM::SystemUpdaterMutex"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -573,6 +573,7 @@ private: | ||||||
|      */ |      */ | ||||||
|     void ScanForAllTitles(); |     void ScanForAllTitles(); | ||||||
| 
 | 
 | ||||||
|  |     Core::System& system; | ||||||
|     bool cia_installing = false; |     bool cia_installing = false; | ||||||
|     std::array<std::vector<u64_le>, 3> am_title_list; |     std::array<std::vector<u64_le>, 3> am_title_list; | ||||||
|     Kernel::SharedPtr<Kernel::Mutex> system_updater_mutex; |     Kernel::SharedPtr<Kernel::Mutex> system_updater_mutex; | ||||||
|  |  | ||||||
|  | @ -87,7 +87,7 @@ ResultVal<std::shared_ptr<File>> ArchiveManager::OpenFileFromArchive(ArchiveHand | ||||||
|     if (backend.Failed()) |     if (backend.Failed()) | ||||||
|         return backend.Code(); |         return backend.Code(); | ||||||
| 
 | 
 | ||||||
|     auto file = std::shared_ptr<File>(new File(std::move(backend).Unwrap(), path)); |     auto file = std::shared_ptr<File>(new File(system, std::move(backend).Unwrap(), path)); | ||||||
|     return MakeResult<std::shared_ptr<File>>(std::move(file)); |     return MakeResult<std::shared_ptr<File>>(std::move(file)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -348,7 +348,7 @@ void ArchiveManager::RegisterSelfNCCH(Loader::AppLoader& app_loader) { | ||||||
|     factory->Register(app_loader); |     factory->Register(app_loader); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ArchiveManager::ArchiveManager() { | ArchiveManager::ArchiveManager(Core::System& system) : system(system) { | ||||||
|     RegisterArchiveTypes(); |     RegisterArchiveTypes(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -24,6 +24,10 @@ namespace Loader { | ||||||
| class AppLoader; | class AppLoader; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | namespace Core { | ||||||
|  | class System; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| namespace Service::FS { | namespace Service::FS { | ||||||
| 
 | 
 | ||||||
| /// Supported archive types
 | /// Supported archive types
 | ||||||
|  | @ -50,7 +54,8 @@ using FileSys::ArchiveFactory; | ||||||
| 
 | 
 | ||||||
| class ArchiveManager { | class ArchiveManager { | ||||||
| public: | public: | ||||||
|     ArchiveManager(); |     explicit ArchiveManager(Core::System& system); | ||||||
|  | 
 | ||||||
|     /**
 |     /**
 | ||||||
|      * Opens an archive |      * Opens an archive | ||||||
|      * @param id_code IdCode of the archive to open |      * @param id_code IdCode of the archive to open | ||||||
|  | @ -224,6 +229,8 @@ public: | ||||||
|     void RegisterSelfNCCH(Loader::AppLoader& app_loader); |     void RegisterSelfNCCH(Loader::AppLoader& app_loader); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |     Core::System& system; | ||||||
|  | 
 | ||||||
|     /**
 |     /**
 | ||||||
|      * Registers an Archive type, instances of which can later be opened using its IdCode. |      * Registers an Archive type, instances of which can later be opened using its IdCode. | ||||||
|      * @param factory File system backend interface to the archive |      * @param factory File system backend interface to the archive | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ | ||||||
| // Refer to the license.txt file included.
 | // Refer to the license.txt file included.
 | ||||||
| 
 | 
 | ||||||
| #include "common/logging/log.h" | #include "common/logging/log.h" | ||||||
|  | #include "core/core.h" | ||||||
| #include "core/file_sys/errors.h" | #include "core/file_sys/errors.h" | ||||||
| #include "core/file_sys/file_backend.h" | #include "core/file_sys/file_backend.h" | ||||||
| #include "core/hle/ipc_helpers.h" | #include "core/hle/ipc_helpers.h" | ||||||
|  | @ -14,8 +15,9 @@ | ||||||
| 
 | 
 | ||||||
| namespace Service::FS { | namespace Service::FS { | ||||||
| 
 | 
 | ||||||
| File::File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path& path) | File::File(Core::System& system, std::unique_ptr<FileSys::FileBackend>&& backend, | ||||||
|     : ServiceFramework("", 1), path(path), backend(std::move(backend)) { |            const FileSys::Path& path) | ||||||
|  |     : ServiceFramework("", 1), path(path), backend(std::move(backend)), system(system) { | ||||||
|     static const FunctionInfo functions[] = { |     static const FunctionInfo functions[] = { | ||||||
|         {0x08010100, &File::OpenSubFile, "OpenSubFile"}, |         {0x08010100, &File::OpenSubFile, "OpenSubFile"}, | ||||||
|         {0x080200C2, &File::Read, "Read"}, |         {0x080200C2, &File::Read, "Read"}, | ||||||
|  | @ -195,7 +197,7 @@ void File::OpenLinkFile(Kernel::HLERequestContext& ctx) { | ||||||
|     using Kernel::SharedPtr; |     using Kernel::SharedPtr; | ||||||
|     IPC::RequestParser rp(ctx, 0x080C, 0, 0); |     IPC::RequestParser rp(ctx, 0x080C, 0, 0); | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|     auto sessions = ServerSession::CreateSessionPair(GetName()); |     auto sessions = system.Kernel().CreateSessionPair(GetName()); | ||||||
|     auto server = std::get<SharedPtr<ServerSession>>(sessions); |     auto server = std::get<SharedPtr<ServerSession>>(sessions); | ||||||
|     ClientConnected(server); |     ClientConnected(server); | ||||||
| 
 | 
 | ||||||
|  | @ -243,7 +245,7 @@ void File::OpenSubFile(Kernel::HLERequestContext& ctx) { | ||||||
|     using Kernel::ClientSession; |     using Kernel::ClientSession; | ||||||
|     using Kernel::ServerSession; |     using Kernel::ServerSession; | ||||||
|     using Kernel::SharedPtr; |     using Kernel::SharedPtr; | ||||||
|     auto sessions = ServerSession::CreateSessionPair(GetName()); |     auto sessions = system.Kernel().CreateSessionPair(GetName()); | ||||||
|     auto server = std::get<SharedPtr<ServerSession>>(sessions); |     auto server = std::get<SharedPtr<ServerSession>>(sessions); | ||||||
|     ClientConnected(server); |     ClientConnected(server); | ||||||
| 
 | 
 | ||||||
|  | @ -258,7 +260,7 @@ void File::OpenSubFile(Kernel::HLERequestContext& ctx) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Kernel::SharedPtr<Kernel::ClientSession> File::Connect() { | Kernel::SharedPtr<Kernel::ClientSession> File::Connect() { | ||||||
|     auto sessions = Kernel::ServerSession::CreateSessionPair(GetName()); |     auto sessions = system.Kernel().CreateSessionPair(GetName()); | ||||||
|     auto server = std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions); |     auto server = std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions); | ||||||
|     ClientConnected(server); |     ClientConnected(server); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -8,6 +8,10 @@ | ||||||
| #include "core/hle/kernel/kernel.h" | #include "core/hle/kernel/kernel.h" | ||||||
| #include "core/hle/service/service.h" | #include "core/hle/service/service.h" | ||||||
| 
 | 
 | ||||||
|  | namespace Core { | ||||||
|  | class System; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| namespace Service::FS { | namespace Service::FS { | ||||||
| 
 | 
 | ||||||
| struct FileSessionSlot : public Kernel::SessionRequestHandler::SessionDataBase { | struct FileSessionSlot : public Kernel::SessionRequestHandler::SessionDataBase { | ||||||
|  | @ -21,7 +25,8 @@ struct FileSessionSlot : public Kernel::SessionRequestHandler::SessionDataBase { | ||||||
| // Consider splitting ServiceFramework interface.
 | // Consider splitting ServiceFramework interface.
 | ||||||
| class File final : public ServiceFramework<File, FileSessionSlot> { | class File final : public ServiceFramework<File, FileSessionSlot> { | ||||||
| public: | public: | ||||||
|     File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path& path); |     File(Core::System& system, std::unique_ptr<FileSys::FileBackend>&& backend, | ||||||
|  |          const FileSys::Path& path); | ||||||
|     ~File() = default; |     ~File() = default; | ||||||
| 
 | 
 | ||||||
|     std::string GetName() const { |     std::string GetName() const { | ||||||
|  | @ -53,6 +58,8 @@ private: | ||||||
|     void GetPriority(Kernel::HLERequestContext& ctx); |     void GetPriority(Kernel::HLERequestContext& ctx); | ||||||
|     void OpenLinkFile(Kernel::HLERequestContext& ctx); |     void OpenLinkFile(Kernel::HLERequestContext& ctx); | ||||||
|     void OpenSubFile(Kernel::HLERequestContext& ctx); |     void OpenSubFile(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     Core::System& system; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } // namespace Service::FS
 | } // namespace Service::FS
 | ||||||
|  |  | ||||||
|  | @ -286,7 +286,7 @@ void FS_USER::OpenDirectory(Kernel::HLERequestContext& ctx) { | ||||||
|     rb.Push(dir_res.Code()); |     rb.Push(dir_res.Code()); | ||||||
|     if (dir_res.Succeeded()) { |     if (dir_res.Succeeded()) { | ||||||
|         std::shared_ptr<Directory> directory = *dir_res; |         std::shared_ptr<Directory> directory = *dir_res; | ||||||
|         auto sessions = ServerSession::CreateSessionPair(directory->GetName()); |         auto sessions = system.Kernel().CreateSessionPair(directory->GetName()); | ||||||
|         directory->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions)); |         directory->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions)); | ||||||
|         rb.PushMoveObjects(std::get<SharedPtr<ClientSession>>(sessions)); |         rb.PushMoveObjects(std::get<SharedPtr<ClientSession>>(sessions)); | ||||||
|     } else { |     } else { | ||||||
|  | @ -741,7 +741,8 @@ void FS_USER::GetSaveDataSecureValue(Kernel::HLERequestContext& ctx) { | ||||||
|     rb.Push<u64>(0);      // the secure value
 |     rb.Push<u64>(0);      // the secure value
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| FS_USER::FS_USER(ArchiveManager& archives) : ServiceFramework("fs:USER", 30), archives(archives) { | FS_USER::FS_USER(Core::System& system) | ||||||
|  |     : ServiceFramework("fs:USER", 30), system(system), archives(system.ArchiveManager()) { | ||||||
|     static const FunctionInfo functions[] = { |     static const FunctionInfo functions[] = { | ||||||
|         {0x000100C6, nullptr, "Dummy1"}, |         {0x000100C6, nullptr, "Dummy1"}, | ||||||
|         {0x040100C4, nullptr, "Control"}, |         {0x040100C4, nullptr, "Control"}, | ||||||
|  | @ -860,6 +861,6 @@ FS_USER::FS_USER(ArchiveManager& archives) : ServiceFramework("fs:USER", 30), ar | ||||||
| 
 | 
 | ||||||
| void InstallInterfaces(Core::System& system) { | void InstallInterfaces(Core::System& system) { | ||||||
|     auto& service_manager = system.ServiceManager(); |     auto& service_manager = system.ServiceManager(); | ||||||
|     std::make_shared<FS_USER>(system.ArchiveManager())->InstallAsService(service_manager); |     std::make_shared<FS_USER>(system)->InstallAsService(service_manager); | ||||||
| } | } | ||||||
| } // namespace Service::FS
 | } // namespace Service::FS
 | ||||||
|  |  | ||||||
|  | @ -17,7 +17,7 @@ class ArchiveManager; | ||||||
| 
 | 
 | ||||||
| class FS_USER final : public ServiceFramework<FS_USER> { | class FS_USER final : public ServiceFramework<FS_USER> { | ||||||
| public: | public: | ||||||
|     explicit FS_USER(ArchiveManager& archives); |     explicit FS_USER(Core::System& system); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     void Initialize(Kernel::HLERequestContext& ctx); |     void Initialize(Kernel::HLERequestContext& ctx); | ||||||
|  | @ -534,6 +534,7 @@ private: | ||||||
| 
 | 
 | ||||||
|     u32 priority = -1; ///< For SetPriority and GetPriority service functions
 |     u32 priority = -1; ///< For SetPriority and GetPriority service functions
 | ||||||
| 
 | 
 | ||||||
|  |     Core::System& system; | ||||||
|     ArchiveManager& archives; |     ArchiveManager& archives; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -22,7 +22,7 @@ static SharedPtr<Object> MakeObject(Kernel::KernelSystem& kernel) { | ||||||
| TEST_CASE("HLERequestContext::PopulateFromIncomingCommandBuffer", "[core][kernel]") { | TEST_CASE("HLERequestContext::PopulateFromIncomingCommandBuffer", "[core][kernel]") { | ||||||
|     CoreTiming::Init(); |     CoreTiming::Init(); | ||||||
|     Kernel::KernelSystem kernel(0); |     Kernel::KernelSystem kernel(0); | ||||||
|     auto session = std::get<SharedPtr<ServerSession>>(ServerSession::CreateSessionPair()); |     auto session = std::get<SharedPtr<ServerSession>>(kernel.CreateSessionPair()); | ||||||
|     HLERequestContext context(std::move(session)); |     HLERequestContext context(std::move(session)); | ||||||
| 
 | 
 | ||||||
|     auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); |     auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); | ||||||
|  | @ -232,7 +232,7 @@ TEST_CASE("HLERequestContext::PopulateFromIncomingCommandBuffer", "[core][kernel | ||||||
| TEST_CASE("HLERequestContext::WriteToOutgoingCommandBuffer", "[core][kernel]") { | TEST_CASE("HLERequestContext::WriteToOutgoingCommandBuffer", "[core][kernel]") { | ||||||
|     CoreTiming::Init(); |     CoreTiming::Init(); | ||||||
|     Kernel::KernelSystem kernel(0); |     Kernel::KernelSystem kernel(0); | ||||||
|     auto session = std::get<SharedPtr<ServerSession>>(ServerSession::CreateSessionPair()); |     auto session = std::get<SharedPtr<ServerSession>>(kernel.CreateSessionPair()); | ||||||
|     HLERequestContext context(std::move(session)); |     HLERequestContext context(std::move(session)); | ||||||
| 
 | 
 | ||||||
|     auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); |     auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue