summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorSubv <subv2112@gmail.com>2016-06-17 17:09:43 -0500
committerSubv <subv2112@gmail.com>2016-11-30 23:03:59 -0500
commitc19afd21188e91b9dd2780cf5cb9872a17ad113d (patch)
tree5404cd7850f049d474dbcc3cc4ee80874b0c7627 /src/core/hle/kernel
parent0a33d915f88b89e2fae20edc1e33a8ef60a2519c (diff)
Kernel/HLE: Service::Interface no longer inherits from any Kernel object, and is now its own standalone class.
Interface is now used by aggregation in ClientPort, to forward service commands to their HLE implementation if needed.
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/client_port.cpp23
-rw-r--r--src/core/hle/kernel/client_port.h29
2 files changed, 44 insertions, 8 deletions
diff --git a/src/core/hle/kernel/client_port.cpp b/src/core/hle/kernel/client_port.cpp
index 5ee7679eb..9a9cd4bfd 100644
--- a/src/core/hle/kernel/client_port.cpp
+++ b/src/core/hle/kernel/client_port.cpp
@@ -7,16 +7,39 @@
#include "core/hle/kernel/kernel.h"
#include "core/hle/kernel/server_port.h"
#include "core/hle/kernel/server_session.h"
+#include "core/hle/service/service.h"
namespace Kernel {
ClientPort::ClientPort() {}
ClientPort::~ClientPort() {}
+Kernel::SharedPtr<ClientPort> ClientPort::CreateForHLE(u32 max_sessions, std::unique_ptr<Service::Interface> hle_interface) {
+ SharedPtr<ClientPort> client_port(new ClientPort);
+ client_port->max_sessions = max_sessions;
+ client_port->active_sessions = 0;
+ client_port->name = hle_interface->GetPortName();
+ client_port->hle_interface = std::move(hle_interface);
+
+ return client_port;
+}
+
void ClientPort::AddWaitingSession(SharedPtr<ServerSession> server_session) {
+ // A port that has an associated HLE interface doesn't have a server port.
+ if (hle_interface != nullptr)
+ return;
+
server_port->pending_sessions.push_back(server_session);
// Wake the threads waiting on the ServerPort
server_port->WakeupAllWaitingThreads();
}
+ResultCode ClientPort::HandleSyncRequest() {
+ // Forward the request to the associated HLE interface if it exists
+ if (hle_interface != nullptr)
+ return hle_interface->HandleSyncRequest();
+
+ return RESULT_SUCCESS;
+}
+
} // namespace
diff --git a/src/core/hle/kernel/client_port.h b/src/core/hle/kernel/client_port.h
index eb0882870..ee65606ba 100644
--- a/src/core/hle/kernel/client_port.h
+++ b/src/core/hle/kernel/client_port.h
@@ -5,19 +5,32 @@
#pragma once
#include <string>
+#include <memory>
#include "common/common_types.h"
#include "core/hle/kernel/kernel.h"
+namespace Service {
+class Interface;
+}
+
namespace Kernel {
class ServerPort;
class ServerSession;
-class ClientPort : public Object {
+class ClientPort final : public Object {
public:
friend class ServerPort;
/**
+ * Creates a serverless ClientPort that represents a bridge between the HLE implementation of a service/port and the emulated application.
+ * @param max_sessions Maximum number of sessions that this port is able to handle concurrently.
+ * @param hle_interface Interface object that implements the commands of the service.
+ * @returns ClientPort for the given HLE interface.
+ */
+ static Kernel::SharedPtr<ClientPort> CreateForHLE(u32 max_sessions, std::unique_ptr<Service::Interface> hle_interface);
+
+ /**
* Adds the specified server session to the queue of pending sessions of the associated ServerPort
* @param server_session Server session to add to the queue
*/
@@ -25,10 +38,9 @@ public:
/**
* Handle a sync request from the emulated application.
- * Only HLE services should override this function.
* @returns ResultCode from the operation.
*/
- virtual ResultCode HandleSyncRequest() { return RESULT_SUCCESS; }
+ ResultCode HandleSyncRequest();
std::string GetTypeName() const override { return "ClientPort"; }
std::string GetName() const override { return name; }
@@ -38,12 +50,13 @@ public:
return HANDLE_TYPE;
}
- SharedPtr<ServerPort> server_port; ///< ServerPort associated with this client port.
- u32 max_sessions; ///< Maximum number of simultaneous sessions the port can have
- u32 active_sessions; ///< Number of currently open sessions to this port
- std::string name; ///< Name of client port (optional)
+ SharedPtr<ServerPort> server_port = nullptr; ///< ServerPort associated with this client port.
+ u32 max_sessions; ///< Maximum number of simultaneous sessions the port can have
+ u32 active_sessions; ///< Number of currently open sessions to this port
+ std::string name; ///< Name of client port (optional)
+ std::unique_ptr<Service::Interface> hle_interface = nullptr; ///< HLE implementation of this port's request handler
-protected:
+private:
ClientPort();
~ClientPort() override;
};