Просмотр исходного кода

HLE: Use a member variable instead of a virtual function to retrieve the max number of sessions that can be connected to an HLE service at the same time.

Subv 9 лет назад
Родитель
Сommit
61a2fe8c3b

+ 2 - 0
src/core/hle/service/apt/apt.h

@@ -14,6 +14,8 @@ class Interface;
 
 namespace APT {
 
+static const u32 MaxAPTSessions = 2; ///< Each APT service can only have up to 2 sessions connected at the same time.
+
 /// Holds information about the parameters used in Send/Glance/ReceiveParameter
 struct MessageParameter {
     u32 sender_id = 0;

+ 1 - 1
src/core/hle/service/apt/apt_a.cpp

@@ -39,7 +39,7 @@ const Interface::FunctionInfo FunctionTable[] = {
     {0x01020000, CheckNew3DS, "CheckNew3DS"},
 };
 
-APT_A_Interface::APT_A_Interface() {
+APT_A_Interface::APT_A_Interface() : Interface(MaxAPTSessions) {
     Register(FunctionTable);
 }
 

+ 1 - 1
src/core/hle/service/apt/apt_s.cpp

@@ -99,7 +99,7 @@ const Interface::FunctionInfo FunctionTable[] = {
     {0x01020000, CheckNew3DS, "CheckNew3DS"},
 };
 
-APT_S_Interface::APT_S_Interface() {
+APT_S_Interface::APT_S_Interface() : Interface(MaxAPTSessions) {
     Register(FunctionTable);
 }
 

+ 1 - 1
src/core/hle/service/apt/apt_u.cpp

@@ -99,7 +99,7 @@ const Interface::FunctionInfo FunctionTable[] = {
     {0x01020000, CheckNew3DS, "CheckNew3DS"},
 };
 
-APT_U_Interface::APT_U_Interface() {
+APT_U_Interface::APT_U_Interface() : Interface(MaxAPTSessions) {
     Register(FunctionTable);
 }
 

+ 13 - 5
src/core/hle/service/service.h

@@ -174,7 +174,7 @@ inline DescriptorType GetDescriptorType(u32 descriptor) {
 namespace Service {
 
 static const int kMaxPortSize = 8; ///< Maximum size of a port name (8 characters)
-static const u32 DefaultMaxSessions = 10; ///< Arbitrary default number of maximum connections to an HLE port
+static const u32 DefaultMaxSessions = 10; ///< Arbitrary default number of maximum connections to an HLE service
 
 /**
  * Interface implemented by HLE Session handlers.
@@ -215,6 +215,15 @@ private:
  */
 class Interface : public SessionRequestHandler {
 public:
+    /**
+     * Creates an HLE interface with the specified max sessions.
+     * @param max_sessions Maximum number of sessions that can be
+     * connected to this service at the same time.
+     */
+    Interface(u32 max_sessions = DefaultMaxSessions) : max_sessions(max_sessions) { }
+
+    virtual ~Interface() = default;
+
     std::string GetName() const {
         return GetPortName();
     }
@@ -222,14 +231,12 @@ public:
     virtual void SetVersion(u32 raw_version) {
         version.raw = raw_version;
     }
-    virtual ~Interface() {}
 
     /**
-     * Gets the maximum allowed number of sessions that can be connected to this port at the same time.
-     * It should be overwritten by each service implementation for more fine-grained control.
+     * Gets the maximum allowed number of sessions that can be connected to this service at the same time.
      * @returns The maximum number of connections allowed.
      */
-    virtual u32 GetMaxSessions() const { return DefaultMaxSessions; }
+    u32 GetMaxSessions() const { return max_sessions; }
 
     typedef void (*Function)(Interface*);
 
@@ -269,6 +276,7 @@ protected:
     } version = {};
 
 private:
+    u32 max_sessions; ///< Maximum number of concurrent sessions that this service can handle.
     boost::container::flat_map<u32, FunctionInfo> m_functions;
 };