diff options
author | David Marcec <dmarcecguzman@gmail.com> | 2018-10-06 08:49:01 +0200 |
---|---|---|
committer | David Marcec <dmarcecguzman@gmail.com> | 2018-10-06 08:49:01 +0200 |
commit | f84b9ed4e8c38928e8e1bb57c2914256375b5af4 (patch) | |
tree | 248a593e98e8a14ed4a111dc9ad5241aa639784c | |
parent | Merge pull request #1447 from lioncash/mutex (diff) | |
download | yuzu-f84b9ed4e8c38928e8e1bb57c2914256375b5af4.tar yuzu-f84b9ed4e8c38928e8e1bb57c2914256375b5af4.tar.gz yuzu-f84b9ed4e8c38928e8e1bb57c2914256375b5af4.tar.bz2 yuzu-f84b9ed4e8c38928e8e1bb57c2914256375b5af4.tar.lz yuzu-f84b9ed4e8c38928e8e1bb57c2914256375b5af4.tar.xz yuzu-f84b9ed4e8c38928e8e1bb57c2914256375b5af4.tar.zst yuzu-f84b9ed4e8c38928e8e1bb57c2914256375b5af4.zip |
-rw-r--r-- | src/core/hle/kernel/client_port.h | 6 | ||||
-rw-r--r-- | src/core/hle/kernel/server_port.h | 1 | ||||
-rw-r--r-- | src/core/hle/service/sm/sm.h | 19 |
3 files changed, 25 insertions, 1 deletions
diff --git a/src/core/hle/kernel/client_port.h b/src/core/hle/kernel/client_port.h index f3dfebbb1..a82b29417 100644 --- a/src/core/hle/kernel/client_port.h +++ b/src/core/hle/kernel/client_port.h @@ -7,13 +7,13 @@ #include <string> #include "common/common_types.h" #include "core/hle/kernel/object.h" +#include "core/hle/kernel/server_port.h" #include "core/hle/result.h" namespace Kernel { class ClientSession; class KernelCore; -class ServerPort; class ClientPort final : public Object { public: @@ -30,6 +30,10 @@ public: return HANDLE_TYPE; } + SharedPtr<ServerPort> GetServerPort() const { + return server_port; + } + /** * 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 diff --git a/src/core/hle/kernel/server_port.h b/src/core/hle/kernel/server_port.h index 62fb51349..e52f8245f 100644 --- a/src/core/hle/kernel/server_port.h +++ b/src/core/hle/kernel/server_port.h @@ -11,6 +11,7 @@ #include "common/common_types.h" #include "core/hle/kernel/object.h" #include "core/hle/kernel/wait_object.h" +#include "core/hle/result.h" namespace Kernel { diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h index da2c51082..4f8145dda 100644 --- a/src/core/hle/service/sm/sm.h +++ b/src/core/hle/service/sm/sm.h @@ -6,9 +6,12 @@ #include <memory> #include <string> +#include <type_traits> #include <unordered_map> +#include "core/hle/kernel/client_port.h" #include "core/hle/kernel/object.h" +#include "core/hle/kernel/server_port.h" #include "core/hle/result.h" #include "core/hle/service/service.h" @@ -48,6 +51,22 @@ public: ResultVal<Kernel::SharedPtr<Kernel::ClientPort>> GetServicePort(const std::string& name); ResultVal<Kernel::SharedPtr<Kernel::ClientSession>> ConnectToService(const std::string& name); + template <typename T> + std::shared_ptr<T> GetService(const std::string& service_name) const { + static_assert(std::is_base_of_v<Kernel::SessionRequestHandler, T>, + "Not a base of ServiceFrameworkBase"); + auto service = registered_services.find(service_name); + if (service == registered_services.end()) { + LOG_DEBUG(Service, "Can't find service: {}", service_name); + return nullptr; + } + auto port = service->second->GetServerPort(); + if (port == nullptr) { + return nullptr; + } + return std::static_pointer_cast<T>(port->hle_handler); + } + void InvokeControlRequest(Kernel::HLERequestContext& context); private: |