citra/src/core/rpc/server.cpp
EverOddish 04dd91be82 Initial support for scripting (#4016)
* Add ZeroMQ external submodule

* ZeroMQ libzmq building on macOS

* Added RPC namespace, settings and logging

* Added request queue handling and new classes

* Add C++ interface to ZeroMQ

* Added start of ZeroMQ RPC Server implementation.

* Request construction and callback request handling

* Read and write memory implementation

* Add ID to request format and send reply

* Add RPC setting to macOS UI

* Fixed initialization order bug and added exception handling

* Working read-write through Python

* Update CMakeLists for libzmq to resolve target name conflict on Windows

* Platform-specific CMake definitions for Windows/non-Windows

* Add comments

* Revert "Add RPC setting to macOS UI"

* Always run RPC server instead of configurable

* Add Python scripting example. Updated .gitignore

* Rename member variables to remove trailing underscore

* Finally got libzmq external project building on macOS

* Add missing dependency during libzmq build

* Adding more missing dependencies [skip ci]

* Only build what is required from libzmq

* Extra length checks on client input

* Call InvalidateCacheRange after memory write

* Revert MinGW change. Fix clang-format. Improve error handling in request/reply. Allow any length of data read/write in Python.

* Re-organized RPC static global state into a proper class. [skip ci]

* Make sure libzmq always builds in Release mode

* Renamed Request to Packet since Request and Reply are the same thing

* Moved request fulfillment out of Packet and into RPCServer

* Change request thread from sleep to condition variable

* Remove non-blocking polling from ZMQ server code. Receive now blocks and terminates properly without sleeping. This change significantly improves script speed.

* Move scripting files to dist/ instead of src/

* C++ code review changes for jroweboy [skip ci]

* Python code review changes for jroweboy [skip ci]

* Add docstrings and tests to citra.py [skip ci]

* Add host OS check for libzmq build

* Revert "Add host OS check for libzmq build"

* Fixed a hang when emulation is stopped and restarted due to improper destruction order of ZMQ objects [skip ci]

* Add scripting directory to archive packaging [skip ci]

* Specify C/CXX compiler variables on MinGW build

* Only specify compiler on Linux mingw

* Use gcc and g++ on Windows mingw

* Specify generator for mingw

* Don't specify toolchain on windows mingw

* Changed citra.py to support Python 3 instead of Python 2

* Fix bug where RPC wouldn't restart after Stop/Start emulation

* Added copyright to headers and reorganized includes and forward declarations
2018-09-11 22:00:12 +02:00

35 lines
989 B
C++

#include <functional>
#include "common/threadsafe_queue.h"
#include "core/core.h"
#include "core/rpc/rpc_server.h"
#include "core/rpc/server.h"
namespace RPC {
Server::Server(RPCServer& rpc_server) : rpc_server(rpc_server) {}
void Server::Start() {
const auto callback = [this](std::unique_ptr<RPC::Packet> new_request) {
NewRequestCallback(std::move(new_request));
};
try {
zmq_server = std::make_unique<ZMQServer>(callback);
} catch (...) {
LOG_ERROR(RPC_Server, "Error starting ZeroMQ server");
}
}
void Server::Stop() {
zmq_server.reset();
}
void Server::NewRequestCallback(std::unique_ptr<RPC::Packet> new_request) {
LOG_INFO(RPC_Server, "Received request version={} id={} type={} size={}",
new_request->GetVersion(), new_request->GetId(),
static_cast<u32>(new_request->GetPacketType()), new_request->GetPacketDataSize());
rpc_server.QueueRequest(std::move(new_request));
}
}; // namespace RPC