summaryrefslogtreecommitdiffstats
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorYuri Kunde Schlesner <yuriks@yuriks.net>2017-06-09 06:03:03 +0200
committerGitHub <noreply@github.com>2017-06-09 06:03:03 +0200
commit78398d097879bc04fa55b32b166ee49a35ceaec4 (patch)
tree9461a35f42be4fedd5b58633510cc46503ef8db1 /src/core/hle/kernel
parentMerge pull request #2761 from yuriks/session-references (diff)
parentService/sm: Convert 'srv:' to ServiceFramework (diff)
downloadyuzu-78398d097879bc04fa55b32b166ee49a35ceaec4.tar
yuzu-78398d097879bc04fa55b32b166ee49a35ceaec4.tar.gz
yuzu-78398d097879bc04fa55b32b166ee49a35ceaec4.tar.bz2
yuzu-78398d097879bc04fa55b32b166ee49a35ceaec4.tar.lz
yuzu-78398d097879bc04fa55b32b166ee49a35ceaec4.tar.xz
yuzu-78398d097879bc04fa55b32b166ee49a35ceaec4.tar.zst
yuzu-78398d097879bc04fa55b32b166ee49a35ceaec4.zip
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp2
-rw-r--r--src/core/hle/kernel/hle_ipc.h46
2 files changed, 42 insertions, 6 deletions
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index 0922b3f47..a60b8ef00 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -21,4 +21,6 @@ void SessionRequestHandler::ClientDisconnected(SharedPtr<ServerSession> server_s
boost::range::remove_erase(connected_sessions, server_session);
}
+HLERequestContext::~HLERequestContext() = default;
+
} // namespace Kernel
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h
index 14f682f44..c30184eab 100644
--- a/src/core/hle/kernel/hle_ipc.h
+++ b/src/core/hle/kernel/hle_ipc.h
@@ -7,10 +7,13 @@
#include <memory>
#include <vector>
#include "core/hle/kernel/kernel.h"
+#include "core/hle/kernel/server_session.h"
-namespace Kernel {
+namespace Service {
+class ServiceFrameworkBase;
+}
-class ServerSession;
+namespace Kernel {
/**
* Interface implemented by HLE Session handlers.
@@ -19,6 +22,8 @@ class ServerSession;
*/
class SessionRequestHandler : public std::enable_shared_from_this<SessionRequestHandler> {
public:
+ virtual ~SessionRequestHandler() = default;
+
/**
* Handles a sync request from the emulated application.
* @param server_session The ServerSession that was triggered for this sync request,
@@ -27,27 +32,56 @@ public:
* this request (ServerSession, Originator thread, Translated command buffer, etc).
* @returns ResultCode the result code of the translate operation.
*/
- virtual void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) = 0;
+ virtual void HandleSyncRequest(SharedPtr<ServerSession> server_session) = 0;
/**
* Signals that a client has just connected to this HLE handler and keeps the
* associated ServerSession alive for the duration of the connection.
* @param server_session Owning pointer to the ServerSession associated with the connection.
*/
- void ClientConnected(Kernel::SharedPtr<Kernel::ServerSession> server_session);
+ void ClientConnected(SharedPtr<ServerSession> server_session);
/**
* Signals that a client has just disconnected from this HLE handler and releases the
* associated ServerSession.
* @param server_session ServerSession associated with the connection.
*/
- void ClientDisconnected(Kernel::SharedPtr<Kernel::ServerSession> server_session);
+ void ClientDisconnected(SharedPtr<ServerSession> server_session);
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.
- std::vector<Kernel::SharedPtr<Kernel::ServerSession>> connected_sessions;
+ std::vector<SharedPtr<ServerSession>> connected_sessions;
+};
+
+/**
+ * Class containing information about an in-flight IPC request being handled by an HLE service
+ * implementation. Services should avoid using old global APIs (e.g. Kernel::GetCommandBuffer()) and
+ * when possible use the APIs in this class to service the request.
+ */
+class HLERequestContext {
+public:
+ ~HLERequestContext();
+
+ /// Returns a pointer to the IPC command buffer for this request.
+ u32* CommandBuffer() const {
+ return cmd_buf;
+ }
+
+ /**
+ * Returns the session through which this request was made. This can be used as a map key to
+ * access per-client data on services.
+ */
+ SharedPtr<ServerSession> Session() const {
+ return session;
+ }
+
+private:
+ friend class Service::ServiceFrameworkBase;
+
+ u32* cmd_buf = nullptr;
+ SharedPtr<ServerSession> session;
};
} // namespace Kernel