Skip to content

Commit

Permalink
Debugger: Refactor to allow simpler broadcasting.
Browse files Browse the repository at this point in the history
It's okay to mix a bit for simple ones, I think.
  • Loading branch information
unknownbrackets committed Sep 1, 2018
1 parent c10b203 commit 4ce2b64
Show file tree
Hide file tree
Showing 16 changed files with 46 additions and 51 deletions.
42 changes: 19 additions & 23 deletions Core/Debugger/WebSocket.cpp
Expand Up @@ -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<SubscriberInfo> subscribers({
{ &WebSocketBreakpointInit, nullptr },
{ &WebSocketCPUCoreInit, nullptr },
{ &WebSocketDisasmInit, &WebSocketDisasmShutdown },
{ &WebSocketGameInit, nullptr },
{ &WebSocketGPUBufferInit, nullptr },
{ &WebSocketHLEInit, nullptr },
{ &WebSocketSteppingInit, &WebSocketSteppingShutdown },
typedef DebuggerSubscriber *(*SubscriberInit)(DebuggerEventHandlerMap &map);
static const std::vector<SubscriberInit> subscribers({
&WebSocketBreakpointInit,
&WebSocketCPUCoreInit,
&WebSocketDisasmInit,
&WebSocketGameInit,
&WebSocketGPUBufferInit,
&WebSocketHLEInit,
&WebSocketSteppingInit,
});

// To handle webserver restart, keep track of how many running.
Expand Down Expand Up @@ -132,10 +126,10 @@ void HandleDebuggerRequest(const http::Request &request) {
SteppingBroadcaster stepping;

std::unordered_map<std::string, DebuggerEventHandler> eventHandlers;
std::vector<void *> subscriberData;
for (auto info : subscribers) {
std::vector<DebuggerSubscriber *> subscriberData;
for (auto init : subscribers) {
std::lock_guard<std::mutex> 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.
Expand Down Expand Up @@ -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);
}
Expand All @@ -188,11 +188,7 @@ void HandleDebuggerRequest(const http::Request &request) {

std::lock_guard<std::mutex> 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;
Expand Down
2 changes: 1 addition & 1 deletion Core/Debugger/WebSocket/BreakpointSubscriber.cpp
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion Core/Debugger/WebSocket/BreakpointSubscriber.h
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion Core/Debugger/WebSocket/CPUCoreSubscriber.cpp
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion Core/Debugger/WebSocket/CPUCoreSubscriber.h
Expand Up @@ -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);
Expand Down
11 changes: 4 additions & 7 deletions Core/Debugger/WebSocket/DisasmSubscriber.cpp
Expand Up @@ -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();
}

Expand All @@ -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);
Expand All @@ -59,10 +60,6 @@ void *WebSocketDisasmInit(DebuggerEventHandlerMap &map) {
return p;
}

void WebSocketDisasmShutdown(void *p) {
delete static_cast<WebSocketDisasmState *>(p);
}

static DebugInterface *CPUFromRequest(DebuggerRequest &req) {
if (!req.HasParam("thread"))
return currentDebugMIPS;
Expand Down
3 changes: 1 addition & 2 deletions Core/Debugger/WebSocket/DisasmSubscriber.h
Expand Up @@ -19,5 +19,4 @@

#include "Core/Debugger/WebSocket/WebSocketUtils.h"

void *WebSocketDisasmInit(DebuggerEventHandlerMap &map);
void WebSocketDisasmShutdown(void *p);
DebuggerSubscriber *WebSocketDisasmInit(DebuggerEventHandlerMap &map);
2 changes: 1 addition & 1 deletion Core/Debugger/WebSocket/GPUBufferSubscriber.cpp
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion Core/Debugger/WebSocket/GPUBufferSubscriber.h
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion Core/Debugger/WebSocket/GameSubscriber.cpp
Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion Core/Debugger/WebSocket/GameSubscriber.h
Expand Up @@ -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);
2 changes: 1 addition & 1 deletion Core/Debugger/WebSocket/HLESubscriber.cpp
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion Core/Debugger/WebSocket/HLESubscriber.h
Expand Up @@ -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);
Expand Down
10 changes: 3 additions & 7 deletions Core/Debugger/WebSocket/SteppingSubscriber.cpp
Expand Up @@ -28,11 +28,11 @@

using namespace MIPSAnalyst;

struct WebSocketSteppingState {
struct WebSocketSteppingState : public DebuggerSubscriber {
WebSocketSteppingState() {
disasm_.setCpu(currentDebugMIPS);
}
~WebSocketSteppingState() {
~WebSocketSteppingState() override {
disasm_.clear();
}

Expand All @@ -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);
Expand All @@ -62,10 +62,6 @@ void *WebSocketSteppingInit(DebuggerEventHandlerMap &map) {
return p;
}

void WebSocketSteppingShutdown(void *p) {
delete static_cast<WebSocketSteppingState *>(p);
}

static DebugInterface *CPUFromRequest(DebuggerRequest &req, uint32_t *threadID = nullptr) {
if (!req.HasParam("thread")) {
if (threadID)
Expand Down
3 changes: 1 addition & 2 deletions Core/Debugger/WebSocket/SteppingSubscriber.h
Expand Up @@ -19,5 +19,4 @@

#include "Core/Debugger/WebSocket/WebSocketUtils.h"

void *WebSocketSteppingInit(DebuggerEventHandlerMap &map);
void WebSocketSteppingShutdown(void *p);
DebuggerSubscriber *WebSocketSteppingInit(DebuggerEventHandlerMap &map);
8 changes: 8 additions & 0 deletions Core/Debugger/WebSocket/WebSocketUtils.h
Expand Up @@ -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<void(DebuggerRequest &req)> DebuggerEventHandler;
typedef std::unordered_map<std::string, DebuggerEventHandler> DebuggerEventHandlerMap;

0 comments on commit 4ce2b64

Please sign in to comment.