diff --git a/Core/Debugger/WebSocket.cpp b/Core/Debugger/WebSocket.cpp index 3615bc4c27..9d703f19f1 100644 --- a/Core/Debugger/WebSocket.cpp +++ b/Core/Debugger/WebSocket.cpp @@ -42,11 +42,15 @@ #include "Core/Debugger/WebSocket/CPUCoreSubscriber.h" -typedef void (*DebuggerEventHandler)(DebuggerRequest &req); -static const std::unordered_map debuggerEvents({ - {"cpu.getAllRegs", &WebSocketCPUGetAllRegs}, - {"cpu.getReg", &WebSocketCPUGetReg}, - {"cpu.setReg", &WebSocketCPUSetReg}, +typedef void *(*SubscriberInit)(DebuggerEventHandlerMap &map); +typedef void (*Subscribershutdown)(void *p); +struct SubscriberInfo { + SubscriberInit init; + Subscribershutdown shutdown; +}; + +static const std::vector subscribers({ + { &WebSocketCPUCoreInit, nullptr }, }); void HandleDebuggerRequest(const http::Request &request) { @@ -58,6 +62,12 @@ void HandleDebuggerRequest(const http::Request &request) { GameBroadcaster game; SteppingBroadcaster stepping; + std::unordered_map eventHandlers; + std::vector subscriberData; + for (auto info : subscribers) { + subscriberData.push_back(info.init(eventHandlers)); + } + ws->SetTextHandler([&](const std::string &t) { JsonReader reader(t.c_str(), t.size()); if (!reader.ok()) { @@ -73,8 +83,8 @@ void HandleDebuggerRequest(const http::Request &request) { } DebuggerRequest req(event, ws, root); - auto eventFunc = debuggerEvents.find(event); - if (eventFunc != debuggerEvents.end()) { + auto eventFunc = eventHandlers.find(event); + if (eventFunc != eventHandlers.end()) { eventFunc->second(req); req.Finish(); } else { @@ -92,5 +102,13 @@ void HandleDebuggerRequest(const http::Request &request) { stepping.Broadcast(ws); } + for (size_t i = 0; i < subscribers.size(); ++i) { + if (subscribers[i].shutdown) { + subscribers[i].shutdown(subscriberData[i]); + } else { + assert(!subscriberData[i]); + } + } + delete ws; } diff --git a/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp b/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp index f2ef93b75e..4e5fab8a59 100644 --- a/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp +++ b/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp @@ -22,6 +22,15 @@ #include "Core/MIPS/MIPS.h" #include "Core/MIPS/MIPSDebugInterface.h" +void *WebSocketCPUCoreInit(DebuggerEventHandlerMap &map) { + // No need to bind or alloc state, these are all global. + map["cpu.getAllRegs"] = &WebSocketCPUGetAllRegs; + map["cpu.getReg"] = &WebSocketCPUGetReg; + map["cpu.setReg"] = &WebSocketCPUSetReg; + + return nullptr; +} + static std::string RegValueAsFloat(uint32_t u) { union { uint32_t u; diff --git a/Core/Debugger/WebSocket/CPUCoreSubscriber.h b/Core/Debugger/WebSocket/CPUCoreSubscriber.h index e24b16398f..78c3173174 100644 --- a/Core/Debugger/WebSocket/CPUCoreSubscriber.h +++ b/Core/Debugger/WebSocket/CPUCoreSubscriber.h @@ -17,7 +17,9 @@ #pragma once -struct DebuggerRequest; +#include "Core/Debugger/WebSocket/WebSocketUtils.h" + +void *WebSocketCPUCoreInit(DebuggerEventHandlerMap &map); void WebSocketCPUGetAllRegs(DebuggerRequest &req); void WebSocketCPUGetReg(DebuggerRequest &req); diff --git a/Core/Debugger/WebSocket/WebSocketUtils.h b/Core/Debugger/WebSocket/WebSocketUtils.h index 19894939bb..6e4e62d36c 100644 --- a/Core/Debugger/WebSocket/WebSocketUtils.h +++ b/Core/Debugger/WebSocket/WebSocketUtils.h @@ -84,3 +84,6 @@ private: bool responseBegun_ = false; bool responseSent_ = false; }; + +typedef std::function DebuggerEventHandler; +typedef std::unordered_map DebuggerEventHandlerMap;