mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Fixed the codestyle to match our clang-format rules.
This commit is contained in:
		
							parent
							
								
									ebbb55ec8f
								
							
						
					
					
						commit
						016307ae65
					
				
					 16 changed files with 108 additions and 68 deletions
				
			
		|  | @ -139,7 +139,7 @@ union MappedBufferDescInfo { | |||
| }; | ||||
| 
 | ||||
| inline MappedBufferDescInfo ParseMappedBufferDesc(const u32 desc) { | ||||
|     return{ desc }; | ||||
|     return {desc}; | ||||
| } | ||||
| 
 | ||||
| inline DescriptorType GetDescriptorType(u32 descriptor) { | ||||
|  |  | |||
|  | @ -19,7 +19,8 @@ ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() { | |||
|     // AcceptSession before returning from this call.
 | ||||
| 
 | ||||
|     if (active_sessions >= max_sessions) { | ||||
|         // TODO(Subv): Return an error code in this situation after session disconnection is implemented.
 | ||||
|         // TODO(Subv): Return an error code in this situation after session disconnection is
 | ||||
|         // implemented.
 | ||||
|         /*return ResultCode(ErrorDescription::MaxConnectionsReached,
 | ||||
|                           ErrorModule::OS, ErrorSummary::WouldBlock, | ||||
|                           ErrorLevel::Temporary);*/ | ||||
|  | @ -27,7 +28,8 @@ ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() { | |||
|     active_sessions++; | ||||
| 
 | ||||
|     // Create a new session pair, let the created sessions inherit the parent port's HLE handler.
 | ||||
|     auto sessions = ServerSession::CreateSessionPair(server_port->GetName(), server_port->hle_handler); | ||||
|     auto sessions = | ||||
|         ServerSession::CreateSessionPair(server_port->GetName(), server_port->hle_handler); | ||||
|     auto client_session = std::get<SharedPtr<ClientSession>>(sessions); | ||||
|     auto server_session = std::get<SharedPtr<ServerSession>>(sessions); | ||||
| 
 | ||||
|  |  | |||
|  | @ -29,8 +29,9 @@ public: | |||
|     } | ||||
| 
 | ||||
|     /**
 | ||||
|      * Creates a new Session pair, adds the created ServerSession to the associated ServerPort's list of pending sessions, | ||||
|      * and signals the ServerPort, causing any threads waiting on it to awake. | ||||
|      * Creates a new Session pair, adds the created ServerSession to the associated ServerPort's | ||||
|      * list of pending sessions, and signals the ServerPort, causing any threads | ||||
|      * waiting on it to awake. | ||||
|      * @returns ClientSession The client endpoint of the created Session pair, or error code. | ||||
|      */ | ||||
|     ResultVal<SharedPtr<ClientSession>> Connect(); | ||||
|  |  | |||
|  | @ -11,16 +11,19 @@ namespace Kernel { | |||
| 
 | ||||
| ClientSession::ClientSession() = default; | ||||
| ClientSession::~ClientSession() { | ||||
|     // This destructor will be called automatically when the last ClientSession handle is closed by the emulated application.
 | ||||
|     // This destructor will be called automatically when the last ClientSession handle is closed by
 | ||||
|     // the emulated application.
 | ||||
| 
 | ||||
|     if (server_session->hle_handler) | ||||
|         server_session->hle_handler->ClientDisconnected(server_session); | ||||
| 
 | ||||
|     // TODO(Subv): If the session is still open, set the connection status to 2 (Closed by client),
 | ||||
|     // wake up all the ServerSession's waiting threads and set the WaitSynchronization result to 0xC920181A.
 | ||||
|     // wake up all the ServerSession's waiting threads and set the WaitSynchronization result to
 | ||||
|     // 0xC920181A.
 | ||||
| } | ||||
| 
 | ||||
| ResultVal<SharedPtr<ClientSession>> ClientSession::Create(ServerSession* server_session, std::string name) { | ||||
| ResultVal<SharedPtr<ClientSession>> ClientSession::Create(ServerSession* server_session, | ||||
|                                                           std::string name) { | ||||
|     SharedPtr<ClientSession> client_session(new ClientSession); | ||||
| 
 | ||||
|     client_session->name = std::move(name); | ||||
|  |  | |||
|  | @ -4,8 +4,8 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <string> | ||||
| #include <memory> | ||||
| #include <string> | ||||
| 
 | ||||
| #include "common/common_types.h" | ||||
| 
 | ||||
|  | @ -44,9 +44,9 @@ public: | |||
|      */ | ||||
|     ResultCode SendSyncRequest(); | ||||
| 
 | ||||
|     std::string name;                           ///< Name of client port (optional)
 | ||||
|     ServerSession* server_session;              ///< The server session associated with this client session.
 | ||||
|     SessionStatus session_status;               ///< The session's current status.
 | ||||
|     std::string name;              ///< Name of client port (optional)
 | ||||
|     ServerSession* server_session; ///< The server session associated with this client session.
 | ||||
|     SessionStatus session_status;  ///< The session's current status.
 | ||||
| 
 | ||||
| private: | ||||
|     ClientSession(); | ||||
|  | @ -58,7 +58,8 @@ private: | |||
|      * @param name Optional name of client session | ||||
|      * @return The created client session | ||||
|      */ | ||||
|     static ResultVal<SharedPtr<ClientSession>> Create(ServerSession* server_session, std::string name = "Unknown"); | ||||
|     static ResultVal<SharedPtr<ClientSession>> Create(ServerSession* server_session, | ||||
|                                                       std::string name = "Unknown"); | ||||
| }; | ||||
| 
 | ||||
| } // namespace
 | ||||
|  |  | |||
|  | @ -24,7 +24,8 @@ void ServerPort::Acquire() { | |||
| } | ||||
| 
 | ||||
| std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> ServerPort::CreatePortPair( | ||||
|     u32 max_sessions, std::string name, std::shared_ptr<Service::SessionRequestHandler> hle_handler) { | ||||
|     u32 max_sessions, std::string name, | ||||
|     std::shared_ptr<Service::SessionRequestHandler> hle_handler) { | ||||
| 
 | ||||
|     SharedPtr<ServerPort> server_port(new ServerPort); | ||||
|     SharedPtr<ClientPort> client_port(new ClientPort); | ||||
|  |  | |||
|  | @ -12,12 +12,14 @@ namespace Kernel { | |||
| 
 | ||||
| ServerSession::ServerSession() = default; | ||||
| ServerSession::~ServerSession() { | ||||
|     // This destructor will be called automatically when the last ServerSession handle is closed by the emulated application.
 | ||||
|     // This destructor will be called automatically when the last ServerSession handle is closed by
 | ||||
|     // the emulated application.
 | ||||
|     // TODO(Subv): Reduce the ClientPort's connection count,
 | ||||
|     // if the session is still open, set the connection status to 3 (Closed by server),
 | ||||
| } | ||||
| 
 | ||||
| ResultVal<SharedPtr<ServerSession>> ServerSession::Create(std::string name, std::shared_ptr<Service::SessionRequestHandler> hle_handler) { | ||||
| ResultVal<SharedPtr<ServerSession>> ServerSession::Create( | ||||
|     std::string name, std::shared_ptr<Service::SessionRequestHandler> hle_handler) { | ||||
|     SharedPtr<ServerSession> server_session(new ServerSession); | ||||
| 
 | ||||
|     server_session->name = std::move(name); | ||||
|  | @ -38,7 +40,8 @@ void ServerSession::Acquire() { | |||
| 
 | ||||
| ResultCode ServerSession::HandleSyncRequest() { | ||||
|     // The ServerSession received a sync request, this means that there's new data available
 | ||||
|     // from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or similar.
 | ||||
|     // from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or
 | ||||
|     // similar.
 | ||||
| 
 | ||||
|     // If this ServerSession has an associated HLE handler, forward the request to it.
 | ||||
|     if (hle_handler != nullptr) { | ||||
|  | @ -50,17 +53,20 @@ ResultCode ServerSession::HandleSyncRequest() { | |||
|         // TODO(Subv): Translate the response command buffer.
 | ||||
|     } | ||||
| 
 | ||||
|     // If this ServerSession does not have an HLE implementation, just wake up the threads waiting on it.
 | ||||
|     // If this ServerSession does not have an HLE implementation, just wake up the threads waiting
 | ||||
|     // on it.
 | ||||
|     signaled = true; | ||||
|     WakeupAllWaitingThreads(); | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| 
 | ||||
| ServerSession::SessionPair ServerSession::CreateSessionPair(const std::string& name, | ||||
|                                                             std::shared_ptr<Service::SessionRequestHandler> hle_handler) { | ||||
|     auto server_session = ServerSession::Create(name + "_Server", std::move(hle_handler)).MoveFrom(); | ||||
|     // We keep a non-owning pointer to the ServerSession in the ClientSession because we don't want to prevent the
 | ||||
|     // ServerSession's destructor from being called when the emulated application closes the last ServerSession handle.
 | ||||
| ServerSession::SessionPair ServerSession::CreateSessionPair( | ||||
|     const std::string& name, std::shared_ptr<Service::SessionRequestHandler> hle_handler) { | ||||
|     auto server_session = | ||||
|         ServerSession::Create(name + "_Server", std::move(hle_handler)).MoveFrom(); | ||||
|     // We keep a non-owning pointer to the ServerSession in the ClientSession because we don't want
 | ||||
|     // to prevent the ServerSession's destructor from being called when the emulated
 | ||||
|     // application closes the last ServerSession handle.
 | ||||
|     auto client_session = ClientSession::Create(server_session.get(), name + "_Client").MoveFrom(); | ||||
| 
 | ||||
|     return std::make_tuple(std::move(server_session), std::move(client_session)); | ||||
|  | @ -70,5 +76,4 @@ ResultCode TranslateHLERequest(ServerSession* server_session) { | |||
|     // TODO(Subv): Implement this function once multiple concurrent processes are supported.
 | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -24,10 +24,10 @@ class ClientSession; | |||
|  * | ||||
|  * To make a service call, the client must write the command header and parameters to the buffer | ||||
|  * located at offset 0x80 of the TLS (Thread-Local Storage) area, then execute a SendSyncRequest | ||||
|  * SVC call with its ClientSession handle. The kernel will read the command header, using it to marshall | ||||
|  * the parameters to the process at the server endpoint of the session. After the server replies to | ||||
|  * the request, the response is marshalled back to the caller's TLS buffer and control is | ||||
|  * transferred back to it. | ||||
|  * SVC call with its ClientSession handle. The kernel will read the command header, using it to | ||||
|  * marshall the parameters to the process at the server endpoint of the session. | ||||
|  * After the server replies to the request, the response is marshalled back to the caller's | ||||
|  * TLS buffer and control is transferred back to it. | ||||
|  */ | ||||
| class ServerSession final : public WaitObject { | ||||
| public: | ||||
|  | @ -47,7 +47,9 @@ public: | |||
|      * @param name Optional name of the ports | ||||
|      * @return The created session tuple | ||||
|      */ | ||||
|     static SessionPair CreateSessionPair(const std::string& name = "Unknown", std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr); | ||||
|     static SessionPair CreateSessionPair( | ||||
|         const std::string& name = "Unknown", | ||||
|         std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Handle a sync request from the emulated application. | ||||
|  | @ -61,7 +63,8 @@ public: | |||
| 
 | ||||
|     std::string name; ///< The name of this session (optional)
 | ||||
|     bool signaled;    ///< Whether there's new data available to this ServerSession
 | ||||
|     std::shared_ptr<Service::SessionRequestHandler> hle_handler; ///< This session's HLE request handler (optional)
 | ||||
|     std::shared_ptr<Service::SessionRequestHandler> | ||||
|         hle_handler; ///< This session's HLE request handler (optional)
 | ||||
| 
 | ||||
| private: | ||||
|     ServerSession(); | ||||
|  | @ -74,16 +77,18 @@ private: | |||
|      * @param hle_handler Optional HLE handler for this server session. | ||||
|      * @return The created server session | ||||
|      */ | ||||
|     static ResultVal<SharedPtr<ServerSession>> Create(std::string name = "Unknown", std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr); | ||||
|     static ResultVal<SharedPtr<ServerSession>> Create( | ||||
|         std::string name = "Unknown", | ||||
|         std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr); | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Performs command buffer translation for an HLE IPC request. | ||||
|  * The command buffer from the ServerSession thread's TLS is copied into a | ||||
|  * buffer and all descriptors in the buffer are processed. | ||||
|  * TODO(Subv): Implement this function, currently we do not support multiple processes running at once, | ||||
|  * but once that is implemented we'll need to properly translate all descriptors in the command buffer. | ||||
|  * TODO(Subv): Implement this function, currently we do not support multiple processes running at | ||||
|  * once, but once that is implemented we'll need to properly translate all descriptors | ||||
|  * in the command buffer. | ||||
|  */ | ||||
| ResultCode TranslateHLERequest(ServerSession* server_session); | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -14,7 +14,8 @@ class Interface; | |||
| 
 | ||||
| namespace APT { | ||||
| 
 | ||||
| static const u32 MaxAPTSessions = 2; ///< Each APT service can only have up to 2 sessions connected at the same time.
 | ||||
| /// Each APT service can only have up to 2 sessions connected at the same time.
 | ||||
| static const u32 MaxAPTSessions = 2; | ||||
| 
 | ||||
| /// Holds information about the parameters used in Send/Glance/ReceiveParameter
 | ||||
| struct MessageParameter { | ||||
|  |  | |||
|  | @ -175,7 +175,9 @@ void File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_ses | |||
|         LOG_WARNING(Service_FS, "(STUBBED) File command OpenLinkFile %s", GetName().c_str()); | ||||
|         auto sessions = Kernel::ServerSession::CreateSessionPair(GetName(), shared_from_this()); | ||||
|         ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); | ||||
|         cmd_buff[3] = Kernel::g_handle_table.Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)).ValueOr(INVALID_HANDLE); | ||||
|         cmd_buff[3] = Kernel::g_handle_table | ||||
|                           .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) | ||||
|                           .ValueOr(INVALID_HANDLE); | ||||
|         break; | ||||
|     } | ||||
| 
 | ||||
|  | @ -307,8 +309,8 @@ ResultCode RegisterArchiveType(std::unique_ptr<FileSys::ArchiveFactory>&& factor | |||
| } | ||||
| 
 | ||||
| ResultVal<std::shared_ptr<File>> OpenFileFromArchive(ArchiveHandle archive_handle, | ||||
|                                                        const FileSys::Path& path, | ||||
|                                                        const FileSys::Mode mode) { | ||||
|                                                      const FileSys::Path& path, | ||||
|                                                      const FileSys::Mode mode) { | ||||
|     ArchiveBackend* archive = GetArchive(archive_handle); | ||||
|     if (archive == nullptr) | ||||
|         return ERR_INVALID_ARCHIVE_HANDLE; | ||||
|  | @ -398,7 +400,7 @@ ResultCode RenameDirectoryBetweenArchives(ArchiveHandle src_archive_handle, | |||
| } | ||||
| 
 | ||||
| ResultVal<std::shared_ptr<Directory>> OpenDirectoryFromArchive(ArchiveHandle archive_handle, | ||||
|                                                                  const FileSys::Path& path) { | ||||
|                                                                const FileSys::Path& path) { | ||||
|     ArchiveBackend* archive = GetArchive(archive_handle); | ||||
|     if (archive == nullptr) | ||||
|         return ERR_INVALID_ARCHIVE_HANDLE; | ||||
|  |  | |||
|  | @ -104,8 +104,8 @@ ResultCode RegisterArchiveType(std::unique_ptr<FileSys::ArchiveFactory>&& factor | |||
|  * @return The opened File object | ||||
|  */ | ||||
| ResultVal<std::shared_ptr<File>> OpenFileFromArchive(ArchiveHandle archive_handle, | ||||
|                                                        const FileSys::Path& path, | ||||
|                                                        const FileSys::Mode mode); | ||||
|                                                      const FileSys::Path& path, | ||||
|                                                      const FileSys::Mode mode); | ||||
| 
 | ||||
| /**
 | ||||
|  * Delete a File from an Archive | ||||
|  | @ -183,7 +183,7 @@ ResultCode RenameDirectoryBetweenArchives(ArchiveHandle src_archive_handle, | |||
|  * @return The opened Directory object | ||||
|  */ | ||||
| ResultVal<std::shared_ptr<Directory>> OpenDirectoryFromArchive(ArchiveHandle archive_handle, | ||||
|                                                                  const FileSys::Path& path); | ||||
|                                                                const FileSys::Path& path); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the free space in an Archive | ||||
|  |  | |||
|  | @ -68,13 +68,16 @@ static void OpenFile(Service::Interface* self) { | |||
|     LOG_DEBUG(Service_FS, "path=%s, mode=%u attrs=%u", file_path.DebugStr().c_str(), mode.hex, | ||||
|               attributes); | ||||
| 
 | ||||
|     ResultVal<std::shared_ptr<File>> file_res = OpenFileFromArchive(archive_handle, file_path, mode); | ||||
|     ResultVal<std::shared_ptr<File>> file_res = | ||||
|         OpenFileFromArchive(archive_handle, file_path, mode); | ||||
|     cmd_buff[1] = file_res.Code().raw; | ||||
|     if (file_res.Succeeded()) { | ||||
|         std::shared_ptr<File> file = *file_res; | ||||
|         auto sessions = ServerSession::CreateSessionPair(file->GetName(), file); | ||||
|         file->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); | ||||
|         cmd_buff[3] = Kernel::g_handle_table.Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)).MoveFrom(); | ||||
|         cmd_buff[3] = Kernel::g_handle_table | ||||
|                           .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) | ||||
|                           .MoveFrom(); | ||||
|     } else { | ||||
|         cmd_buff[3] = 0; | ||||
|         LOG_ERROR(Service_FS, "failed to get a handle for file %s", file_path.DebugStr().c_str()); | ||||
|  | @ -131,13 +134,16 @@ static void OpenFileDirectly(Service::Interface* self) { | |||
|     } | ||||
|     SCOPE_EXIT({ CloseArchive(*archive_handle); }); | ||||
| 
 | ||||
|     ResultVal<std::shared_ptr<File>> file_res = OpenFileFromArchive(*archive_handle, file_path, mode); | ||||
|     ResultVal<std::shared_ptr<File>> file_res = | ||||
|         OpenFileFromArchive(*archive_handle, file_path, mode); | ||||
|     cmd_buff[1] = file_res.Code().raw; | ||||
|     if (file_res.Succeeded()) { | ||||
|         std::shared_ptr<File> file = *file_res; | ||||
|         auto sessions = ServerSession::CreateSessionPair(file->GetName(), file); | ||||
|         file->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); | ||||
|         cmd_buff[3] = Kernel::g_handle_table.Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)).MoveFrom(); | ||||
|         cmd_buff[3] = Kernel::g_handle_table | ||||
|                           .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) | ||||
|                           .MoveFrom(); | ||||
|     } else { | ||||
|         cmd_buff[3] = 0; | ||||
|         LOG_ERROR(Service_FS, "failed to get a handle for file %s mode=%u attributes=%u", | ||||
|  | @ -395,13 +401,16 @@ static void OpenDirectory(Service::Interface* self) { | |||
|     LOG_DEBUG(Service_FS, "type=%u size=%u data=%s", static_cast<u32>(dirname_type), dirname_size, | ||||
|               dir_path.DebugStr().c_str()); | ||||
| 
 | ||||
|     ResultVal<std::shared_ptr<Directory>> dir_res = OpenDirectoryFromArchive(archive_handle, dir_path); | ||||
|     ResultVal<std::shared_ptr<Directory>> dir_res = | ||||
|         OpenDirectoryFromArchive(archive_handle, dir_path); | ||||
|     cmd_buff[1] = dir_res.Code().raw; | ||||
|     if (dir_res.Succeeded()) { | ||||
|         std::shared_ptr<Directory> directory = *dir_res; | ||||
|         auto sessions = ServerSession::CreateSessionPair(directory->GetName(), directory); | ||||
|         directory->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); | ||||
|         cmd_buff[3] = Kernel::g_handle_table.Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)).MoveFrom(); | ||||
|         cmd_buff[3] = Kernel::g_handle_table | ||||
|                           .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) | ||||
|                           .MoveFrom(); | ||||
|     } else { | ||||
|         LOG_ERROR(Service_FS, "failed to get a handle for directory type=%d size=%d data=%s", | ||||
|                   dirname_type, dirname_size, dir_path.DebugStr().c_str()); | ||||
|  |  | |||
|  | @ -8,7 +8,6 @@ | |||
| #include "common/string_util.h" | ||||
| 
 | ||||
| #include "core/hle/kernel/server_port.h" | ||||
| #include "core/hle/service/service.h" | ||||
| #include "core/hle/service/ac_u.h" | ||||
| #include "core/hle/service/act_a.h" | ||||
| #include "core/hle/service/act_u.h" | ||||
|  | @ -66,11 +65,13 @@ static std::string MakeFunctionString(const char* name, const char* port_name, | |||
|     return function_string; | ||||
| } | ||||
| 
 | ||||
| void SessionRequestHandler::ClientConnected(Kernel::SharedPtr<Kernel::ServerSession> server_session) { | ||||
| void SessionRequestHandler::ClientConnected( | ||||
|     Kernel::SharedPtr<Kernel::ServerSession> server_session) { | ||||
|     connected_sessions.push_back(server_session); | ||||
| } | ||||
| 
 | ||||
| void SessionRequestHandler::ClientDisconnected(Kernel::SharedPtr<Kernel::ServerSession> server_session) { | ||||
| void SessionRequestHandler::ClientDisconnected( | ||||
|     Kernel::SharedPtr<Kernel::ServerSession> server_session) { | ||||
|     boost::range::remove_erase(connected_sessions, server_session); | ||||
| } | ||||
| 
 | ||||
|  | @ -78,7 +79,8 @@ Interface::Interface(u32 max_sessions) : max_sessions(max_sessions) {} | |||
| Interface::~Interface() = default; | ||||
| 
 | ||||
| void Interface::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) { | ||||
|     // TODO(Subv): Make use of the server_session in the HLE service handlers to distinguish which session triggered each command.
 | ||||
|     // TODO(Subv): Make use of the server_session in the HLE service handlers to distinguish which
 | ||||
|     // session triggered each command.
 | ||||
| 
 | ||||
|     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||
|     auto itr = m_functions.find(cmd_buff[0]); | ||||
|  | @ -113,15 +115,17 @@ void Interface::Register(const FunctionInfo* functions, size_t n) { | |||
| // Module interface
 | ||||
| 
 | ||||
| static void AddNamedPort(Interface* interface_) { | ||||
|     auto ports = Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(), | ||||
|                                                     std::shared_ptr<Interface>(interface_)); | ||||
|     auto ports = | ||||
|         Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(), | ||||
|                                            std::shared_ptr<Interface>(interface_)); | ||||
|     auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports); | ||||
|     g_kernel_named_ports.emplace(interface_->GetPortName(), std::move(client_port)); | ||||
| } | ||||
| 
 | ||||
| void AddService(Interface* interface_) { | ||||
|     auto ports = Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(), | ||||
|                                                     std::shared_ptr<Interface>(interface_)); | ||||
|     auto ports = | ||||
|         Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(), | ||||
|                                            std::shared_ptr<Interface>(interface_)); | ||||
|     auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports); | ||||
|     g_srv_services.emplace(interface_->GetPortName(), std::move(client_port)); | ||||
| } | ||||
|  | @ -190,5 +194,4 @@ void Shutdown() { | |||
|     g_kernel_named_ports.clear(); | ||||
|     LOG_DEBUG(Service, "shutdown OK"); | ||||
| } | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -15,7 +15,6 @@ | |||
| #include "core/hle/result.h" | ||||
| #include "core/memory.h" | ||||
| 
 | ||||
| 
 | ||||
| namespace Kernel { | ||||
| class ServerSession; | ||||
| } | ||||
|  | @ -26,12 +25,13 @@ class ServerSession; | |||
| namespace Service { | ||||
| 
 | ||||
| static const int kMaxPortSize = 8; ///< Maximum size of a port name (8 characters)
 | ||||
| static const u32 DefaultMaxSessions = 10; ///< Arbitrary default number of maximum connections to an HLE service
 | ||||
| /// Arbitrary default number of maximum connections to an HLE service.
 | ||||
| static const u32 DefaultMaxSessions = 10; | ||||
| 
 | ||||
| /**
 | ||||
|  * Interface implemented by HLE Session handlers. | ||||
|  * This can be provided to a ServerSession in order to hook into several relevant events (such as a new connection or a SyncRequest) | ||||
|  * so they can be implemented in the emulator. | ||||
|  * This can be provided to a ServerSession in order to hook into several relevant events | ||||
|  * (such as a new connection or a SyncRequest) so they can be implemented in the emulator. | ||||
|  */ | ||||
| class SessionRequestHandler { | ||||
| public: | ||||
|  | @ -61,12 +61,14 @@ public: | |||
| 
 | ||||
| protected: | ||||
|     /// List of sessions that are connected to this handler.
 | ||||
|     /// A ServerSession whose server endpoint is an HLE implementation is kept alive by this list for the duration of the connection.
 | ||||
|     /// A ServerSession whose server endpoint is an HLE implementation is kept alive by this list
 | ||||
|     // for the duration of the connection.
 | ||||
|     std::vector<Kernel::SharedPtr<Kernel::ServerSession>> connected_sessions; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Framework for implementing HLE service handlers which dispatch incoming SyncRequests based on a table mapping header ids to handler functions. | ||||
|  * Framework for implementing HLE service handlers which dispatch incoming SyncRequests based on a | ||||
|  * table mapping header ids to handler functions. | ||||
|  */ | ||||
| class Interface : public SessionRequestHandler { | ||||
| public: | ||||
|  | @ -88,10 +90,13 @@ public: | |||
|     } | ||||
| 
 | ||||
|     /**
 | ||||
|      * Gets the maximum allowed number of sessions that can be connected to this service at the same time. | ||||
|      * Gets the maximum allowed number of sessions that can be connected to this service | ||||
|      * at the same time. | ||||
|      * @returns The maximum number of connections allowed. | ||||
|      */ | ||||
|     u32 GetMaxSessions() const { return max_sessions; } | ||||
|     u32 GetMaxSessions() const { | ||||
|         return max_sessions; | ||||
|     } | ||||
| 
 | ||||
|     typedef void (*Function)(Interface*); | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,8 +7,8 @@ | |||
| #include "common/common_types.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "core/hle/kernel/client_session.h" | ||||
| #include "core/hle/kernel/server_session.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/server_session.h" | ||||
| #include "core/hle/service/srv.h" | ||||
| 
 | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
|  |  | |||
|  | @ -236,14 +236,16 @@ static ResultCode ConnectToPort(Handle* out_handle, const char* port_name) { | |||
| 
 | ||||
| /// Makes a blocking IPC call to an OS service.
 | ||||
| static ResultCode SendSyncRequest(Handle handle) { | ||||
|     SharedPtr<Kernel::ClientSession> session = Kernel::g_handle_table.Get<Kernel::ClientSession>(handle); | ||||
|     SharedPtr<Kernel::ClientSession> session = | ||||
|         Kernel::g_handle_table.Get<Kernel::ClientSession>(handle); | ||||
|     if (session == nullptr) { | ||||
|         return ERR_INVALID_HANDLE; | ||||
|     } | ||||
| 
 | ||||
|     LOG_TRACE(Kernel_SVC, "called handle=0x%08X(%s)", handle, session->GetName().c_str()); | ||||
| 
 | ||||
|     // TODO(Subv): svcSendSyncRequest should put the caller thread to sleep while the server responds and cause a reschedule.
 | ||||
|     // TODO(Subv): svcSendSyncRequest should put the caller thread to sleep while the server
 | ||||
|     // responds and cause a reschedule.
 | ||||
|     return session->SendSyncRequest(); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue