diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/client_port.cpp | 11 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_port.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_port.h | 14 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_session.cpp | 16 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_session.h | 20 | ||||
| -rw-r--r-- | src/core/hle/result.h | 19 | ||||
| -rw-r--r-- | src/core/hle/service/fs/archive.cpp | 11 | ||||
| -rw-r--r-- | src/core/hle/service/fs/archive.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/fs/fs_user.cpp | 33 | ||||
| -rw-r--r-- | src/core/hle/service/service.cpp | 20 |
12 files changed, 92 insertions, 62 deletions
diff --git a/src/core/hle/kernel/client_port.cpp b/src/core/hle/kernel/client_port.cpp index 45533ed45..ce5d94e99 100644 --- a/src/core/hle/kernel/client_port.cpp +++ b/src/core/hle/kernel/client_port.cpp | |||
| @@ -26,20 +26,17 @@ ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() { | |||
| 26 | active_sessions++; | 26 | active_sessions++; |
| 27 | 27 | ||
| 28 | // Create a new session pair, let the created sessions inherit the parent port's HLE handler. | 28 | // Create a new session pair, let the created sessions inherit the parent port's HLE handler. |
| 29 | auto sessions = | 29 | auto sessions = ServerSession::CreateSessionPair(server_port->GetName(), this); |
| 30 | ServerSession::CreateSessionPair(server_port->GetName(), server_port->hle_handler, this); | ||
| 31 | auto client_session = std::get<SharedPtr<ClientSession>>(sessions); | ||
| 32 | auto server_session = std::get<SharedPtr<ServerSession>>(sessions); | ||
| 33 | 30 | ||
| 34 | if (server_port->hle_handler) | 31 | if (server_port->hle_handler) |
| 35 | server_port->hle_handler->ClientConnected(server_session); | 32 | server_port->hle_handler->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions)); |
| 36 | else | 33 | else |
| 37 | server_port->pending_sessions.push_back(std::move(server_session)); | 34 | server_port->pending_sessions.push_back(std::get<SharedPtr<ServerSession>>(sessions)); |
| 38 | 35 | ||
| 39 | // Wake the threads waiting on the ServerPort | 36 | // Wake the threads waiting on the ServerPort |
| 40 | server_port->WakeupAllWaitingThreads(); | 37 | server_port->WakeupAllWaitingThreads(); |
| 41 | 38 | ||
| 42 | return MakeResult<SharedPtr<ClientSession>>(std::move(client_session)); | 39 | return MakeResult(std::get<SharedPtr<ClientSession>>(sessions)); |
| 43 | } | 40 | } |
| 44 | 41 | ||
| 45 | } // namespace | 42 | } // namespace |
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index 4886afa5c..0922b3f47 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp | |||
| @@ -12,10 +12,12 @@ | |||
| 12 | namespace Kernel { | 12 | namespace Kernel { |
| 13 | 13 | ||
| 14 | void SessionRequestHandler::ClientConnected(SharedPtr<ServerSession> server_session) { | 14 | void SessionRequestHandler::ClientConnected(SharedPtr<ServerSession> server_session) { |
| 15 | server_session->SetHleHandler(shared_from_this()); | ||
| 15 | connected_sessions.push_back(server_session); | 16 | connected_sessions.push_back(server_session); |
| 16 | } | 17 | } |
| 17 | 18 | ||
| 18 | void SessionRequestHandler::ClientDisconnected(SharedPtr<ServerSession> server_session) { | 19 | void SessionRequestHandler::ClientDisconnected(SharedPtr<ServerSession> server_session) { |
| 20 | server_session->SetHleHandler(nullptr); | ||
| 19 | boost::range::remove_erase(connected_sessions, server_session); | 21 | boost::range::remove_erase(connected_sessions, server_session); |
| 20 | } | 22 | } |
| 21 | 23 | ||
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index b3550734c..14f682f44 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <memory> | ||
| 7 | #include <vector> | 8 | #include <vector> |
| 8 | #include "core/hle/kernel/kernel.h" | 9 | #include "core/hle/kernel/kernel.h" |
| 9 | 10 | ||
| @@ -16,7 +17,7 @@ class ServerSession; | |||
| 16 | * This can be provided to a ServerSession in order to hook into several relevant events | 17 | * This can be provided to a ServerSession in order to hook into several relevant events |
| 17 | * (such as a new connection or a SyncRequest) so they can be implemented in the emulator. | 18 | * (such as a new connection or a SyncRequest) so they can be implemented in the emulator. |
| 18 | */ | 19 | */ |
| 19 | class SessionRequestHandler { | 20 | class SessionRequestHandler : public std::enable_shared_from_this<SessionRequestHandler> { |
| 20 | public: | 21 | public: |
| 21 | /** | 22 | /** |
| 22 | * Handles a sync request from the emulated application. | 23 | * Handles a sync request from the emulated application. |
diff --git a/src/core/hle/kernel/server_port.cpp b/src/core/hle/kernel/server_port.cpp index f6e0c7dbf..4d20c39a1 100644 --- a/src/core/hle/kernel/server_port.cpp +++ b/src/core/hle/kernel/server_port.cpp | |||
| @@ -24,13 +24,12 @@ void ServerPort::Acquire(Thread* thread) { | |||
| 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<SessionRequestHandler> hle_handler) { | 27 | u32 max_sessions, std::string name) { |
| 28 | 28 | ||
| 29 | SharedPtr<ServerPort> server_port(new ServerPort); | 29 | SharedPtr<ServerPort> server_port(new ServerPort); |
| 30 | SharedPtr<ClientPort> client_port(new ClientPort); | 30 | SharedPtr<ClientPort> client_port(new ClientPort); |
| 31 | 31 | ||
| 32 | server_port->name = name + "_Server"; | 32 | server_port->name = name + "_Server"; |
| 33 | server_port->hle_handler = std::move(hle_handler); | ||
| 34 | client_port->name = name + "_Client"; | 33 | client_port->name = name + "_Client"; |
| 35 | client_port->server_port = server_port; | 34 | client_port->server_port = server_port; |
| 36 | client_port->max_sessions = max_sessions; | 35 | client_port->max_sessions = max_sessions; |
diff --git a/src/core/hle/kernel/server_port.h b/src/core/hle/kernel/server_port.h index 281559acf..f1419cd46 100644 --- a/src/core/hle/kernel/server_port.h +++ b/src/core/hle/kernel/server_port.h | |||
| @@ -20,15 +20,13 @@ class ServerPort final : public WaitObject { | |||
| 20 | public: | 20 | public: |
| 21 | /** | 21 | /** |
| 22 | * Creates a pair of ServerPort and an associated ClientPort. | 22 | * Creates a pair of ServerPort and an associated ClientPort. |
| 23 | * | ||
| 23 | * @param max_sessions Maximum number of sessions to the port | 24 | * @param max_sessions Maximum number of sessions to the port |
| 24 | * @param name Optional name of the ports | 25 | * @param name Optional name of the ports |
| 25 | * @param hle_handler Optional HLE handler template for the port, | ||
| 26 | * ServerSessions crated from this port will inherit a reference to this handler. | ||
| 27 | * @return The created port tuple | 26 | * @return The created port tuple |
| 28 | */ | 27 | */ |
| 29 | static std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair( | 28 | static std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair( |
| 30 | u32 max_sessions, std::string name = "UnknownPort", | 29 | u32 max_sessions, std::string name = "UnknownPort"); |
| 31 | std::shared_ptr<SessionRequestHandler> hle_handler = nullptr); | ||
| 32 | 30 | ||
| 33 | std::string GetTypeName() const override { | 31 | std::string GetTypeName() const override { |
| 34 | return "ServerPort"; | 32 | return "ServerPort"; |
| @@ -42,6 +40,14 @@ public: | |||
| 42 | return HANDLE_TYPE; | 40 | return HANDLE_TYPE; |
| 43 | } | 41 | } |
| 44 | 42 | ||
| 43 | /** | ||
| 44 | * Sets the HLE handler template for the port. ServerSessions crated by connecting to this port | ||
| 45 | * will inherit a reference to this handler. | ||
| 46 | */ | ||
| 47 | void SetHleHandler(std::shared_ptr<SessionRequestHandler> hle_handler_) { | ||
| 48 | hle_handler = std::move(hle_handler_); | ||
| 49 | } | ||
| 50 | |||
| 45 | std::string name; ///< Name of port (optional) | 51 | std::string name; ///< Name of port (optional) |
| 46 | 52 | ||
| 47 | std::vector<SharedPtr<WaitObject>> | 53 | std::vector<SharedPtr<WaitObject>> |
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index dc39d5229..2dc709bc9 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp | |||
| @@ -28,16 +28,14 @@ ServerSession::~ServerSession() { | |||
| 28 | parent->server = nullptr; | 28 | parent->server = nullptr; |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | ResultVal<SharedPtr<ServerSession>> ServerSession::Create( | 31 | ResultVal<SharedPtr<ServerSession>> ServerSession::Create(std::string name) { |
| 32 | std::string name, std::shared_ptr<SessionRequestHandler> hle_handler) { | ||
| 33 | SharedPtr<ServerSession> server_session(new ServerSession); | 32 | SharedPtr<ServerSession> server_session(new ServerSession); |
| 34 | 33 | ||
| 35 | server_session->name = std::move(name); | 34 | server_session->name = std::move(name); |
| 36 | server_session->signaled = false; | 35 | server_session->signaled = false; |
| 37 | server_session->hle_handler = std::move(hle_handler); | ||
| 38 | server_session->parent = nullptr; | 36 | server_session->parent = nullptr; |
| 39 | 37 | ||
| 40 | return MakeResult<SharedPtr<ServerSession>>(std::move(server_session)); | 38 | return MakeResult(std::move(server_session)); |
| 41 | } | 39 | } |
| 42 | 40 | ||
| 43 | bool ServerSession::ShouldWait(Thread* thread) const { | 41 | bool ServerSession::ShouldWait(Thread* thread) const { |
| @@ -71,13 +69,9 @@ ResultCode ServerSession::HandleSyncRequest() { | |||
| 71 | return RESULT_SUCCESS; | 69 | return RESULT_SUCCESS; |
| 72 | } | 70 | } |
| 73 | 71 | ||
| 74 | ServerSession::SessionPair ServerSession::CreateSessionPair( | 72 | ServerSession::SessionPair ServerSession::CreateSessionPair(const std::string& name, |
| 75 | const std::string& name, std::shared_ptr<SessionRequestHandler> hle_handler, | 73 | SharedPtr<ClientPort> port) { |
| 76 | SharedPtr<ClientPort> port) { | 74 | auto server_session = ServerSession::Create(name + "_Server").MoveFrom(); |
| 77 | |||
| 78 | auto server_session = | ||
| 79 | ServerSession::Create(name + "_Server", std::move(hle_handler)).MoveFrom(); | ||
| 80 | |||
| 81 | SharedPtr<ClientSession> client_session(new ClientSession); | 75 | SharedPtr<ClientSession> client_session(new ClientSession); |
| 82 | client_session->name = name + "_Client"; | 76 | client_session->name = name + "_Client"; |
| 83 | 77 | ||
diff --git a/src/core/hle/kernel/server_session.h b/src/core/hle/kernel/server_session.h index 62d23cf0a..28f365b9e 100644 --- a/src/core/hle/kernel/server_session.h +++ b/src/core/hle/kernel/server_session.h | |||
| @@ -50,14 +50,20 @@ public: | |||
| 50 | /** | 50 | /** |
| 51 | * Creates a pair of ServerSession and an associated ClientSession. | 51 | * Creates a pair of ServerSession and an associated ClientSession. |
| 52 | * @param name Optional name of the ports. | 52 | * @param name Optional name of the ports. |
| 53 | * @param hle_handler Optional HLE handler for this server session. | ||
| 54 | * @param client_port Optional The ClientPort that spawned this session. | 53 | * @param client_port Optional The ClientPort that spawned this session. |
| 55 | * @return The created session tuple | 54 | * @return The created session tuple |
| 56 | */ | 55 | */ |
| 57 | static SessionPair CreateSessionPair( | 56 | static SessionPair CreateSessionPair(const std::string& name = "Unknown", |
| 58 | const std::string& name = "Unknown", | 57 | SharedPtr<ClientPort> client_port = nullptr); |
| 59 | std::shared_ptr<SessionRequestHandler> hle_handler = nullptr, | 58 | |
| 60 | SharedPtr<ClientPort> client_port = nullptr); | 59 | /** |
| 60 | * Sets the HLE handler for the session. This handler will be called to service IPC requests | ||
| 61 | * instead of the regular IPC machinery. (The regular IPC machinery is currently not | ||
| 62 | * implemented.) | ||
| 63 | */ | ||
| 64 | void SetHleHandler(std::shared_ptr<SessionRequestHandler> hle_handler_) { | ||
| 65 | hle_handler = std::move(hle_handler_); | ||
| 66 | } | ||
| 61 | 67 | ||
| 62 | /** | 68 | /** |
| 63 | * Handle a sync request from the emulated application. | 69 | * Handle a sync request from the emulated application. |
| @@ -83,11 +89,9 @@ private: | |||
| 83 | * Creates a server session. The server session can have an optional HLE handler, | 89 | * Creates a server session. The server session can have an optional HLE handler, |
| 84 | * which will be invoked to handle the IPC requests that this session receives. | 90 | * which will be invoked to handle the IPC requests that this session receives. |
| 85 | * @param name Optional name of the server session. | 91 | * @param name Optional name of the server session. |
| 86 | * @param hle_handler Optional HLE handler for this server session. | ||
| 87 | * @return The created server session | 92 | * @return The created server session |
| 88 | */ | 93 | */ |
| 89 | static ResultVal<SharedPtr<ServerSession>> Create( | 94 | static ResultVal<SharedPtr<ServerSession>> Create(std::string name = "Unknown"); |
| 90 | std::string name = "Unknown", std::shared_ptr<SessionRequestHandler> hle_handler = nullptr); | ||
| 91 | }; | 95 | }; |
| 92 | 96 | ||
| 93 | /** | 97 | /** |
diff --git a/src/core/hle/result.h b/src/core/hle/result.h index c49650f7d..5f2cdbb96 100644 --- a/src/core/hle/result.h +++ b/src/core/hle/result.h | |||
| @@ -416,6 +416,16 @@ ResultVal<T> MakeResult(Args&&... args) { | |||
| 416 | } | 416 | } |
| 417 | 417 | ||
| 418 | /** | 418 | /** |
| 419 | * Deducible overload of MakeResult, allowing the template parameter to be ommited if you're just | ||
| 420 | * copy or move constructing. | ||
| 421 | */ | ||
| 422 | template <typename Arg> | ||
| 423 | ResultVal<std::remove_reference_t<Arg>> MakeResult(Arg&& arg) { | ||
| 424 | return ResultVal<std::remove_reference_t<Arg>>::WithCode(RESULT_SUCCESS, | ||
| 425 | std::forward<Arg>(arg)); | ||
| 426 | } | ||
| 427 | |||
| 428 | /** | ||
| 419 | * Check for the success of `source` (which must evaluate to a ResultVal). If it succeeds, unwraps | 429 | * Check for the success of `source` (which must evaluate to a ResultVal). If it succeeds, unwraps |
| 420 | * the contained value and assigns it to `target`, which can be either an l-value expression or a | 430 | * the contained value and assigns it to `target`, which can be either an l-value expression or a |
| 421 | * variable declaration. If it fails the return code is returned from the current function. Thus it | 431 | * variable declaration. If it fails the return code is returned from the current function. Thus it |
| @@ -426,3 +436,12 @@ ResultVal<T> MakeResult(Args&&... args) { | |||
| 426 | if (CONCAT2(check_result_L, __LINE__).Failed()) \ | 436 | if (CONCAT2(check_result_L, __LINE__).Failed()) \ |
| 427 | return CONCAT2(check_result_L, __LINE__).Code(); \ | 437 | return CONCAT2(check_result_L, __LINE__).Code(); \ |
| 428 | target = std::move(*CONCAT2(check_result_L, __LINE__)) | 438 | target = std::move(*CONCAT2(check_result_L, __LINE__)) |
| 439 | |||
| 440 | /** | ||
| 441 | * Analogous to CASCADE_RESULT, but for a bare ResultCode. The code will be propagated if | ||
| 442 | * non-success, or discarded otherwise. | ||
| 443 | */ | ||
| 444 | #define CASCADE_CODE(source) \ | ||
| 445 | auto CONCAT2(check_result_L, __LINE__) = source; \ | ||
| 446 | if (CONCAT2(check_result_L, __LINE__).IsError()) \ | ||
| 447 | return CONCAT2(check_result_L, __LINE__); | ||
diff --git a/src/core/hle/service/fs/archive.cpp b/src/core/hle/service/fs/archive.cpp index d6128d6a7..bbc5f8067 100644 --- a/src/core/hle/service/fs/archive.cpp +++ b/src/core/hle/service/fs/archive.cpp | |||
| @@ -84,6 +84,10 @@ File::File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path& | |||
| 84 | File::~File() {} | 84 | File::~File() {} |
| 85 | 85 | ||
| 86 | void File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) { | 86 | void File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) { |
| 87 | using Kernel::ClientSession; | ||
| 88 | using Kernel::ServerSession; | ||
| 89 | using Kernel::SharedPtr; | ||
| 90 | |||
| 87 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 91 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 88 | FileCommand cmd = static_cast<FileCommand>(cmd_buff[0]); | 92 | FileCommand cmd = static_cast<FileCommand>(cmd_buff[0]); |
| 89 | switch (cmd) { | 93 | switch (cmd) { |
| @@ -162,10 +166,9 @@ void File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_ses | |||
| 162 | 166 | ||
| 163 | case FileCommand::OpenLinkFile: { | 167 | case FileCommand::OpenLinkFile: { |
| 164 | LOG_WARNING(Service_FS, "(STUBBED) File command OpenLinkFile %s", GetName().c_str()); | 168 | LOG_WARNING(Service_FS, "(STUBBED) File command OpenLinkFile %s", GetName().c_str()); |
| 165 | auto sessions = Kernel::ServerSession::CreateSessionPair(GetName(), shared_from_this()); | 169 | auto sessions = ServerSession::CreateSessionPair(GetName()); |
| 166 | ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); | 170 | ClientConnected(std::get<SharedPtr<ServerSession>>(sessions)); |
| 167 | cmd_buff[3] = Kernel::g_handle_table | 171 | cmd_buff[3] = Kernel::g_handle_table.Create(std::get<SharedPtr<ClientSession>>(sessions)) |
| 168 | .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) | ||
| 169 | .ValueOr(INVALID_HANDLE); | 172 | .ValueOr(INVALID_HANDLE); |
| 170 | break; | 173 | break; |
| 171 | } | 174 | } |
diff --git a/src/core/hle/service/fs/archive.h b/src/core/hle/service/fs/archive.h index 28e33caaa..3a3371c88 100644 --- a/src/core/hle/service/fs/archive.h +++ b/src/core/hle/service/fs/archive.h | |||
| @@ -43,7 +43,7 @@ enum class MediaType : u32 { NAND = 0, SDMC = 1, GameCard = 2 }; | |||
| 43 | 43 | ||
| 44 | typedef u64 ArchiveHandle; | 44 | typedef u64 ArchiveHandle; |
| 45 | 45 | ||
| 46 | class File final : public Kernel::SessionRequestHandler, public std::enable_shared_from_this<File> { | 46 | class File final : public Kernel::SessionRequestHandler { |
| 47 | public: | 47 | public: |
| 48 | File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path& path); | 48 | File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path& path); |
| 49 | ~File(); | 49 | ~File(); |
diff --git a/src/core/hle/service/fs/fs_user.cpp b/src/core/hle/service/fs/fs_user.cpp index fafdd3cc8..fe50403b9 100644 --- a/src/core/hle/service/fs/fs_user.cpp +++ b/src/core/hle/service/fs/fs_user.cpp | |||
| @@ -20,8 +20,9 @@ | |||
| 20 | //////////////////////////////////////////////////////////////////////////////////////////////////// | 20 | //////////////////////////////////////////////////////////////////////////////////////////////////// |
| 21 | // Namespace FS_User | 21 | // Namespace FS_User |
| 22 | 22 | ||
| 23 | using Kernel::SharedPtr; | 23 | using Kernel::ClientSession; |
| 24 | using Kernel::ServerSession; | 24 | using Kernel::ServerSession; |
| 25 | using Kernel::SharedPtr; | ||
| 25 | 26 | ||
| 26 | namespace Service { | 27 | namespace Service { |
| 27 | namespace FS { | 28 | namespace FS { |
| @@ -79,11 +80,11 @@ static void OpenFile(Service::Interface* self) { | |||
| 79 | rb.Push(file_res.Code()); | 80 | rb.Push(file_res.Code()); |
| 80 | if (file_res.Succeeded()) { | 81 | if (file_res.Succeeded()) { |
| 81 | std::shared_ptr<File> file = *file_res; | 82 | std::shared_ptr<File> file = *file_res; |
| 82 | auto sessions = ServerSession::CreateSessionPair(file->GetName(), file); | 83 | auto sessions = ServerSession::CreateSessionPair(file->GetName()); |
| 83 | file->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); | 84 | file->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions)); |
| 84 | rb.PushMoveHandles(Kernel::g_handle_table | 85 | |
| 85 | .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) | 86 | rb.PushMoveHandles( |
| 86 | .MoveFrom()); | 87 | Kernel::g_handle_table.Create(std::get<SharedPtr<ClientSession>>(sessions)).MoveFrom()); |
| 87 | } else { | 88 | } else { |
| 88 | rb.PushMoveHandles(0); | 89 | rb.PushMoveHandles(0); |
| 89 | LOG_ERROR(Service_FS, "failed to get a handle for file %s", file_path.DebugStr().c_str()); | 90 | LOG_ERROR(Service_FS, "failed to get a handle for file %s", file_path.DebugStr().c_str()); |
| @@ -145,11 +146,11 @@ static void OpenFileDirectly(Service::Interface* self) { | |||
| 145 | cmd_buff[1] = file_res.Code().raw; | 146 | cmd_buff[1] = file_res.Code().raw; |
| 146 | if (file_res.Succeeded()) { | 147 | if (file_res.Succeeded()) { |
| 147 | std::shared_ptr<File> file = *file_res; | 148 | std::shared_ptr<File> file = *file_res; |
| 148 | auto sessions = ServerSession::CreateSessionPair(file->GetName(), file); | 149 | auto sessions = ServerSession::CreateSessionPair(file->GetName()); |
| 149 | file->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); | 150 | file->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions)); |
| 150 | cmd_buff[3] = Kernel::g_handle_table | 151 | |
| 151 | .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) | 152 | cmd_buff[3] = |
| 152 | .MoveFrom(); | 153 | Kernel::g_handle_table.Create(std::get<SharedPtr<ClientSession>>(sessions)).MoveFrom(); |
| 153 | } else { | 154 | } else { |
| 154 | cmd_buff[3] = 0; | 155 | cmd_buff[3] = 0; |
| 155 | LOG_ERROR(Service_FS, "failed to get a handle for file %s mode=%u attributes=%u", | 156 | LOG_ERROR(Service_FS, "failed to get a handle for file %s mode=%u attributes=%u", |
| @@ -412,11 +413,11 @@ static void OpenDirectory(Service::Interface* self) { | |||
| 412 | cmd_buff[1] = dir_res.Code().raw; | 413 | cmd_buff[1] = dir_res.Code().raw; |
| 413 | if (dir_res.Succeeded()) { | 414 | if (dir_res.Succeeded()) { |
| 414 | std::shared_ptr<Directory> directory = *dir_res; | 415 | std::shared_ptr<Directory> directory = *dir_res; |
| 415 | auto sessions = ServerSession::CreateSessionPair(directory->GetName(), directory); | 416 | auto sessions = ServerSession::CreateSessionPair(directory->GetName()); |
| 416 | directory->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); | 417 | directory->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions)); |
| 417 | cmd_buff[3] = Kernel::g_handle_table | 418 | |
| 418 | .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) | 419 | cmd_buff[3] = |
| 419 | .MoveFrom(); | 420 | Kernel::g_handle_table.Create(std::get<SharedPtr<ClientSession>>(sessions)).MoveFrom(); |
| 420 | } else { | 421 | } else { |
| 421 | LOG_ERROR(Service_FS, "failed to get a handle for directory type=%d size=%d data=%s", | 422 | LOG_ERROR(Service_FS, "failed to get a handle for directory type=%d size=%d data=%s", |
| 422 | dirname_type, dirname_size, dir_path.DebugStr().c_str()); | 423 | 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 bb22e25be..8f7c97d54 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp | |||
| @@ -105,18 +105,22 @@ void Interface::Register(const FunctionInfo* functions, size_t n) { | |||
| 105 | // Module interface | 105 | // Module interface |
| 106 | 106 | ||
| 107 | static void AddNamedPort(Interface* interface_) { | 107 | static void AddNamedPort(Interface* interface_) { |
| 108 | auto ports = | 108 | Kernel::SharedPtr<Kernel::ServerPort> server_port; |
| 109 | Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(), | 109 | Kernel::SharedPtr<Kernel::ClientPort> client_port; |
| 110 | std::shared_ptr<Interface>(interface_)); | 110 | std::tie(server_port, client_port) = |
| 111 | auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports); | 111 | Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName()); |
| 112 | |||
| 113 | server_port->SetHleHandler(std::shared_ptr<Interface>(interface_)); | ||
| 112 | g_kernel_named_ports.emplace(interface_->GetPortName(), std::move(client_port)); | 114 | g_kernel_named_ports.emplace(interface_->GetPortName(), std::move(client_port)); |
| 113 | } | 115 | } |
| 114 | 116 | ||
| 115 | void AddService(Interface* interface_) { | 117 | void AddService(Interface* interface_) { |
| 116 | auto ports = | 118 | Kernel::SharedPtr<Kernel::ServerPort> server_port; |
| 117 | Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(), | 119 | Kernel::SharedPtr<Kernel::ClientPort> client_port; |
| 118 | std::shared_ptr<Interface>(interface_)); | 120 | std::tie(server_port, client_port) = |
| 119 | auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports); | 121 | Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName()); |
| 122 | |||
| 123 | server_port->SetHleHandler(std::shared_ptr<Interface>(interface_)); | ||
| 120 | g_srv_services.emplace(interface_->GetPortName(), std::move(client_port)); | 124 | g_srv_services.emplace(interface_->GetPortName(), std::move(client_port)); |
| 121 | } | 125 | } |
| 122 | 126 | ||