From 4ce2b64ef753a389fdb683345e7f2792c35479c2 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 1 Sep 2018 10:15:22 -0700 Subject: [PATCH] Debugger: Refactor to allow simpler broadcasting. It's okay to mix a bit for simple ones, I think. --- Core/Debugger/WebSocket.cpp | 42 +++++++++---------- .../WebSocket/BreakpointSubscriber.cpp | 2 +- .../Debugger/WebSocket/BreakpointSubscriber.h | 2 +- Core/Debugger/WebSocket/CPUCoreSubscriber.cpp | 2 +- Core/Debugger/WebSocket/CPUCoreSubscriber.h | 2 +- Core/Debugger/WebSocket/DisasmSubscriber.cpp | 11 ++--- Core/Debugger/WebSocket/DisasmSubscriber.h | 3 +- .../WebSocket/GPUBufferSubscriber.cpp | 2 +- Core/Debugger/WebSocket/GPUBufferSubscriber.h | 2 +- Core/Debugger/WebSocket/GameSubscriber.cpp | 2 +- Core/Debugger/WebSocket/GameSubscriber.h | 2 +- Core/Debugger/WebSocket/HLESubscriber.cpp | 2 +- Core/Debugger/WebSocket/HLESubscriber.h | 2 +- .../Debugger/WebSocket/SteppingSubscriber.cpp | 10 ++--- Core/Debugger/WebSocket/SteppingSubscriber.h | 3 +- Core/Debugger/WebSocket/WebSocketUtils.h | 8 ++++ 16 files changed, 46 insertions(+), 51 deletions(-) diff --git a/Core/Debugger/WebSocket.cpp b/Core/Debugger/WebSocket.cpp index 4504c827f793..38101b553e6f 100644 --- a/Core/Debugger/WebSocket.cpp +++ b/Core/Debugger/WebSocket.cpp @@ -56,21 +56,15 @@ #include "Core/Debugger/WebSocket/HLESubscriber.h" #include "Core/Debugger/WebSocket/SteppingSubscriber.h" -typedef void *(*SubscriberInit)(DebuggerEventHandlerMap &map); -typedef void (*Subscribershutdown)(void *p); -struct SubscriberInfo { - SubscriberInit init; - Subscribershutdown shutdown; -}; - -static const std::vector subscribers({ - { &WebSocketBreakpointInit, nullptr }, - { &WebSocketCPUCoreInit, nullptr }, - { &WebSocketDisasmInit, &WebSocketDisasmShutdown }, - { &WebSocketGameInit, nullptr }, - { &WebSocketGPUBufferInit, nullptr }, - { &WebSocketHLEInit, nullptr }, - { &WebSocketSteppingInit, &WebSocketSteppingShutdown }, +typedef DebuggerSubscriber *(*SubscriberInit)(DebuggerEventHandlerMap &map); +static const std::vector subscribers({ + &WebSocketBreakpointInit, + &WebSocketCPUCoreInit, + &WebSocketDisasmInit, + &WebSocketGameInit, + &WebSocketGPUBufferInit, + &WebSocketHLEInit, + &WebSocketSteppingInit, }); // To handle webserver restart, keep track of how many running. @@ -132,10 +126,10 @@ void HandleDebuggerRequest(const http::Request &request) { SteppingBroadcaster stepping; std::unordered_map eventHandlers; - std::vector subscriberData; - for (auto info : subscribers) { + std::vector subscriberData; + for (auto init : subscribers) { std::lock_guard guard(lifecycleLock); - subscriberData.push_back(info.init(eventHandlers)); + subscriberData.push_back(init(eventHandlers)); } // There's a tradeoff between responsiveness to incoming events, and polling for changes. @@ -178,6 +172,12 @@ void HandleDebuggerRequest(const http::Request &request) { game.Broadcast(ws); stepping.Broadcast(ws); + for (size_t i = 0; i < subscribers.size(); ++i) { + if (subscriberData[i]) { + subscriberData[i]->Broadcast(ws); + } + } + if (stopRequested) { ws->Close(net::WebSocketClose::GOING_AWAY); } @@ -188,11 +188,7 @@ void HandleDebuggerRequest(const http::Request &request) { std::lock_guard guard(lifecycleLock); for (size_t i = 0; i < subscribers.size(); ++i) { - if (subscribers[i].shutdown) { - subscribers[i].shutdown(subscriberData[i]); - } else { - assert(!subscriberData[i]); - } + delete subscriberData[i]; } delete ws; diff --git a/Core/Debugger/WebSocket/BreakpointSubscriber.cpp b/Core/Debugger/WebSocket/BreakpointSubscriber.cpp index ffe1797ce547..aab5bf83462a 100644 --- a/Core/Debugger/WebSocket/BreakpointSubscriber.cpp +++ b/Core/Debugger/WebSocket/BreakpointSubscriber.cpp @@ -23,7 +23,7 @@ #include "Core/Debugger/WebSocket/WebSocketUtils.h" #include "Core/MIPS/MIPSDebugInterface.h" -void *WebSocketBreakpointInit(DebuggerEventHandlerMap &map) { +DebuggerSubscriber *WebSocketBreakpointInit(DebuggerEventHandlerMap &map) { // No need to bind or alloc state, these are all global. map["cpu.breakpoint.add"] = &WebSocketCPUBreakpointAdd; map["cpu.breakpoint.update"] = &WebSocketCPUBreakpointUpdate; diff --git a/Core/Debugger/WebSocket/BreakpointSubscriber.h b/Core/Debugger/WebSocket/BreakpointSubscriber.h index c9c2e1effcf5..d0e622cd1257 100644 --- a/Core/Debugger/WebSocket/BreakpointSubscriber.h +++ b/Core/Debugger/WebSocket/BreakpointSubscriber.h @@ -19,7 +19,7 @@ #include "Core/Debugger/WebSocket/WebSocketUtils.h" -void *WebSocketBreakpointInit(DebuggerEventHandlerMap &map); +DebuggerSubscriber *WebSocketBreakpointInit(DebuggerEventHandlerMap &map); void WebSocketCPUBreakpointAdd(DebuggerRequest &req); void WebSocketCPUBreakpointUpdate(DebuggerRequest &req); diff --git a/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp b/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp index 0d2c42f66c2a..6f371e5b8518 100644 --- a/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp +++ b/Core/Debugger/WebSocket/CPUCoreSubscriber.cpp @@ -25,7 +25,7 @@ #include "Core/MIPS/MIPS.h" #include "Core/MIPS/MIPSDebugInterface.h" -void *WebSocketCPUCoreInit(DebuggerEventHandlerMap &map) { +DebuggerSubscriber *WebSocketCPUCoreInit(DebuggerEventHandlerMap &map) { // No need to bind or alloc state, these are all global. map["cpu.stepping"] = &WebSocketCPUStepping; map["cpu.resume"] = &WebSocketCPUResume; diff --git a/Core/Debugger/WebSocket/CPUCoreSubscriber.h b/Core/Debugger/WebSocket/CPUCoreSubscriber.h index 3667979e9649..99dc53adaa1b 100644 --- a/Core/Debugger/WebSocket/CPUCoreSubscriber.h +++ b/Core/Debugger/WebSocket/CPUCoreSubscriber.h @@ -19,7 +19,7 @@ #include "Core/Debugger/WebSocket/WebSocketUtils.h" -void *WebSocketCPUCoreInit(DebuggerEventHandlerMap &map); +DebuggerSubscriber *WebSocketCPUCoreInit(DebuggerEventHandlerMap &map); void WebSocketCPUStepping(DebuggerRequest &req); void WebSocketCPUResume(DebuggerRequest &req); diff --git a/Core/Debugger/WebSocket/DisasmSubscriber.cpp b/Core/Debugger/WebSocket/DisasmSubscriber.cpp index 78ee607fdfac..6d2f76d746d4 100644 --- a/Core/Debugger/WebSocket/DisasmSubscriber.cpp +++ b/Core/Debugger/WebSocket/DisasmSubscriber.cpp @@ -28,11 +28,12 @@ #include "Core/MIPS/MIPSAsm.h" #include "Core/MIPS/MIPSDebugInterface.h" -struct WebSocketDisasmState { +class WebSocketDisasmState : public DebuggerSubscriber { +public: WebSocketDisasmState() { disasm_.setCpu(currentDebugMIPS); } - ~WebSocketDisasmState() { + ~WebSocketDisasmState() override { disasm_.clear(); } @@ -49,7 +50,7 @@ struct WebSocketDisasmState { DisassemblyManager disasm_; }; -void *WebSocketDisasmInit(DebuggerEventHandlerMap &map) { +DebuggerSubscriber *WebSocketDisasmInit(DebuggerEventHandlerMap &map) { auto p = new WebSocketDisasmState(); map["memory.base"] = std::bind(&WebSocketDisasmState::Base, p, std::placeholders::_1); map["memory.disasm"] = std::bind(&WebSocketDisasmState::Disasm, p, std::placeholders::_1); @@ -59,10 +60,6 @@ void *WebSocketDisasmInit(DebuggerEventHandlerMap &map) { return p; } -void WebSocketDisasmShutdown(void *p) { - delete static_cast(p); -} - static DebugInterface *CPUFromRequest(DebuggerRequest &req) { if (!req.HasParam("thread")) return currentDebugMIPS; diff --git a/Core/Debugger/WebSocket/DisasmSubscriber.h b/Core/Debugger/WebSocket/DisasmSubscriber.h index e6c5b0e71c3a..35a32fa2bb40 100644 --- a/Core/Debugger/WebSocket/DisasmSubscriber.h +++ b/Core/Debugger/WebSocket/DisasmSubscriber.h @@ -19,5 +19,4 @@ #include "Core/Debugger/WebSocket/WebSocketUtils.h" -void *WebSocketDisasmInit(DebuggerEventHandlerMap &map); -void WebSocketDisasmShutdown(void *p); +DebuggerSubscriber *WebSocketDisasmInit(DebuggerEventHandlerMap &map); diff --git a/Core/Debugger/WebSocket/GPUBufferSubscriber.cpp b/Core/Debugger/WebSocket/GPUBufferSubscriber.cpp index 98f65231c241..67b13d85b206 100644 --- a/Core/Debugger/WebSocket/GPUBufferSubscriber.cpp +++ b/Core/Debugger/WebSocket/GPUBufferSubscriber.cpp @@ -28,7 +28,7 @@ #include "Core/Screenshot.h" #include "GPU/Debugger/Stepping.h" -void *WebSocketGPUBufferInit(DebuggerEventHandlerMap &map) { +DebuggerSubscriber *WebSocketGPUBufferInit(DebuggerEventHandlerMap &map) { // No need to bind or alloc state, these are all global. map["gpu.buffer.screenshot"] = &WebSocketGPUBufferScreenshot; map["gpu.buffer.renderColor"] = &WebSocketGPUBufferRenderColor; diff --git a/Core/Debugger/WebSocket/GPUBufferSubscriber.h b/Core/Debugger/WebSocket/GPUBufferSubscriber.h index c7062fdb8251..00b93d74c007 100644 --- a/Core/Debugger/WebSocket/GPUBufferSubscriber.h +++ b/Core/Debugger/WebSocket/GPUBufferSubscriber.h @@ -19,7 +19,7 @@ #include "Core/Debugger/WebSocket/WebSocketUtils.h" -void *WebSocketGPUBufferInit(DebuggerEventHandlerMap &map); +DebuggerSubscriber *WebSocketGPUBufferInit(DebuggerEventHandlerMap &map); void WebSocketGPUBufferScreenshot(DebuggerRequest &req); void WebSocketGPUBufferRenderColor(DebuggerRequest &req); diff --git a/Core/Debugger/WebSocket/GameSubscriber.cpp b/Core/Debugger/WebSocket/GameSubscriber.cpp index a17717e26215..0acd4a9b3ebe 100644 --- a/Core/Debugger/WebSocket/GameSubscriber.cpp +++ b/Core/Debugger/WebSocket/GameSubscriber.cpp @@ -20,7 +20,7 @@ #include "Core/ELF/ParamSFO.h" #include "Core/System.h" -void *WebSocketGameInit(DebuggerEventHandlerMap &map) { +DebuggerSubscriber *WebSocketGameInit(DebuggerEventHandlerMap &map) { map["game.status"] = &WebSocketGameStatus; map["version"] = &WebSocketVersion; diff --git a/Core/Debugger/WebSocket/GameSubscriber.h b/Core/Debugger/WebSocket/GameSubscriber.h index 77cec9e38b20..e3d08f4522d1 100644 --- a/Core/Debugger/WebSocket/GameSubscriber.h +++ b/Core/Debugger/WebSocket/GameSubscriber.h @@ -19,7 +19,7 @@ #include "Core/Debugger/WebSocket/WebSocketUtils.h" -void *WebSocketGameInit(DebuggerEventHandlerMap &map); +DebuggerSubscriber *WebSocketGameInit(DebuggerEventHandlerMap &map); void WebSocketGameStatus(DebuggerRequest &req); void WebSocketVersion(DebuggerRequest &req); diff --git a/Core/Debugger/WebSocket/HLESubscriber.cpp b/Core/Debugger/WebSocket/HLESubscriber.cpp index 586f30199cca..ae65e692fa06 100644 --- a/Core/Debugger/WebSocket/HLESubscriber.cpp +++ b/Core/Debugger/WebSocket/HLESubscriber.cpp @@ -27,7 +27,7 @@ #include "Core/MIPS/MIPSStackWalk.h" #include "Core/HLE/sceKernelThread.h" -void *WebSocketHLEInit(DebuggerEventHandlerMap &map) { +DebuggerSubscriber *WebSocketHLEInit(DebuggerEventHandlerMap &map) { map["hle.thread.list"] = &WebSocketHLEThreadList; map["hle.thread.wake"] = &WebSocketHLEThreadWake; map["hle.thread.stop"] = &WebSocketHLEThreadStop; diff --git a/Core/Debugger/WebSocket/HLESubscriber.h b/Core/Debugger/WebSocket/HLESubscriber.h index 9b059f475916..6d473c3563ca 100644 --- a/Core/Debugger/WebSocket/HLESubscriber.h +++ b/Core/Debugger/WebSocket/HLESubscriber.h @@ -19,7 +19,7 @@ #include "Core/Debugger/WebSocket/WebSocketUtils.h" -void *WebSocketHLEInit(DebuggerEventHandlerMap &map); +DebuggerSubscriber *WebSocketHLEInit(DebuggerEventHandlerMap &map); void WebSocketHLEThreadList(DebuggerRequest &req); void WebSocketHLEThreadWake(DebuggerRequest &req); diff --git a/Core/Debugger/WebSocket/SteppingSubscriber.cpp b/Core/Debugger/WebSocket/SteppingSubscriber.cpp index e1347f3a14bd..d3422b48f96e 100644 --- a/Core/Debugger/WebSocket/SteppingSubscriber.cpp +++ b/Core/Debugger/WebSocket/SteppingSubscriber.cpp @@ -28,11 +28,11 @@ using namespace MIPSAnalyst; -struct WebSocketSteppingState { +struct WebSocketSteppingState : public DebuggerSubscriber { WebSocketSteppingState() { disasm_.setCpu(currentDebugMIPS); } - ~WebSocketSteppingState() { + ~WebSocketSteppingState() override { disasm_.clear(); } @@ -51,7 +51,7 @@ struct WebSocketSteppingState { DisassemblyManager disasm_; }; -void *WebSocketSteppingInit(DebuggerEventHandlerMap &map) { +DebuggerSubscriber *WebSocketSteppingInit(DebuggerEventHandlerMap &map) { auto p = new WebSocketSteppingState(); map["cpu.stepInto"] = std::bind(&WebSocketSteppingState::Into, p, std::placeholders::_1); map["cpu.stepOver"] = std::bind(&WebSocketSteppingState::Over, p, std::placeholders::_1); @@ -62,10 +62,6 @@ void *WebSocketSteppingInit(DebuggerEventHandlerMap &map) { return p; } -void WebSocketSteppingShutdown(void *p) { - delete static_cast(p); -} - static DebugInterface *CPUFromRequest(DebuggerRequest &req, uint32_t *threadID = nullptr) { if (!req.HasParam("thread")) { if (threadID) diff --git a/Core/Debugger/WebSocket/SteppingSubscriber.h b/Core/Debugger/WebSocket/SteppingSubscriber.h index 319c608caa40..06983ea2785f 100644 --- a/Core/Debugger/WebSocket/SteppingSubscriber.h +++ b/Core/Debugger/WebSocket/SteppingSubscriber.h @@ -19,5 +19,4 @@ #include "Core/Debugger/WebSocket/WebSocketUtils.h" -void *WebSocketSteppingInit(DebuggerEventHandlerMap &map); -void WebSocketSteppingShutdown(void *p); +DebuggerSubscriber *WebSocketSteppingInit(DebuggerEventHandlerMap &map); diff --git a/Core/Debugger/WebSocket/WebSocketUtils.h b/Core/Debugger/WebSocket/WebSocketUtils.h index 70c08828b296..85dca3f4a887 100644 --- a/Core/Debugger/WebSocket/WebSocketUtils.h +++ b/Core/Debugger/WebSocket/WebSocketUtils.h @@ -98,5 +98,13 @@ struct DebuggerRequest { bool responsePartial_ = false; }; +class DebuggerSubscriber { +public: + virtual ~DebuggerSubscriber() {} + + // Subscribers can also broadcast if they have simple cases to. + virtual void Broadcast(net::WebSocketServer *ws) {} +}; + typedef std::function DebuggerEventHandler; typedef std::unordered_map DebuggerEventHandlerMap;