Failed attempt at fixing disable debugger when 1+ sessions are open
This commit is contained in:
parent
648541bb1f
commit
84c5cf0661
@ -73,4 +73,5 @@ typedef struct sock_server
|
|||||||
Result server_init(struct sock_server *serv);
|
Result server_init(struct sock_server *serv);
|
||||||
void server_bind(struct sock_server *serv, u16 port);
|
void server_bind(struct sock_server *serv, u16 port);
|
||||||
void server_run(struct sock_server *serv);
|
void server_run(struct sock_server *serv);
|
||||||
|
void server_kill_connections(struct sock_server *serv);
|
||||||
void server_finalize(struct sock_server *serv);
|
void server_finalize(struct sock_server *serv);
|
||||||
|
@ -148,6 +148,7 @@ void DebuggerMenu_DisableDebugger(void)
|
|||||||
if(initialized)
|
if(initialized)
|
||||||
{
|
{
|
||||||
svcSignalEvent(gdbServer.super.shall_terminate_event);
|
svcSignalEvent(gdbServer.super.shall_terminate_event);
|
||||||
|
server_kill_connections(&gdbServer.super);
|
||||||
res = MyThread_Join(&debuggerDebugThread, 5 * 1000 * 1000 * 1000LL);
|
res = MyThread_Join(&debuggerDebugThread, 5 * 1000 * 1000 * 1000LL);
|
||||||
if(res == 0)
|
if(res == 0)
|
||||||
res = MyThread_Join(&debuggerSocketThread, 5 * 1000 * 1000 * 1000LL);
|
res = MyThread_Join(&debuggerSocketThread, 5 * 1000 * 1000 * 1000LL);
|
||||||
|
@ -396,11 +396,6 @@ int socPoll(struct pollfd *fds, nfds_t nfds, int timeout)
|
|||||||
if(ret == 0)
|
if(ret == 0)
|
||||||
ret = _net_convert_error(cmdbuf[2]);
|
ret = _net_convert_error(cmdbuf[2]);
|
||||||
|
|
||||||
if(ret < 0) {
|
|
||||||
//errno = -ret;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,13 +148,14 @@ void server_run(struct sock_server *serv)
|
|||||||
{
|
{
|
||||||
struct pollfd *fds = serv->poll_fds;
|
struct pollfd *fds = serv->poll_fds;
|
||||||
Handle handles[2] = { terminationRequestEvent, serv->shall_terminate_event };
|
Handle handles[2] = { terminationRequestEvent, serv->shall_terminate_event };
|
||||||
|
s32 idx = -1;
|
||||||
|
|
||||||
serv->running = true;
|
serv->running = true;
|
||||||
svcSignalEvent(serv->started_event);
|
svcSignalEvent(serv->started_event);
|
||||||
|
|
||||||
while(serv->running && !terminationRequest)
|
while(serv->running && !terminationRequest)
|
||||||
{
|
{
|
||||||
s32 idx = -1;
|
idx = -1;
|
||||||
if(svcWaitSynchronizationN(&idx, handles, 2, false, 0LL) == 0)
|
if(svcWaitSynchronizationN(&idx, handles, 2, false, 0LL) == 0)
|
||||||
goto abort_connections;
|
goto abort_connections;
|
||||||
|
|
||||||
@ -170,11 +171,15 @@ void server_run(struct sock_server *serv)
|
|||||||
fds[i].revents = 0;
|
fds[i].revents = 0;
|
||||||
int pollres = socPoll(fds, serv->nfds, 50);
|
int pollres = socPoll(fds, serv->nfds, 50);
|
||||||
|
|
||||||
|
idx = -1;
|
||||||
|
if(svcWaitSynchronizationN(&idx, handles, 2, false, 0LL) == 0)
|
||||||
|
goto abort_connections;
|
||||||
|
|
||||||
for(nfds_t i = 0; pollres > 0 && i < serv->nfds; i++)
|
for(nfds_t i = 0; pollres > 0 && i < serv->nfds; i++)
|
||||||
{
|
{
|
||||||
struct sock_ctx *curr_ctx = serv->ctx_ptrs[i];
|
struct sock_ctx *curr_ctx = serv->ctx_ptrs[i];
|
||||||
|
|
||||||
if((fds[i].revents & POLLHUP) || curr_ctx->should_close)
|
if((fds[i].revents & (POLLHUP | POLLERR | POLLNVAL)) || curr_ctx->should_close)
|
||||||
server_close_ctx(serv, curr_ctx);
|
server_close_ctx(serv, curr_ctx);
|
||||||
|
|
||||||
else if(fds[i].revents & POLLIN)
|
else if(fds[i].revents & POLLIN)
|
||||||
@ -228,6 +233,10 @@ void server_run(struct sock_server *serv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
idx = -1;
|
||||||
|
if(svcWaitSynchronizationN(&idx, handles, 2, false, 0LL) == 0)
|
||||||
|
goto abort_connections;
|
||||||
|
|
||||||
if(serv->compact_needed)
|
if(serv->compact_needed)
|
||||||
compact(serv);
|
compact(serv);
|
||||||
}
|
}
|
||||||
@ -244,18 +253,32 @@ void server_run(struct sock_server *serv)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
abort_connections:
|
abort_connections:
|
||||||
for(unsigned int i = 0; i < serv->nfds; i++)
|
server_kill_connections(serv);
|
||||||
|
|
||||||
|
serv->running = false;
|
||||||
|
svcClearEvent(serv->started_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void server_kill_connections(struct sock_server *serv)
|
||||||
{
|
{
|
||||||
|
struct pollfd *fds = serv->poll_fds;
|
||||||
|
nfds_t nfds = serv->nfds;
|
||||||
|
|
||||||
|
for(unsigned int i = 0; i < nfds; i++)
|
||||||
|
{
|
||||||
|
if(fds[i].fd == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
struct linger linger;
|
struct linger linger;
|
||||||
linger.l_onoff = 1;
|
linger.l_onoff = 1;
|
||||||
linger.l_linger = 0;
|
linger.l_linger = 0;
|
||||||
|
|
||||||
socSetsockopt(fds[i].fd, SOL_SOCKET, SO_LINGER, &linger, sizeof(struct linger));
|
socSetsockopt(fds[i].fd, SOL_SOCKET, SO_LINGER, &linger, sizeof(struct linger));
|
||||||
socClose(fds[i].fd);
|
socClose(fds[i].fd);
|
||||||
}
|
fds[i].fd = -1;
|
||||||
|
|
||||||
serv->running = false;
|
serv->ctx_ptrs[i]->should_close = true;
|
||||||
svcClearEvent(serv->started_event);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void server_finalize(struct sock_server *serv)
|
void server_finalize(struct sock_server *serv)
|
||||||
|
Reference in New Issue
Block a user