1
0
mirror of https://github.com/citra-emu/citra.git synced 2024-12-23 05:30:05 +00:00

Moved the HLE command buffer translation task to ServerSession instead of the HLE handler superclass.

This commit is contained in:
Subv 2016-12-09 12:52:12 -05:00
parent deb83c9fc5
commit ebbb55ec8f
6 changed files with 38 additions and 47 deletions

View File

@ -41,8 +41,14 @@ ResultCode ServerSession::HandleSyncRequest() {
// from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or similar. // from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or similar.
// If this ServerSession has an associated HLE handler, forward the request to it. // If this ServerSession has an associated HLE handler, forward the request to it.
if (hle_handler != nullptr) if (hle_handler != nullptr) {
return hle_handler->HandleSyncRequest(SharedPtr<ServerSession>(this)); // Attempt to translate the incoming request's command buffer.
ResultCode result = TranslateHLERequest(this);
if (result.IsError())
return result;
hle_handler->HandleSyncRequest(SharedPtr<ServerSession>(this));
// TODO(Subv): Translate the response command buffer.
}
// If this ServerSession does not have an HLE implementation, just wake up the threads waiting on it. // If this ServerSession does not have an HLE implementation, just wake up the threads waiting on it.
signaled = true; signaled = true;
@ -60,4 +66,9 @@ ServerSession::SessionPair ServerSession::CreateSessionPair(const std::string& n
return std::make_tuple(std::move(server_session), std::move(client_session)); return std::make_tuple(std::move(server_session), std::move(client_session));
} }
ResultCode TranslateHLERequest(ServerSession* server_session) {
// TODO(Subv): Implement this function once multiple concurrent processes are supported.
return RESULT_SUCCESS;
}
} }

View File

@ -76,4 +76,14 @@ private:
*/ */
static ResultVal<SharedPtr<ServerSession>> Create(std::string name = "Unknown", std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr); static ResultVal<SharedPtr<ServerSession>> Create(std::string name = "Unknown", std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr);
}; };
/**
* Performs command buffer translation for an HLE IPC request.
* The command buffer from the ServerSession thread's TLS is copied into a
* buffer and all descriptors in the buffer are processed.
* TODO(Subv): Implement this function, currently we do not support multiple processes running at once,
* but once that is implemented we'll need to properly translate all descriptors in the command buffer.
*/
ResultCode TranslateHLERequest(ServerSession* server_session);
} }

View File

@ -93,7 +93,7 @@ File::File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path&
File::~File() {} File::~File() {}
void File::HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) { void File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
u32* cmd_buff = Kernel::GetCommandBuffer(); u32* cmd_buff = Kernel::GetCommandBuffer();
FileCommand cmd = static_cast<FileCommand>(cmd_buff[0]); FileCommand cmd = static_cast<FileCommand>(cmd_buff[0]);
switch (cmd) { switch (cmd) {
@ -207,7 +207,7 @@ Directory::Directory(std::unique_ptr<FileSys::DirectoryBackend>&& backend,
Directory::~Directory() {} Directory::~Directory() {}
void Directory::HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) { void Directory::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
u32* cmd_buff = Kernel::GetCommandBuffer(); u32* cmd_buff = Kernel::GetCommandBuffer();
DirectoryCommand cmd = static_cast<DirectoryCommand>(cmd_buff[0]); DirectoryCommand cmd = static_cast<DirectoryCommand>(cmd_buff[0]);
switch (cmd) { switch (cmd) {

View File

@ -55,7 +55,7 @@ public:
std::unique_ptr<FileSys::FileBackend> backend; ///< File backend interface std::unique_ptr<FileSys::FileBackend> backend; ///< File backend interface
protected: protected:
void HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) override; void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
}; };
class Directory final : public SessionRequestHandler { class Directory final : public SessionRequestHandler {
@ -71,7 +71,7 @@ public:
std::unique_ptr<FileSys::DirectoryBackend> backend; ///< File backend interface std::unique_ptr<FileSys::DirectoryBackend> backend; ///< File backend interface
protected: protected:
void HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) override; void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
}; };
/** /**

View File

@ -66,21 +66,6 @@ static std::string MakeFunctionString(const char* name, const char* port_name,
return function_string; return function_string;
} }
ResultCode SessionRequestHandler::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
// Attempt to translate the incoming request's command buffer.
ResultCode result = TranslateRequest(server_session);
if (result.IsError())
return result;
// Actually handle the request
HandleSyncRequestImpl(server_session);
// TODO(Subv): Translate the response command buffer.
return RESULT_SUCCESS;
}
void SessionRequestHandler::ClientConnected(Kernel::SharedPtr<Kernel::ServerSession> server_session) { void SessionRequestHandler::ClientConnected(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
connected_sessions.push_back(server_session); connected_sessions.push_back(server_session);
} }
@ -89,15 +74,10 @@ void SessionRequestHandler::ClientDisconnected(Kernel::SharedPtr<Kernel::ServerS
boost::range::remove_erase(connected_sessions, server_session); boost::range::remove_erase(connected_sessions, server_session);
} }
ResultCode SessionRequestHandler::TranslateRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
// TODO(Subv): Implement this function once multiple concurrent processes are supported.
return RESULT_SUCCESS;
}
Interface::Interface(u32 max_sessions) : max_sessions(max_sessions) {} Interface::Interface(u32 max_sessions) : max_sessions(max_sessions) {}
Interface::~Interface() = default; Interface::~Interface() = default;
void Interface::HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) { void Interface::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
// TODO(Subv): Make use of the server_session in the HLE service handlers to distinguish which session triggered each command. // TODO(Subv): Make use of the server_session in the HLE service handlers to distinguish which session triggered each command.
u32* cmd_buff = Kernel::GetCommandBuffer(); u32* cmd_buff = Kernel::GetCommandBuffer();

View File

@ -15,6 +15,11 @@
#include "core/hle/result.h" #include "core/hle/result.h"
#include "core/memory.h" #include "core/memory.h"
namespace Kernel {
class ServerSession;
}
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Namespace Service // Namespace Service
@ -31,12 +36,14 @@ static const u32 DefaultMaxSessions = 10; ///< Arbitrary default number of maxim
class SessionRequestHandler { class SessionRequestHandler {
public: public:
/** /**
* Dispatches and handles a sync request from the emulated application. * Handles a sync request from the emulated application.
* @param server_session The ServerSession that was triggered for this sync request, * @param server_session The ServerSession that was triggered for this sync request,
* it should be used to differentiate which client (As in ClientSession) we're answering to. * it should be used to differentiate which client (As in ClientSession) we're answering to.
* TODO(Subv): Use a wrapper structure to hold all the information relevant to
* this request (ServerSession, Originator thread, Translated command buffer, etc).
* @returns ResultCode the result code of the translate operation. * @returns ResultCode the result code of the translate operation.
*/ */
ResultCode HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session); virtual void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) = 0;
/** /**
* Signals that a client has just connected to this HLE handler and keeps the * Signals that a client has just connected to this HLE handler and keeps the
@ -53,23 +60,6 @@ public:
void ClientDisconnected(Kernel::SharedPtr<Kernel::ServerSession> server_session); void ClientDisconnected(Kernel::SharedPtr<Kernel::ServerSession> server_session);
protected: protected:
/**
* Handles a sync request from the emulated application and writes the response to the command buffer.
* TODO(Subv): Use a wrapper structure to hold all the information relevant to
* this request (ServerSession, Originator thread, Translated command buffer, etc).
*/
virtual void HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) = 0;
private:
/**
* Performs command buffer translation for this request.
* The command buffer from the ServerSession thread's TLS is copied into a
* buffer and all descriptors in the buffer are processed.
* TODO(Subv): Implement this function, currently we do not support multiple processes running at once,
* but once that is implemented we'll need to properly translate all descriptors in the command buffer.
*/
ResultCode TranslateRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session);
/// List of sessions that are connected to this handler. /// 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. /// 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<Kernel::SharedPtr<Kernel::ServerSession>> connected_sessions;
@ -120,7 +110,7 @@ public:
} }
protected: protected:
void HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) override; void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
/** /**
* Registers the functions in the service * Registers the functions in the service