Skip to content

Commit facec98

Browse files
committed
review
1 parent 95ee828 commit facec98

File tree

3 files changed

+47
-40
lines changed

3 files changed

+47
-40
lines changed

Source/Tools/LinuxEmulation/LinuxSyscalls/GdbServer.cpp

+43-36
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,12 @@ fextl::string GdbServer::ReadPacket() {
203203
break;
204204
case '}': // escape char
205205
{
206-
auto escaped = CommsStream.get();
206+
Utils::NetStream::ReturnGet escaped;
207+
208+
do {
209+
escaped = CommsStream.get();
210+
} while (!escaped.HasData() && !escaped.HasHangup());
211+
207212
if (escaped.HasData()) {
208213
packet.push_back(escaped.GetData() ^ 0x20);
209214
} else {
@@ -214,7 +219,7 @@ fextl::string GdbServer::ReadPacket() {
214219
case '#': // end of packet
215220
{
216221
char hexString[3] = {0, 0, 0};
217-
CommsStream.read(hexString, 2);
222+
CommsStream.read(hexString, 2, true);
218223
int expected_checksum = std::strtoul(hexString, nullptr, 16);
219224

220225
if (calculateChecksum(packet) == expected_checksum) {
@@ -1395,45 +1400,47 @@ void GdbServer::GdbServerLoop() {
13951400

13961401
HandledPacketType response {};
13971402

1398-
// Outer server loop. Handles packet start, ACK/NAK and break
1399-
Utils::NetStream::ReturnGet c;
1400-
while (!CoreShuttingDown.load() && (c = CommsStream.get()).HasData()) {
1401-
switch (c.GetData()) {
1402-
case '$': {
1403-
auto packet = ReadPacket();
1404-
response = ProcessPacket(packet);
1405-
SendPacketPair(response);
1406-
if (response.TypeResponse == HandledPacketType::TYPE_UNKNOWN) {
1407-
LogMan::Msg::DFmt("Unknown packet {}", packet);
1403+
while (!CoreShuttingDown.load()) {
1404+
// Outer server loop. Handles packet start, ACK/NAK and break
1405+
Utils::NetStream::ReturnGet c;
1406+
while ((c = CommsStream.get()).HasData()) {
1407+
switch (c.GetData()) {
1408+
case '$': {
1409+
auto packet = ReadPacket();
1410+
response = ProcessPacket(packet);
1411+
SendPacketPair(response);
1412+
if (response.TypeResponse == HandledPacketType::TYPE_UNKNOWN) {
1413+
LogMan::Msg::DFmt("Unknown packet {}", packet);
1414+
}
1415+
break;
14081416
}
1409-
break;
1410-
}
1411-
case '+':
1412-
// ACK, do nothing.
1413-
break;
1414-
case '-':
1415-
// NAK, Resend requested
1416-
{
1417-
std::lock_guard lk(sendMutex);
1418-
SendPacket(response.Response);
1417+
case '+':
1418+
// ACK, do nothing.
1419+
break;
1420+
case '-':
1421+
// NAK, Resend requested
1422+
{
1423+
std::lock_guard lk(sendMutex);
1424+
SendPacket(response.Response);
1425+
}
1426+
break;
1427+
case '\x03': { // ASCII EOT
1428+
SyscallHandler->TM.Pause();
1429+
fextl::string str = fextl::fmt::format("T02thread:{:02x};", getpid());
1430+
if (LibraryMapChanged) {
1431+
// If libraries have changed then let gdb know
1432+
str += "library:1;";
1433+
}
1434+
SendPacketPair({std::move(str), HandledPacketType::TYPE_ACK});
1435+
break;
14191436
}
1420-
break;
1421-
case '\x03': { // ASCII EOT
1422-
SyscallHandler->TM.Pause();
1423-
fextl::string str = fextl::fmt::format("T02thread:{:02x};", getpid());
1424-
if (LibraryMapChanged) {
1425-
// If libraries have changed then let gdb know
1426-
str += "library:1;";
1437+
default: LogMan::Msg::DFmt("GdbServer: Unexpected byte {} ({:02x})", c.GetData(), c.GetData());
14271438
}
1428-
SendPacketPair({std::move(str), HandledPacketType::TYPE_ACK});
1429-
break;
1430-
}
1431-
default: LogMan::Msg::DFmt("GdbServer: Unexpected byte {} ({:02x})", c.GetData(), c.GetData());
14321439
}
1433-
}
14341440

1435-
if (c.HasHangup()) {
1436-
break;
1441+
if (c.HasHangup()) {
1442+
break;
1443+
}
14371444
}
14381445

14391446
{

Source/Tools/LinuxEmulation/LinuxSyscalls/NetStream.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ NetStream::ReturnGet NetStream::get() {
2626
.fd = socketfd, .events = POLLIN, .revents = 0,
2727
};
2828

29-
auto Result = ppoll(&pfd, 1, nullptr, nullptr);
29+
auto Result = poll(&pfd, 1, -1);
3030
if (Result > 0) {
3131
if (pfd.revents & POLLHUP) {
3232
return NetStream::ReturnGet {true};
@@ -45,14 +45,14 @@ NetStream::ReturnGet NetStream::get() {
4545
return NetStream::ReturnGet {false};
4646
}
4747

48-
size_t NetStream::read(char* buf, size_t size) {
48+
size_t NetStream::read(char* buf, size_t size, bool ContinueOnInterrupt) {
4949
size_t Read {};
5050
while (Read < size) {
5151
auto Result = get();
5252
if (Result.HasData()) {
5353
buf[Read] = Result.GetData();
5454
++Read;
55-
} else {
55+
} else if ((!Result.HasData() && !ContinueOnInterrupt) || Result.HasHangup()) {
5656
return Read;
5757
}
5858
}

Source/Tools/LinuxEmulation/LinuxSyscalls/NetStream.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class NetStream final {
3838
}
3939
};
4040
ReturnGet get();
41-
size_t read(char* buf, size_t size);
41+
size_t read(char* buf, size_t size, bool ContinueOnInterrupt);
4242

4343
bool SendPacket(const fextl::string& packet);
4444
private:

0 commit comments

Comments
 (0)