Debugger: Clean up GDB stub network interfacing

This commit is contained in:
Jeffrey Pfau 2015-01-16 00:50:15 -08:00
parent 69fb4e4c7b
commit 56d5fb579d
4 changed files with 41 additions and 16 deletions

View File

@ -75,6 +75,7 @@ Misc:
- GBA Video: Start video at the last scanline instead of the first - GBA Video: Start video at the last scanline instead of the first
- Debugger: Watchpoints now work on STM/LDM instructions - Debugger: Watchpoints now work on STM/LDM instructions
- GBA: Improve accuracy of event timing - GBA: Improve accuracy of event timing
- Debugger: Clean up GDB stub network interfacing
0.1.0: (2014-12-13) 0.1.0: (2014-12-13)
- Initial release - Initial release

View File

@ -53,15 +53,39 @@ static void _gdbStubEntered(struct ARMDebugger* debugger, enum DebuggerEntryReas
static void _gdbStubPoll(struct ARMDebugger* debugger) { static void _gdbStubPoll(struct ARMDebugger* debugger) {
struct GDBStub* stub = (struct GDBStub*) debugger; struct GDBStub* stub = (struct GDBStub*) debugger;
do { --stub->untilPoll;
if (!SOCKET_FAILED(stub->connection)) { if (stub->untilPoll > 0) {
if (!SocketSetBlocking(stub->connection, 1)) { return;
GDBStubHangup(stub); }
return; stub->untilPoll = GDB_STUB_INTERVAL;
} if (stub->shouldBlock) {
stub->shouldBlock = false;
if (!SocketSetBlocking(stub->socket, false)) {
GDBStubHangup(stub);
return;
} }
GDBStubUpdate(stub); if (!SOCKET_FAILED(stub->connection) && !SocketSetBlocking(stub->connection, false)) {
} while (stub->d.state == DEBUGGER_PAUSED); GDBStubHangup(stub);
return;
}
}
GDBStubUpdate(stub);
}
static void _gdbStubWait(struct ARMDebugger* debugger) {
struct GDBStub* stub = (struct GDBStub*) debugger;
if (!stub->shouldBlock) {
stub->shouldBlock = true;
if (!SocketSetBlocking(stub->socket, true)) {
GDBStubHangup(stub);
return;
}
if (!SOCKET_FAILED(stub->connection) && !SocketSetBlocking(stub->connection, true)) {
GDBStubHangup(stub);
return;
}
}
GDBStubUpdate(stub);
} }
static void _ack(struct GDBStub* stub) { static void _ack(struct GDBStub* stub) {
@ -170,6 +194,7 @@ static void _writeHostInfo(struct GDBStub* stub) {
static void _continue(struct GDBStub* stub, const char* message) { static void _continue(struct GDBStub* stub, const char* message) {
stub->d.state = DEBUGGER_CUSTOM; stub->d.state = DEBUGGER_CUSTOM;
stub->untilPoll = GDB_STUB_INTERVAL;
if (!SOCKET_FAILED(stub->connection)) { if (!SOCKET_FAILED(stub->connection)) {
if (!SocketSetBlocking(stub->connection, 0)) { if (!SocketSetBlocking(stub->connection, 0)) {
GDBStubHangup(stub); GDBStubHangup(stub);
@ -441,10 +466,11 @@ void GDBStubCreate(struct GDBStub* stub) {
stub->connection = INVALID_SOCKET; stub->connection = INVALID_SOCKET;
stub->d.init = 0; stub->d.init = 0;
stub->d.deinit = _gdbStubDeinit; stub->d.deinit = _gdbStubDeinit;
stub->d.paused = _gdbStubPoll; stub->d.paused = _gdbStubWait;
stub->d.entered = _gdbStubEntered; stub->d.entered = _gdbStubEntered;
stub->d.custom = _gdbStubPoll; stub->d.custom = _gdbStubPoll;
stub->d.log = 0; stub->d.log = 0;
stub->untilPoll = GDB_STUB_INTERVAL;
} }
int GDBStubListen(struct GDBStub* stub, int port, const struct Address* bindAddress) { int GDBStubListen(struct GDBStub* stub, int port, const struct Address* bindAddress) {
@ -462,9 +488,6 @@ int GDBStubListen(struct GDBStub* stub, int port, const struct Address* bindAddr
if (err) { if (err) {
goto cleanup; goto cleanup;
} }
if (!SocketSetBlocking(stub->socket, 0)) {
goto cleanup;
}
return 1; return 1;
@ -502,9 +525,6 @@ void GDBStubUpdate(struct GDBStub* stub) {
if (stub->connection == INVALID_SOCKET) { if (stub->connection == INVALID_SOCKET) {
stub->connection = SocketAccept(stub->socket, 0); stub->connection = SocketAccept(stub->socket, 0);
if (!SOCKET_FAILED(stub->connection)) { if (!SOCKET_FAILED(stub->connection)) {
if (!SocketSetBlocking(stub->connection, 0)) {
goto connectionLost;
}
ARMDebuggerEnter(&stub->d, DEBUGGER_ENTER_ATTACHED); ARMDebuggerEnter(&stub->d, DEBUGGER_ENTER_ATTACHED);
} else if (errno == EWOULDBLOCK || errno == EAGAIN) { } else if (errno == EWOULDBLOCK || errno == EAGAIN) {
return; return;

View File

@ -13,6 +13,7 @@
#include "util/socket.h" #include "util/socket.h"
#define GDB_STUB_MAX_LINE 1200 #define GDB_STUB_MAX_LINE 1200
#define GDB_STUB_INTERVAL 32
enum GDBStubAckState { enum GDBStubAckState {
GDB_ACK_PENDING = 0, GDB_ACK_PENDING = 0,
@ -30,6 +31,9 @@ struct GDBStub {
Socket socket; Socket socket;
Socket connection; Socket connection;
bool shouldBlock;
int untilPoll;
}; };
void GDBStubCreate(struct GDBStub*); void GDBStubCreate(struct GDBStub*);

View File

@ -157,7 +157,7 @@ static inline int SocketClose(Socket socket) {
return close(socket) >= 0; return close(socket) >= 0;
} }
static inline int SocketSetBlocking(Socket socket, int blocking) { static inline int SocketSetBlocking(Socket socket, bool blocking) {
#ifdef _WIN32 #ifdef _WIN32
u_long unblocking = !blocking; u_long unblocking = !blocking;
return ioctlsocket(socket, FIONBIO, &unblocking) == NO_ERROR; return ioctlsocket(socket, FIONBIO, &unblocking) == NO_ERROR;