mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Merge pull request #696 from yuriks/interface-deinline
De-inline functions from Interface, removing them from service.h
This commit is contained in:
		
						commit
						3ee9f6c5d8
					
				
					 3 changed files with 49 additions and 50 deletions
				
			
		|  | @ -13,6 +13,7 @@ | ||||||
| #include "core/hle/shared_page.h" | #include "core/hle/shared_page.h" | ||||||
| #include "core/hle/kernel/thread.h" | #include "core/hle/kernel/thread.h" | ||||||
| #include "core/hle/service/service.h" | #include "core/hle/service/service.h" | ||||||
|  | #include "core/hle/svc.h" | ||||||
| 
 | 
 | ||||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -51,6 +51,49 @@ namespace Service { | ||||||
| std::unordered_map<std::string, Kernel::SharedPtr<Interface>> g_kernel_named_ports; | std::unordered_map<std::string, Kernel::SharedPtr<Interface>> g_kernel_named_ports; | ||||||
| std::unordered_map<std::string, Kernel::SharedPtr<Interface>> g_srv_services; | std::unordered_map<std::string, Kernel::SharedPtr<Interface>> g_srv_services; | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * Creates a function string for logging, complete with the name (or header code, depending  | ||||||
|  |  * on what's passed in) the port name, and all the cmd_buff arguments. | ||||||
|  |  */ | ||||||
|  | static std::string MakeFunctionString(const char* name, const char* port_name, const u32* cmd_buff) { | ||||||
|  |     // Number of params == bits 0-5 + bits 6-11
 | ||||||
|  |     int num_params = (cmd_buff[0] & 0x3F) + ((cmd_buff[0] >> 6) & 0x3F); | ||||||
|  | 
 | ||||||
|  |     std::string function_string = Common::StringFromFormat("function '%s': port=%s", name, port_name); | ||||||
|  |     for (int i = 1; i <= num_params; ++i) { | ||||||
|  |         function_string += Common::StringFromFormat(", cmd_buff[%i]=%u", i, cmd_buff[i]); | ||||||
|  |     } | ||||||
|  |     return function_string; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ResultVal<bool> Interface::SyncRequest() { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  |     auto itr = m_functions.find(cmd_buff[0]); | ||||||
|  | 
 | ||||||
|  |     if (itr == m_functions.end() || itr->second.func == nullptr) { | ||||||
|  |         std::string function_name = (itr == m_functions.end()) ? Common::StringFromFormat("0x%08X", cmd_buff[0]) : itr->second.name; | ||||||
|  |         LOG_ERROR(Service, "unknown / unimplemented %s", MakeFunctionString(function_name.c_str(), GetPortName().c_str(), cmd_buff).c_str()); | ||||||
|  | 
 | ||||||
|  |         // TODO(bunnei): Hack - ignore error
 | ||||||
|  |         cmd_buff[1] = 0; | ||||||
|  |         return MakeResult<bool>(false); | ||||||
|  |     } else { | ||||||
|  |         LOG_TRACE(Service, "%s", MakeFunctionString(itr->second.name, GetPortName().c_str(), cmd_buff).c_str()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     itr->second.func(this); | ||||||
|  | 
 | ||||||
|  |     return MakeResult<bool>(false); // TODO: Implement return from actual function
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Interface::Register(const FunctionInfo* functions, size_t n) { | ||||||
|  |     m_functions.reserve(n); | ||||||
|  |     for (size_t i = 0; i < n; ++i) { | ||||||
|  |         // Usually this array is sorted by id already, so hint to instead at the end
 | ||||||
|  |         m_functions.emplace_hint(m_functions.cend(), functions[i].id, functions[i]); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
| // Module interface
 | // Module interface
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -4,20 +4,15 @@ | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <algorithm> |  | ||||||
| #include <string> | #include <string> | ||||||
| #include <unordered_map> | #include <unordered_map> | ||||||
| #include <vector> |  | ||||||
| 
 | 
 | ||||||
| #include <boost/container/flat_map.hpp> | #include <boost/container/flat_map.hpp> | ||||||
| 
 | 
 | ||||||
| #include "common/common.h" | #include "common/common.h" | ||||||
| #include "common/string_util.h" |  | ||||||
| #include "core/mem_map.h" |  | ||||||
| 
 | 
 | ||||||
| #include "core/hle/kernel/kernel.h" | #include "core/hle/kernel/kernel.h" | ||||||
| #include "core/hle/kernel/session.h" | #include "core/hle/kernel/session.h" | ||||||
| #include "core/hle/svc.h" |  | ||||||
| 
 | 
 | ||||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
| // Namespace Service
 | // Namespace Service
 | ||||||
|  | @ -26,31 +21,11 @@ namespace Service { | ||||||
| 
 | 
 | ||||||
| static const int kMaxPortSize = 8; ///< Maximum size of a port name (8 characters)
 | static const int kMaxPortSize = 8; ///< Maximum size of a port name (8 characters)
 | ||||||
| 
 | 
 | ||||||
| class Manager; |  | ||||||
| 
 |  | ||||||
| /// Interface to a CTROS service
 | /// Interface to a CTROS service
 | ||||||
| class Interface : public Kernel::Session { | class Interface : public Kernel::Session { | ||||||
|     // TODO(yuriks): An "Interface" being a Kernel::Object is mostly non-sense. Interface should be
 |     // TODO(yuriks): An "Interface" being a Kernel::Object is mostly non-sense. Interface should be
 | ||||||
|     // just something that encapsulates a session and acts as a helper to implement service
 |     // just something that encapsulates a session and acts as a helper to implement service
 | ||||||
|     // processes.
 |     // processes.
 | ||||||
| 
 |  | ||||||
|     friend class Manager; |  | ||||||
| 
 |  | ||||||
|     /**
 |  | ||||||
|      * Creates a function string for logging, complete with the name (or header code, depending  |  | ||||||
|      * on what's passed in) the port name, and all the cmd_buff arguments. |  | ||||||
|      */ |  | ||||||
|     std::string MakeFunctionString(const char* name, const char* port_name, const u32* cmd_buff) { |  | ||||||
|         // Number of params == bits 0-5 + bits 6-11
 |  | ||||||
|         int num_params = (cmd_buff[0] & 0x3F) + ((cmd_buff[0] >> 6) & 0x3F); |  | ||||||
| 
 |  | ||||||
|         std::string function_string = Common::StringFromFormat("function '%s': port=%s", name, port_name); |  | ||||||
|         for (int i = 1; i <= num_params; ++i) { |  | ||||||
|             function_string += Common::StringFromFormat(", cmd_buff[%i]=%u", i, cmd_buff[i]); |  | ||||||
|         } |  | ||||||
|         return function_string; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| public: | public: | ||||||
|     std::string GetName() const override { return GetPortName(); } |     std::string GetName() const override { return GetPortName(); } | ||||||
| 
 | 
 | ||||||
|  | @ -70,25 +45,7 @@ public: | ||||||
|         return "[UNKNOWN SERVICE PORT]"; |         return "[UNKNOWN SERVICE PORT]"; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     ResultVal<bool> SyncRequest() override { |     ResultVal<bool> SyncRequest() override; | ||||||
|         u32* cmd_buff = Kernel::GetCommandBuffer(); |  | ||||||
|         auto itr = m_functions.find(cmd_buff[0]); |  | ||||||
| 
 |  | ||||||
|         if (itr == m_functions.end() || itr->second.func == nullptr) { |  | ||||||
|             std::string function_name = (itr == m_functions.end()) ? Common::StringFromFormat("0x%08X", cmd_buff[0]) : itr->second.name; |  | ||||||
|             LOG_ERROR(Service, "unknown / unimplemented %s", MakeFunctionString(function_name.c_str(), GetPortName().c_str(), cmd_buff).c_str()); |  | ||||||
| 
 |  | ||||||
|             // TODO(bunnei): Hack - ignore error
 |  | ||||||
|             cmd_buff[1] = 0; |  | ||||||
|             return MakeResult<bool>(false); |  | ||||||
|         } else { |  | ||||||
|             LOG_TRACE(Service, "%s", MakeFunctionString(itr->second.name, GetPortName().c_str(), cmd_buff).c_str()); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         itr->second.func(this); |  | ||||||
| 
 |  | ||||||
|         return MakeResult<bool>(false); // TODO: Implement return from actual function
 |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 
 | 
 | ||||||
|  | @ -96,14 +53,12 @@ protected: | ||||||
|      * Registers the functions in the service |      * Registers the functions in the service | ||||||
|      */ |      */ | ||||||
|     template <size_t N> |     template <size_t N> | ||||||
|     void Register(const FunctionInfo (&functions)[N]) { |     inline void Register(const FunctionInfo (&functions)[N]) { | ||||||
|         m_functions.reserve(N); |         Register(functions, N); | ||||||
|         for (auto& fn : functions) { |  | ||||||
|             // Usually this array is sorted by id already, so hint to instead at the end
 |  | ||||||
|             m_functions.emplace_hint(m_functions.cend(), fn.id, fn); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     void Register(const FunctionInfo* functions, size_t n); | ||||||
|  | 
 | ||||||
| private: | private: | ||||||
|     boost::container::flat_map<u32, FunctionInfo> m_functions; |     boost::container::flat_map<u32, FunctionInfo> m_functions; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue