diff options
| author | 2016-12-14 12:33:49 -0500 | |
|---|---|---|
| committer | 2016-12-14 12:45:36 -0500 | |
| commit | 016307ae656afc85ab59a5c2598205ef81f99231 (patch) | |
| tree | ae2031654a2178e8ea824928be03fd8409f81222 /src/core | |
| parent | Moved the HLE command buffer translation task to ServerSession instead of the... (diff) | |
| download | yuzu-016307ae656afc85ab59a5c2598205ef81f99231.tar.gz yuzu-016307ae656afc85ab59a5c2598205ef81f99231.tar.xz yuzu-016307ae656afc85ab59a5c2598205ef81f99231.zip | |
Fixed the codestyle to match our clang-format rules.
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/hle/ipc.h | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/client_port.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/client_port.h | 5 | ||||
| -rw-r--r-- | src/core/hle/kernel/client_session.cpp | 9 | ||||
| -rw-r--r-- | src/core/hle/kernel/client_session.h | 11 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_port.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_session.cpp | 25 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_session.h | 25 | ||||
| -rw-r--r-- | src/core/hle/service/apt/apt.h | 3 | ||||
| -rw-r--r-- | src/core/hle/service/fs/archive.cpp | 10 | ||||
| -rw-r--r-- | src/core/hle/service/fs/archive.h | 6 | ||||
| -rw-r--r-- | src/core/hle/service/fs/fs_user.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/service/service.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/service/service.h | 21 | ||||
| -rw-r--r-- | src/core/hle/service/srv.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/svc.cpp | 6 |
16 files changed, 108 insertions, 68 deletions
diff --git a/src/core/hle/ipc.h b/src/core/hle/ipc.h index 79ccaaed0..4e094faa7 100644 --- a/src/core/hle/ipc.h +++ b/src/core/hle/ipc.h | |||
| @@ -139,7 +139,7 @@ union MappedBufferDescInfo { | |||
| 139 | }; | 139 | }; |
| 140 | 140 | ||
| 141 | inline MappedBufferDescInfo ParseMappedBufferDesc(const u32 desc) { | 141 | inline MappedBufferDescInfo ParseMappedBufferDesc(const u32 desc) { |
| 142 | return{ desc }; | 142 | return {desc}; |
| 143 | } | 143 | } |
| 144 | 144 | ||
| 145 | inline DescriptorType GetDescriptorType(u32 descriptor) { | 145 | inline DescriptorType GetDescriptorType(u32 descriptor) { |
diff --git a/src/core/hle/kernel/client_port.cpp b/src/core/hle/kernel/client_port.cpp index bd8ef055d..22645f4ec 100644 --- a/src/core/hle/kernel/client_port.cpp +++ b/src/core/hle/kernel/client_port.cpp | |||
| @@ -19,7 +19,8 @@ ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() { | |||
| 19 | // AcceptSession before returning from this call. | 19 | // AcceptSession before returning from this call. |
| 20 | 20 | ||
| 21 | if (active_sessions >= max_sessions) { | 21 | if (active_sessions >= max_sessions) { |
| 22 | // TODO(Subv): Return an error code in this situation after session disconnection is implemented. | 22 | // TODO(Subv): Return an error code in this situation after session disconnection is |
| 23 | // implemented. | ||
| 23 | /*return ResultCode(ErrorDescription::MaxConnectionsReached, | 24 | /*return ResultCode(ErrorDescription::MaxConnectionsReached, |
| 24 | ErrorModule::OS, ErrorSummary::WouldBlock, | 25 | ErrorModule::OS, ErrorSummary::WouldBlock, |
| 25 | ErrorLevel::Temporary);*/ | 26 | ErrorLevel::Temporary);*/ |
| @@ -27,7 +28,8 @@ ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() { | |||
| 27 | active_sessions++; | 28 | active_sessions++; |
| 28 | 29 | ||
| 29 | // Create a new session pair, let the created sessions inherit the parent port's HLE handler. | 30 | // Create a new session pair, let the created sessions inherit the parent port's HLE handler. |
| 30 | auto sessions = ServerSession::CreateSessionPair(server_port->GetName(), server_port->hle_handler); | 31 | auto sessions = |
| 32 | ServerSession::CreateSessionPair(server_port->GetName(), server_port->hle_handler); | ||
| 31 | auto client_session = std::get<SharedPtr<ClientSession>>(sessions); | 33 | auto client_session = std::get<SharedPtr<ClientSession>>(sessions); |
| 32 | auto server_session = std::get<SharedPtr<ServerSession>>(sessions); | 34 | auto server_session = std::get<SharedPtr<ServerSession>>(sessions); |
| 33 | 35 | ||
diff --git a/src/core/hle/kernel/client_port.h b/src/core/hle/kernel/client_port.h index 0039cf028..511490c7c 100644 --- a/src/core/hle/kernel/client_port.h +++ b/src/core/hle/kernel/client_port.h | |||
| @@ -29,8 +29,9 @@ public: | |||
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | /** | 31 | /** |
| 32 | * Creates a new Session pair, adds the created ServerSession to the associated ServerPort's list of pending sessions, | 32 | * Creates a new Session pair, adds the created ServerSession to the associated ServerPort's |
| 33 | * and signals the ServerPort, causing any threads waiting on it to awake. | 33 | * list of pending sessions, and signals the ServerPort, causing any threads |
| 34 | * waiting on it to awake. | ||
| 34 | * @returns ClientSession The client endpoint of the created Session pair, or error code. | 35 | * @returns ClientSession The client endpoint of the created Session pair, or error code. |
| 35 | */ | 36 | */ |
| 36 | ResultVal<SharedPtr<ClientSession>> Connect(); | 37 | ResultVal<SharedPtr<ClientSession>> Connect(); |
diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index 17302baca..0331386ec 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp | |||
| @@ -11,16 +11,19 @@ namespace Kernel { | |||
| 11 | 11 | ||
| 12 | ClientSession::ClientSession() = default; | 12 | ClientSession::ClientSession() = default; |
| 13 | ClientSession::~ClientSession() { | 13 | ClientSession::~ClientSession() { |
| 14 | // This destructor will be called automatically when the last ClientSession handle is closed by the emulated application. | 14 | // This destructor will be called automatically when the last ClientSession handle is closed by |
| 15 | // the emulated application. | ||
| 15 | 16 | ||
| 16 | if (server_session->hle_handler) | 17 | if (server_session->hle_handler) |
| 17 | server_session->hle_handler->ClientDisconnected(server_session); | 18 | server_session->hle_handler->ClientDisconnected(server_session); |
| 18 | 19 | ||
| 19 | // TODO(Subv): If the session is still open, set the connection status to 2 (Closed by client), | 20 | // TODO(Subv): If the session is still open, set the connection status to 2 (Closed by client), |
| 20 | // wake up all the ServerSession's waiting threads and set the WaitSynchronization result to 0xC920181A. | 21 | // wake up all the ServerSession's waiting threads and set the WaitSynchronization result to |
| 22 | // 0xC920181A. | ||
| 21 | } | 23 | } |
| 22 | 24 | ||
| 23 | ResultVal<SharedPtr<ClientSession>> ClientSession::Create(ServerSession* server_session, std::string name) { | 25 | ResultVal<SharedPtr<ClientSession>> ClientSession::Create(ServerSession* server_session, |
| 26 | std::string name) { | ||
| 24 | SharedPtr<ClientSession> client_session(new ClientSession); | 27 | SharedPtr<ClientSession> client_session(new ClientSession); |
| 25 | 28 | ||
| 26 | client_session->name = std::move(name); | 29 | client_session->name = std::move(name); |
diff --git a/src/core/hle/kernel/client_session.h b/src/core/hle/kernel/client_session.h index fedbd0625..ed468dec6 100644 --- a/src/core/hle/kernel/client_session.h +++ b/src/core/hle/kernel/client_session.h | |||
| @@ -4,8 +4,8 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <string> | ||
| 8 | #include <memory> | 7 | #include <memory> |
| 8 | #include <string> | ||
| 9 | 9 | ||
| 10 | #include "common/common_types.h" | 10 | #include "common/common_types.h" |
| 11 | 11 | ||
| @@ -44,9 +44,9 @@ public: | |||
| 44 | */ | 44 | */ |
| 45 | ResultCode SendSyncRequest(); | 45 | ResultCode SendSyncRequest(); |
| 46 | 46 | ||
| 47 | std::string name; ///< Name of client port (optional) | 47 | std::string name; ///< Name of client port (optional) |
| 48 | ServerSession* server_session; ///< The server session associated with this client session. | 48 | ServerSession* server_session; ///< The server session associated with this client session. |
| 49 | SessionStatus session_status; ///< The session's current status. | 49 | SessionStatus session_status; ///< The session's current status. |
| 50 | 50 | ||
| 51 | private: | 51 | private: |
| 52 | ClientSession(); | 52 | ClientSession(); |
| @@ -58,7 +58,8 @@ private: | |||
| 58 | * @param name Optional name of client session | 58 | * @param name Optional name of client session |
| 59 | * @return The created client session | 59 | * @return The created client session |
| 60 | */ | 60 | */ |
| 61 | static ResultVal<SharedPtr<ClientSession>> Create(ServerSession* server_session, std::string name = "Unknown"); | 61 | static ResultVal<SharedPtr<ClientSession>> Create(ServerSession* server_session, |
| 62 | std::string name = "Unknown"); | ||
| 62 | }; | 63 | }; |
| 63 | 64 | ||
| 64 | } // namespace | 65 | } // namespace |
diff --git a/src/core/hle/kernel/server_port.cpp b/src/core/hle/kernel/server_port.cpp index f7699f023..6c19aa7c0 100644 --- a/src/core/hle/kernel/server_port.cpp +++ b/src/core/hle/kernel/server_port.cpp | |||
| @@ -24,7 +24,8 @@ void ServerPort::Acquire() { | |||
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> ServerPort::CreatePortPair( | 26 | std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> ServerPort::CreatePortPair( |
| 27 | u32 max_sessions, std::string name, std::shared_ptr<Service::SessionRequestHandler> hle_handler) { | 27 | u32 max_sessions, std::string name, |
| 28 | std::shared_ptr<Service::SessionRequestHandler> hle_handler) { | ||
| 28 | 29 | ||
| 29 | SharedPtr<ServerPort> server_port(new ServerPort); | 30 | SharedPtr<ServerPort> server_port(new ServerPort); |
| 30 | SharedPtr<ClientPort> client_port(new ClientPort); | 31 | SharedPtr<ClientPort> client_port(new ClientPort); |
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index 1e54c3a2e..146458c1c 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp | |||
| @@ -12,12 +12,14 @@ namespace Kernel { | |||
| 12 | 12 | ||
| 13 | ServerSession::ServerSession() = default; | 13 | ServerSession::ServerSession() = default; |
| 14 | ServerSession::~ServerSession() { | 14 | ServerSession::~ServerSession() { |
| 15 | // This destructor will be called automatically when the last ServerSession handle is closed by the emulated application. | 15 | // This destructor will be called automatically when the last ServerSession handle is closed by |
| 16 | // the emulated application. | ||
| 16 | // TODO(Subv): Reduce the ClientPort's connection count, | 17 | // TODO(Subv): Reduce the ClientPort's connection count, |
| 17 | // if the session is still open, set the connection status to 3 (Closed by server), | 18 | // if the session is still open, set the connection status to 3 (Closed by server), |
| 18 | } | 19 | } |
| 19 | 20 | ||
| 20 | ResultVal<SharedPtr<ServerSession>> ServerSession::Create(std::string name, std::shared_ptr<Service::SessionRequestHandler> hle_handler) { | 21 | ResultVal<SharedPtr<ServerSession>> ServerSession::Create( |
| 22 | std::string name, std::shared_ptr<Service::SessionRequestHandler> hle_handler) { | ||
| 21 | SharedPtr<ServerSession> server_session(new ServerSession); | 23 | SharedPtr<ServerSession> server_session(new ServerSession); |
| 22 | 24 | ||
| 23 | server_session->name = std::move(name); | 25 | server_session->name = std::move(name); |
| @@ -38,7 +40,8 @@ void ServerSession::Acquire() { | |||
| 38 | 40 | ||
| 39 | ResultCode ServerSession::HandleSyncRequest() { | 41 | ResultCode ServerSession::HandleSyncRequest() { |
| 40 | // The ServerSession received a sync request, this means that there's new data available | 42 | // The ServerSession received a sync request, this means that there's new data available |
| 41 | // from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or similar. | 43 | // from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or |
| 44 | // similar. | ||
| 42 | 45 | ||
| 43 | // If this ServerSession has an associated HLE handler, forward the request to it. | 46 | // If this ServerSession has an associated HLE handler, forward the request to it. |
| 44 | if (hle_handler != nullptr) { | 47 | if (hle_handler != nullptr) { |
| @@ -50,17 +53,20 @@ ResultCode ServerSession::HandleSyncRequest() { | |||
| 50 | // TODO(Subv): Translate the response command buffer. | 53 | // TODO(Subv): Translate the response command buffer. |
| 51 | } | 54 | } |
| 52 | 55 | ||
| 53 | // If this ServerSession does not have an HLE implementation, just wake up the threads waiting on it. | 56 | // If this ServerSession does not have an HLE implementation, just wake up the threads waiting |
| 57 | // on it. | ||
| 54 | signaled = true; | 58 | signaled = true; |
| 55 | WakeupAllWaitingThreads(); | 59 | WakeupAllWaitingThreads(); |
| 56 | return RESULT_SUCCESS; | 60 | return RESULT_SUCCESS; |
| 57 | } | 61 | } |
| 58 | 62 | ||
| 59 | ServerSession::SessionPair ServerSession::CreateSessionPair(const std::string& name, | 63 | ServerSession::SessionPair ServerSession::CreateSessionPair( |
| 60 | std::shared_ptr<Service::SessionRequestHandler> hle_handler) { | 64 | const std::string& name, std::shared_ptr<Service::SessionRequestHandler> hle_handler) { |
| 61 | auto server_session = ServerSession::Create(name + "_Server", std::move(hle_handler)).MoveFrom(); | 65 | auto server_session = |
| 62 | // We keep a non-owning pointer to the ServerSession in the ClientSession because we don't want to prevent the | 66 | ServerSession::Create(name + "_Server", std::move(hle_handler)).MoveFrom(); |
| 63 | // ServerSession's destructor from being called when the emulated application closes the last ServerSession handle. | 67 | // We keep a non-owning pointer to the ServerSession in the ClientSession because we don't want |
| 68 | // to prevent the ServerSession's destructor from being called when the emulated | ||
| 69 | // application closes the last ServerSession handle. | ||
| 64 | auto client_session = ClientSession::Create(server_session.get(), name + "_Client").MoveFrom(); | 70 | auto client_session = ClientSession::Create(server_session.get(), name + "_Client").MoveFrom(); |
| 65 | 71 | ||
| 66 | return std::make_tuple(std::move(server_session), std::move(client_session)); | 72 | return std::make_tuple(std::move(server_session), std::move(client_session)); |
| @@ -70,5 +76,4 @@ ResultCode TranslateHLERequest(ServerSession* server_session) { | |||
| 70 | // TODO(Subv): Implement this function once multiple concurrent processes are supported. | 76 | // TODO(Subv): Implement this function once multiple concurrent processes are supported. |
| 71 | return RESULT_SUCCESS; | 77 | return RESULT_SUCCESS; |
| 72 | } | 78 | } |
| 73 | |||
| 74 | } | 79 | } |
diff --git a/src/core/hle/kernel/server_session.h b/src/core/hle/kernel/server_session.h index 7abc09011..458284a5d 100644 --- a/src/core/hle/kernel/server_session.h +++ b/src/core/hle/kernel/server_session.h | |||
| @@ -24,10 +24,10 @@ class ClientSession; | |||
| 24 | * | 24 | * |
| 25 | * To make a service call, the client must write the command header and parameters to the buffer | 25 | * To make a service call, the client must write the command header and parameters to the buffer |
| 26 | * located at offset 0x80 of the TLS (Thread-Local Storage) area, then execute a SendSyncRequest | 26 | * located at offset 0x80 of the TLS (Thread-Local Storage) area, then execute a SendSyncRequest |
| 27 | * SVC call with its ClientSession handle. The kernel will read the command header, using it to marshall | 27 | * SVC call with its ClientSession handle. The kernel will read the command header, using it to |
| 28 | * the parameters to the process at the server endpoint of the session. After the server replies to | 28 | * marshall the parameters to the process at the server endpoint of the session. |
| 29 | * the request, the response is marshalled back to the caller's TLS buffer and control is | 29 | * After the server replies to the request, the response is marshalled back to the caller's |
| 30 | * transferred back to it. | 30 | * TLS buffer and control is transferred back to it. |
| 31 | */ | 31 | */ |
| 32 | class ServerSession final : public WaitObject { | 32 | class ServerSession final : public WaitObject { |
| 33 | public: | 33 | public: |
| @@ -47,7 +47,9 @@ public: | |||
| 47 | * @param name Optional name of the ports | 47 | * @param name Optional name of the ports |
| 48 | * @return The created session tuple | 48 | * @return The created session tuple |
| 49 | */ | 49 | */ |
| 50 | static SessionPair CreateSessionPair(const std::string& name = "Unknown", std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr); | 50 | static SessionPair CreateSessionPair( |
| 51 | const std::string& name = "Unknown", | ||
| 52 | std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr); | ||
| 51 | 53 | ||
| 52 | /** | 54 | /** |
| 53 | * Handle a sync request from the emulated application. | 55 | * Handle a sync request from the emulated application. |
| @@ -61,7 +63,8 @@ public: | |||
| 61 | 63 | ||
| 62 | std::string name; ///< The name of this session (optional) | 64 | std::string name; ///< The name of this session (optional) |
| 63 | bool signaled; ///< Whether there's new data available to this ServerSession | 65 | bool signaled; ///< Whether there's new data available to this ServerSession |
| 64 | std::shared_ptr<Service::SessionRequestHandler> hle_handler; ///< This session's HLE request handler (optional) | 66 | std::shared_ptr<Service::SessionRequestHandler> |
| 67 | hle_handler; ///< This session's HLE request handler (optional) | ||
| 65 | 68 | ||
| 66 | private: | 69 | private: |
| 67 | ServerSession(); | 70 | ServerSession(); |
| @@ -74,16 +77,18 @@ private: | |||
| 74 | * @param hle_handler Optional HLE handler for this server session. | 77 | * @param hle_handler Optional HLE handler for this server session. |
| 75 | * @return The created server session | 78 | * @return The created server session |
| 76 | */ | 79 | */ |
| 77 | static ResultVal<SharedPtr<ServerSession>> Create(std::string name = "Unknown", std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr); | 80 | static ResultVal<SharedPtr<ServerSession>> Create( |
| 81 | std::string name = "Unknown", | ||
| 82 | std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr); | ||
| 78 | }; | 83 | }; |
| 79 | 84 | ||
| 80 | /** | 85 | /** |
| 81 | * Performs command buffer translation for an HLE IPC request. | 86 | * Performs command buffer translation for an HLE IPC request. |
| 82 | * The command buffer from the ServerSession thread's TLS is copied into a | 87 | * The command buffer from the ServerSession thread's TLS is copied into a |
| 83 | * buffer and all descriptors in the buffer are processed. | 88 | * buffer and all descriptors in the buffer are processed. |
| 84 | * TODO(Subv): Implement this function, currently we do not support multiple processes running at once, | 89 | * TODO(Subv): Implement this function, currently we do not support multiple processes running at |
| 85 | * but once that is implemented we'll need to properly translate all descriptors in the command buffer. | 90 | * once, but once that is implemented we'll need to properly translate all descriptors |
| 91 | * in the command buffer. | ||
| 86 | */ | 92 | */ |
| 87 | ResultCode TranslateHLERequest(ServerSession* server_session); | 93 | ResultCode TranslateHLERequest(ServerSession* server_session); |
| 88 | |||
| 89 | } | 94 | } |
diff --git a/src/core/hle/service/apt/apt.h b/src/core/hle/service/apt/apt.h index 9bc6327ed..bcc437f93 100644 --- a/src/core/hle/service/apt/apt.h +++ b/src/core/hle/service/apt/apt.h | |||
| @@ -14,7 +14,8 @@ class Interface; | |||
| 14 | 14 | ||
| 15 | namespace APT { | 15 | namespace APT { |
| 16 | 16 | ||
| 17 | static const u32 MaxAPTSessions = 2; ///< Each APT service can only have up to 2 sessions connected at the same time. | 17 | /// Each APT service can only have up to 2 sessions connected at the same time. |
| 18 | static const u32 MaxAPTSessions = 2; | ||
| 18 | 19 | ||
| 19 | /// Holds information about the parameters used in Send/Glance/ReceiveParameter | 20 | /// Holds information about the parameters used in Send/Glance/ReceiveParameter |
| 20 | struct MessageParameter { | 21 | struct MessageParameter { |
diff --git a/src/core/hle/service/fs/archive.cpp b/src/core/hle/service/fs/archive.cpp index bca57061e..6184e6f1b 100644 --- a/src/core/hle/service/fs/archive.cpp +++ b/src/core/hle/service/fs/archive.cpp | |||
| @@ -175,7 +175,9 @@ void File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_ses | |||
| 175 | LOG_WARNING(Service_FS, "(STUBBED) File command OpenLinkFile %s", GetName().c_str()); | 175 | LOG_WARNING(Service_FS, "(STUBBED) File command OpenLinkFile %s", GetName().c_str()); |
| 176 | auto sessions = Kernel::ServerSession::CreateSessionPair(GetName(), shared_from_this()); | 176 | auto sessions = Kernel::ServerSession::CreateSessionPair(GetName(), shared_from_this()); |
| 177 | ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); | 177 | ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); |
| 178 | cmd_buff[3] = Kernel::g_handle_table.Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)).ValueOr(INVALID_HANDLE); | 178 | cmd_buff[3] = Kernel::g_handle_table |
| 179 | .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) | ||
| 180 | .ValueOr(INVALID_HANDLE); | ||
| 179 | break; | 181 | break; |
| 180 | } | 182 | } |
| 181 | 183 | ||
| @@ -307,8 +309,8 @@ ResultCode RegisterArchiveType(std::unique_ptr<FileSys::ArchiveFactory>&& factor | |||
| 307 | } | 309 | } |
| 308 | 310 | ||
| 309 | ResultVal<std::shared_ptr<File>> OpenFileFromArchive(ArchiveHandle archive_handle, | 311 | ResultVal<std::shared_ptr<File>> OpenFileFromArchive(ArchiveHandle archive_handle, |
| 310 | const FileSys::Path& path, | 312 | const FileSys::Path& path, |
| 311 | const FileSys::Mode mode) { | 313 | const FileSys::Mode mode) { |
| 312 | ArchiveBackend* archive = GetArchive(archive_handle); | 314 | ArchiveBackend* archive = GetArchive(archive_handle); |
| 313 | if (archive == nullptr) | 315 | if (archive == nullptr) |
| 314 | return ERR_INVALID_ARCHIVE_HANDLE; | 316 | return ERR_INVALID_ARCHIVE_HANDLE; |
| @@ -398,7 +400,7 @@ ResultCode RenameDirectoryBetweenArchives(ArchiveHandle src_archive_handle, | |||
| 398 | } | 400 | } |
| 399 | 401 | ||
| 400 | ResultVal<std::shared_ptr<Directory>> OpenDirectoryFromArchive(ArchiveHandle archive_handle, | 402 | ResultVal<std::shared_ptr<Directory>> OpenDirectoryFromArchive(ArchiveHandle archive_handle, |
| 401 | const FileSys::Path& path) { | 403 | const FileSys::Path& path) { |
| 402 | ArchiveBackend* archive = GetArchive(archive_handle); | 404 | ArchiveBackend* archive = GetArchive(archive_handle); |
| 403 | if (archive == nullptr) | 405 | if (archive == nullptr) |
| 404 | return ERR_INVALID_ARCHIVE_HANDLE; | 406 | return ERR_INVALID_ARCHIVE_HANDLE; |
diff --git a/src/core/hle/service/fs/archive.h b/src/core/hle/service/fs/archive.h index eb76706a1..82d591897 100644 --- a/src/core/hle/service/fs/archive.h +++ b/src/core/hle/service/fs/archive.h | |||
| @@ -104,8 +104,8 @@ ResultCode RegisterArchiveType(std::unique_ptr<FileSys::ArchiveFactory>&& factor | |||
| 104 | * @return The opened File object | 104 | * @return The opened File object |
| 105 | */ | 105 | */ |
| 106 | ResultVal<std::shared_ptr<File>> OpenFileFromArchive(ArchiveHandle archive_handle, | 106 | ResultVal<std::shared_ptr<File>> OpenFileFromArchive(ArchiveHandle archive_handle, |
| 107 | const FileSys::Path& path, | 107 | const FileSys::Path& path, |
| 108 | const FileSys::Mode mode); | 108 | const FileSys::Mode mode); |
| 109 | 109 | ||
| 110 | /** | 110 | /** |
| 111 | * Delete a File from an Archive | 111 | * Delete a File from an Archive |
| @@ -183,7 +183,7 @@ ResultCode RenameDirectoryBetweenArchives(ArchiveHandle src_archive_handle, | |||
| 183 | * @return The opened Directory object | 183 | * @return The opened Directory object |
| 184 | */ | 184 | */ |
| 185 | ResultVal<std::shared_ptr<Directory>> OpenDirectoryFromArchive(ArchiveHandle archive_handle, | 185 | ResultVal<std::shared_ptr<Directory>> OpenDirectoryFromArchive(ArchiveHandle archive_handle, |
| 186 | const FileSys::Path& path); | 186 | const FileSys::Path& path); |
| 187 | 187 | ||
| 188 | /** | 188 | /** |
| 189 | * Get the free space in an Archive | 189 | * Get the free space in an Archive |
diff --git a/src/core/hle/service/fs/fs_user.cpp b/src/core/hle/service/fs/fs_user.cpp index ea1050fb6..0b03bea22 100644 --- a/src/core/hle/service/fs/fs_user.cpp +++ b/src/core/hle/service/fs/fs_user.cpp | |||
| @@ -68,13 +68,16 @@ static void OpenFile(Service::Interface* self) { | |||
| 68 | LOG_DEBUG(Service_FS, "path=%s, mode=%u attrs=%u", file_path.DebugStr().c_str(), mode.hex, | 68 | LOG_DEBUG(Service_FS, "path=%s, mode=%u attrs=%u", file_path.DebugStr().c_str(), mode.hex, |
| 69 | attributes); | 69 | attributes); |
| 70 | 70 | ||
| 71 | ResultVal<std::shared_ptr<File>> file_res = OpenFileFromArchive(archive_handle, file_path, mode); | 71 | ResultVal<std::shared_ptr<File>> file_res = |
| 72 | OpenFileFromArchive(archive_handle, file_path, mode); | ||
| 72 | cmd_buff[1] = file_res.Code().raw; | 73 | cmd_buff[1] = file_res.Code().raw; |
| 73 | if (file_res.Succeeded()) { | 74 | if (file_res.Succeeded()) { |
| 74 | std::shared_ptr<File> file = *file_res; | 75 | std::shared_ptr<File> file = *file_res; |
| 75 | auto sessions = ServerSession::CreateSessionPair(file->GetName(), file); | 76 | auto sessions = ServerSession::CreateSessionPair(file->GetName(), file); |
| 76 | file->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); | 77 | file->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); |
| 77 | cmd_buff[3] = Kernel::g_handle_table.Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)).MoveFrom(); | 78 | cmd_buff[3] = Kernel::g_handle_table |
| 79 | .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) | ||
| 80 | .MoveFrom(); | ||
| 78 | } else { | 81 | } else { |
| 79 | cmd_buff[3] = 0; | 82 | cmd_buff[3] = 0; |
| 80 | LOG_ERROR(Service_FS, "failed to get a handle for file %s", file_path.DebugStr().c_str()); | 83 | 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) { | |||
| 131 | } | 134 | } |
| 132 | SCOPE_EXIT({ CloseArchive(*archive_handle); }); | 135 | SCOPE_EXIT({ CloseArchive(*archive_handle); }); |
| 133 | 136 | ||
| 134 | ResultVal<std::shared_ptr<File>> file_res = OpenFileFromArchive(*archive_handle, file_path, mode); | 137 | ResultVal<std::shared_ptr<File>> file_res = |
| 138 | OpenFileFromArchive(*archive_handle, file_path, mode); | ||
| 135 | cmd_buff[1] = file_res.Code().raw; | 139 | cmd_buff[1] = file_res.Code().raw; |
| 136 | if (file_res.Succeeded()) { | 140 | if (file_res.Succeeded()) { |
| 137 | std::shared_ptr<File> file = *file_res; | 141 | std::shared_ptr<File> file = *file_res; |
| 138 | auto sessions = ServerSession::CreateSessionPair(file->GetName(), file); | 142 | auto sessions = ServerSession::CreateSessionPair(file->GetName(), file); |
| 139 | file->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); | 143 | file->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); |
| 140 | cmd_buff[3] = Kernel::g_handle_table.Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)).MoveFrom(); | 144 | cmd_buff[3] = Kernel::g_handle_table |
| 145 | .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) | ||
| 146 | .MoveFrom(); | ||
| 141 | } else { | 147 | } else { |
| 142 | cmd_buff[3] = 0; | 148 | cmd_buff[3] = 0; |
| 143 | LOG_ERROR(Service_FS, "failed to get a handle for file %s mode=%u attributes=%u", | 149 | 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) { | |||
| 395 | LOG_DEBUG(Service_FS, "type=%u size=%u data=%s", static_cast<u32>(dirname_type), dirname_size, | 401 | LOG_DEBUG(Service_FS, "type=%u size=%u data=%s", static_cast<u32>(dirname_type), dirname_size, |
| 396 | dir_path.DebugStr().c_str()); | 402 | dir_path.DebugStr().c_str()); |
| 397 | 403 | ||
| 398 | ResultVal<std::shared_ptr<Directory>> dir_res = OpenDirectoryFromArchive(archive_handle, dir_path); | 404 | ResultVal<std::shared_ptr<Directory>> dir_res = |
| 405 | OpenDirectoryFromArchive(archive_handle, dir_path); | ||
| 399 | cmd_buff[1] = dir_res.Code().raw; | 406 | cmd_buff[1] = dir_res.Code().raw; |
| 400 | if (dir_res.Succeeded()) { | 407 | if (dir_res.Succeeded()) { |
| 401 | std::shared_ptr<Directory> directory = *dir_res; | 408 | std::shared_ptr<Directory> directory = *dir_res; |
| 402 | auto sessions = ServerSession::CreateSessionPair(directory->GetName(), directory); | 409 | auto sessions = ServerSession::CreateSessionPair(directory->GetName(), directory); |
| 403 | directory->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); | 410 | directory->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); |
| 404 | cmd_buff[3] = Kernel::g_handle_table.Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)).MoveFrom(); | 411 | cmd_buff[3] = Kernel::g_handle_table |
| 412 | .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) | ||
| 413 | .MoveFrom(); | ||
| 405 | } else { | 414 | } else { |
| 406 | LOG_ERROR(Service_FS, "failed to get a handle for directory type=%d size=%d data=%s", | 415 | LOG_ERROR(Service_FS, "failed to get a handle for directory type=%d size=%d data=%s", |
| 407 | dirname_type, dirname_size, dir_path.DebugStr().c_str()); | 416 | dirname_type, dirname_size, dir_path.DebugStr().c_str()); |
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 418b128b1..9f68898db 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp | |||
| @@ -8,7 +8,6 @@ | |||
| 8 | #include "common/string_util.h" | 8 | #include "common/string_util.h" |
| 9 | 9 | ||
| 10 | #include "core/hle/kernel/server_port.h" | 10 | #include "core/hle/kernel/server_port.h" |
| 11 | #include "core/hle/service/service.h" | ||
| 12 | #include "core/hle/service/ac_u.h" | 11 | #include "core/hle/service/ac_u.h" |
| 13 | #include "core/hle/service/act_a.h" | 12 | #include "core/hle/service/act_a.h" |
| 14 | #include "core/hle/service/act_u.h" | 13 | #include "core/hle/service/act_u.h" |
| @@ -66,11 +65,13 @@ static std::string MakeFunctionString(const char* name, const char* port_name, | |||
| 66 | return function_string; | 65 | return function_string; |
| 67 | } | 66 | } |
| 68 | 67 | ||
| 69 | void SessionRequestHandler::ClientConnected(Kernel::SharedPtr<Kernel::ServerSession> server_session) { | 68 | void SessionRequestHandler::ClientConnected( |
| 69 | Kernel::SharedPtr<Kernel::ServerSession> server_session) { | ||
| 70 | connected_sessions.push_back(server_session); | 70 | connected_sessions.push_back(server_session); |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | void SessionRequestHandler::ClientDisconnected(Kernel::SharedPtr<Kernel::ServerSession> server_session) { | 73 | void SessionRequestHandler::ClientDisconnected( |
| 74 | Kernel::SharedPtr<Kernel::ServerSession> server_session) { | ||
| 74 | boost::range::remove_erase(connected_sessions, server_session); | 75 | boost::range::remove_erase(connected_sessions, server_session); |
| 75 | } | 76 | } |
| 76 | 77 | ||
| @@ -78,7 +79,8 @@ Interface::Interface(u32 max_sessions) : max_sessions(max_sessions) {} | |||
| 78 | Interface::~Interface() = default; | 79 | Interface::~Interface() = default; |
| 79 | 80 | ||
| 80 | void Interface::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) { | 81 | void Interface::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) { |
| 81 | // TODO(Subv): Make use of the server_session in the HLE service handlers to distinguish which session triggered each command. | 82 | // TODO(Subv): Make use of the server_session in the HLE service handlers to distinguish which |
| 83 | // session triggered each command. | ||
| 82 | 84 | ||
| 83 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 85 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 84 | auto itr = m_functions.find(cmd_buff[0]); | 86 | auto itr = m_functions.find(cmd_buff[0]); |
| @@ -113,15 +115,17 @@ void Interface::Register(const FunctionInfo* functions, size_t n) { | |||
| 113 | // Module interface | 115 | // Module interface |
| 114 | 116 | ||
| 115 | static void AddNamedPort(Interface* interface_) { | 117 | static void AddNamedPort(Interface* interface_) { |
| 116 | auto ports = Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(), | 118 | auto ports = |
| 117 | std::shared_ptr<Interface>(interface_)); | 119 | Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(), |
| 120 | std::shared_ptr<Interface>(interface_)); | ||
| 118 | auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports); | 121 | auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports); |
| 119 | g_kernel_named_ports.emplace(interface_->GetPortName(), std::move(client_port)); | 122 | g_kernel_named_ports.emplace(interface_->GetPortName(), std::move(client_port)); |
| 120 | } | 123 | } |
| 121 | 124 | ||
| 122 | void AddService(Interface* interface_) { | 125 | void AddService(Interface* interface_) { |
| 123 | auto ports = Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(), | 126 | auto ports = |
| 124 | std::shared_ptr<Interface>(interface_)); | 127 | Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(), |
| 128 | std::shared_ptr<Interface>(interface_)); | ||
| 125 | auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports); | 129 | auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports); |
| 126 | g_srv_services.emplace(interface_->GetPortName(), std::move(client_port)); | 130 | g_srv_services.emplace(interface_->GetPortName(), std::move(client_port)); |
| 127 | } | 131 | } |
| @@ -190,5 +194,4 @@ void Shutdown() { | |||
| 190 | g_kernel_named_ports.clear(); | 194 | g_kernel_named_ports.clear(); |
| 191 | LOG_DEBUG(Service, "shutdown OK"); | 195 | LOG_DEBUG(Service, "shutdown OK"); |
| 192 | } | 196 | } |
| 193 | |||
| 194 | } | 197 | } |
diff --git a/src/core/hle/service/service.h b/src/core/hle/service/service.h index a3af48684..a7ba7688f 100644 --- a/src/core/hle/service/service.h +++ b/src/core/hle/service/service.h | |||
| @@ -15,7 +15,6 @@ | |||
| 15 | #include "core/hle/result.h" | 15 | #include "core/hle/result.h" |
| 16 | #include "core/memory.h" | 16 | #include "core/memory.h" |
| 17 | 17 | ||
| 18 | |||
| 19 | namespace Kernel { | 18 | namespace Kernel { |
| 20 | class ServerSession; | 19 | class ServerSession; |
| 21 | } | 20 | } |
| @@ -26,12 +25,13 @@ class ServerSession; | |||
| 26 | namespace Service { | 25 | namespace Service { |
| 27 | 26 | ||
| 28 | static const int kMaxPortSize = 8; ///< Maximum size of a port name (8 characters) | 27 | static const int kMaxPortSize = 8; ///< Maximum size of a port name (8 characters) |
| 29 | static const u32 DefaultMaxSessions = 10; ///< Arbitrary default number of maximum connections to an HLE service | 28 | /// Arbitrary default number of maximum connections to an HLE service. |
| 29 | static const u32 DefaultMaxSessions = 10; | ||
| 30 | 30 | ||
| 31 | /** | 31 | /** |
| 32 | * Interface implemented by HLE Session handlers. | 32 | * Interface implemented by HLE Session handlers. |
| 33 | * This can be provided to a ServerSession in order to hook into several relevant events (such as a new connection or a SyncRequest) | 33 | * This can be provided to a ServerSession in order to hook into several relevant events |
| 34 | * so they can be implemented in the emulator. | 34 | * (such as a new connection or a SyncRequest) so they can be implemented in the emulator. |
| 35 | */ | 35 | */ |
| 36 | class SessionRequestHandler { | 36 | class SessionRequestHandler { |
| 37 | public: | 37 | public: |
| @@ -61,12 +61,14 @@ public: | |||
| 61 | 61 | ||
| 62 | protected: | 62 | protected: |
| 63 | /// List of sessions that are connected to this handler. | 63 | /// List of sessions that are connected to this handler. |
| 64 | /// A ServerSession whose server endpoint is an HLE implementation is kept alive by this list for the duration of the connection. | 64 | /// A ServerSession whose server endpoint is an HLE implementation is kept alive by this list |
| 65 | // for the duration of the connection. | ||
| 65 | std::vector<Kernel::SharedPtr<Kernel::ServerSession>> connected_sessions; | 66 | std::vector<Kernel::SharedPtr<Kernel::ServerSession>> connected_sessions; |
| 66 | }; | 67 | }; |
| 67 | 68 | ||
| 68 | /** | 69 | /** |
| 69 | * Framework for implementing HLE service handlers which dispatch incoming SyncRequests based on a table mapping header ids to handler functions. | 70 | * Framework for implementing HLE service handlers which dispatch incoming SyncRequests based on a |
| 71 | * table mapping header ids to handler functions. | ||
| 70 | */ | 72 | */ |
| 71 | class Interface : public SessionRequestHandler { | 73 | class Interface : public SessionRequestHandler { |
| 72 | public: | 74 | public: |
| @@ -88,10 +90,13 @@ public: | |||
| 88 | } | 90 | } |
| 89 | 91 | ||
| 90 | /** | 92 | /** |
| 91 | * Gets the maximum allowed number of sessions that can be connected to this service at the same time. | 93 | * Gets the maximum allowed number of sessions that can be connected to this service |
| 94 | * at the same time. | ||
| 92 | * @returns The maximum number of connections allowed. | 95 | * @returns The maximum number of connections allowed. |
| 93 | */ | 96 | */ |
| 94 | u32 GetMaxSessions() const { return max_sessions; } | 97 | u32 GetMaxSessions() const { |
| 98 | return max_sessions; | ||
| 99 | } | ||
| 95 | 100 | ||
| 96 | typedef void (*Function)(Interface*); | 101 | typedef void (*Function)(Interface*); |
| 97 | 102 | ||
diff --git a/src/core/hle/service/srv.cpp b/src/core/hle/service/srv.cpp index 37420201b..18d0a699d 100644 --- a/src/core/hle/service/srv.cpp +++ b/src/core/hle/service/srv.cpp | |||
| @@ -7,8 +7,8 @@ | |||
| 7 | #include "common/common_types.h" | 7 | #include "common/common_types.h" |
| 8 | #include "common/logging/log.h" | 8 | #include "common/logging/log.h" |
| 9 | #include "core/hle/kernel/client_session.h" | 9 | #include "core/hle/kernel/client_session.h" |
| 10 | #include "core/hle/kernel/server_session.h" | ||
| 11 | #include "core/hle/kernel/event.h" | 10 | #include "core/hle/kernel/event.h" |
| 11 | #include "core/hle/kernel/server_session.h" | ||
| 12 | #include "core/hle/service/srv.h" | 12 | #include "core/hle/service/srv.h" |
| 13 | 13 | ||
| 14 | //////////////////////////////////////////////////////////////////////////////////////////////////// | 14 | //////////////////////////////////////////////////////////////////////////////////////////////////// |
diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp index f24b5c91a..e5ba9a484 100644 --- a/src/core/hle/svc.cpp +++ b/src/core/hle/svc.cpp | |||
| @@ -236,14 +236,16 @@ static ResultCode ConnectToPort(Handle* out_handle, const char* port_name) { | |||
| 236 | 236 | ||
| 237 | /// Makes a blocking IPC call to an OS service. | 237 | /// Makes a blocking IPC call to an OS service. |
| 238 | static ResultCode SendSyncRequest(Handle handle) { | 238 | static ResultCode SendSyncRequest(Handle handle) { |
| 239 | SharedPtr<Kernel::ClientSession> session = Kernel::g_handle_table.Get<Kernel::ClientSession>(handle); | 239 | SharedPtr<Kernel::ClientSession> session = |
| 240 | Kernel::g_handle_table.Get<Kernel::ClientSession>(handle); | ||
| 240 | if (session == nullptr) { | 241 | if (session == nullptr) { |
| 241 | return ERR_INVALID_HANDLE; | 242 | return ERR_INVALID_HANDLE; |
| 242 | } | 243 | } |
| 243 | 244 | ||
| 244 | LOG_TRACE(Kernel_SVC, "called handle=0x%08X(%s)", handle, session->GetName().c_str()); | 245 | LOG_TRACE(Kernel_SVC, "called handle=0x%08X(%s)", handle, session->GetName().c_str()); |
| 245 | 246 | ||
| 246 | // TODO(Subv): svcSendSyncRequest should put the caller thread to sleep while the server responds and cause a reschedule. | 247 | // TODO(Subv): svcSendSyncRequest should put the caller thread to sleep while the server |
| 248 | // responds and cause a reschedule. | ||
| 247 | return session->SendSyncRequest(); | 249 | return session->SendSyncRequest(); |
| 248 | } | 250 | } |
| 249 | 251 | ||