WaitForClient moved to server, now working.

This commit is contained in:
Ben Vanik
2013-12-20 23:52:47 -08:00
parent 8a7bd7b69a
commit d98d5c855a
7 changed files with 76 additions and 43 deletions

View File

@@ -24,11 +24,18 @@ using namespace xe::debug::protocols::gdb;
GDBProtocol::GDBProtocol(DebugServer* debug_server) :
port_(0), socket_id_(0), thread_(0), running_(false),
Protocol(debug_server) {
port_ = FLAGS_gdb_debug_port;
}
GDBProtocol::~GDBProtocol() {
if (thread_) {
// Join thread.
running_ = false;
xe_thread_release(thread_);
thread_ = 0;
}
if (socket_id_) {
xe_socket_close(socket_id_);
}
@@ -60,29 +67,39 @@ int GDBProtocol::Setup() {
return 1;
}
return 0;
}
int GDBProtocol::WaitForClient() {
if (!socket_id_) {
return 1;
}
// Accept the first connection we get.
xe_socket_connection_t client_info;
if (xe_socket_accept(socket_id_, &client_info)) {
return 1;
}
XELOGI("GDB debugger connected from %s", client_info.addr);
// Create the client object.
// Note that the client will delete itself when done.
GDBClient* client = new GDBClient(debug_server_, client_info.socket);
if (client->Setup()) {
// Client failed to setup - abort.
return 1;
}
thread_ = xe_thread_create("GDB Debugger Listener", StartCallback, this);
running_ = true;
return xe_thread_start(thread_);
return 0;
}
void GDBProtocol::StartCallback(void* param) {
GDBProtocol* protocol = reinterpret_cast<GDBProtocol*>(param);
protocol->AcceptThread();
}
void GDBProtocol::AcceptThread() {
while (running_) {
if (!socket_id_) {
break;
}
// Accept the first connection we get.
xe_socket_connection_t client_info;
if (xe_socket_accept(socket_id_, &client_info)) {
XELOGE("WS debugger failed to accept connection");
break;
}
XELOGI("WS debugger connected from %s", client_info.addr);
// Create the client object.
// Note that the client will delete itself when done.
GDBClient* client = new GDBClient(debug_server_, client_info.socket);
if (client->Setup()) {
// Client failed to setup - abort.
continue;
}
}
}

View File

@@ -31,12 +31,18 @@ public:
virtual ~GDBProtocol();
virtual int Setup();
virtual int WaitForClient();
private:
static void StartCallback(void* param);
void AcceptThread();
protected:
uint32_t port_;
socket_t socket_id_;
xe_thread_ref thread_;
bool running_;
};

View File

@@ -9,6 +9,7 @@
#include <xenia/debug/protocols/ws/ws_protocol.h>
#include <xenia/debug/debug_server.h>
#include <xenia/debug/protocols/ws/ws_client.h>
#include <gflags/gflags.h>
@@ -25,7 +26,6 @@ DEFINE_int32(ws_debug_port, 6200,
WSProtocol::WSProtocol(DebugServer* debug_server) :
port_(0), socket_id_(0), thread_(0), running_(false),
accepted_event_(INVALID_HANDLE_VALUE),
Protocol(debug_server) {
port_ = FLAGS_ws_debug_port;
}
@@ -37,9 +37,6 @@ WSProtocol::~WSProtocol() {
xe_thread_release(thread_);
thread_ = 0;
}
if (accepted_event_ != INVALID_HANDLE_VALUE) {
CloseHandle(accepted_event_);
}
if (socket_id_) {
xe_socket_close(socket_id_);
}
@@ -71,8 +68,6 @@ int WSProtocol::Setup() {
return 1;
}
accepted_event_ = CreateEvent(NULL, FALSE, FALSE, NULL);
thread_ = xe_thread_create("WS Debugger Listener", StartCallback, this);
running_ = true;
return xe_thread_start(thread_);
@@ -105,12 +100,5 @@ void WSProtocol::AcceptThread() {
// Client failed to setup - abort.
continue;
}
SetEvent(accepted_event_);
}
}
int WSProtocol::WaitForClient() {
WaitForSingleObject(accepted_event_, INFINITE);
return 0;
}

View File

@@ -31,7 +31,6 @@ public:
virtual ~WSProtocol();
virtual int Setup();
virtual int WaitForClient();
private:
static void StartCallback(void* param);
@@ -44,7 +43,6 @@ protected:
xe_thread_ref thread_;
bool running_;
HANDLE accepted_event_;
};