SI_DeviceGBA: if a client doesn't respond within 1s, disconnect them
Rather than returning 0 / not creating an expected SI interrupt. You can test this by running VBA-M in a debugger and stopping it while it's connected to Dolphin: on current master, Dolphin will freeze-up until it gets a response. With this PR, Dolphin will gracefully disconnect the device, and reconnect if it starts responding again.
This commit is contained in:
parent
f004dfa92b
commit
becb1a744b
|
@ -274,14 +274,14 @@ int GBASockServer::Receive(u8* si_buffer)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (recv_stat == sf::Socket::NotReady)
|
if (recv_stat == sf::Socket::NotReady || num_received == 0)
|
||||||
num_received = 0;
|
|
||||||
|
|
||||||
if (num_received > 0)
|
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < recv_data.size(); i++)
|
m_booted = false;
|
||||||
si_buffer[i ^ 3] = recv_data[i];
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < recv_data.size(); i++)
|
||||||
|
si_buffer[i ^ 3] = recv_data[i];
|
||||||
return static_cast<int>(std::min(num_received, recv_data.size()));
|
return static_cast<int>(std::min(num_received, recv_data.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,9 +329,9 @@ int CSIDevice_GBA::RunBuffer(u8* buffer, int length)
|
||||||
case NextAction::ReceiveResponse:
|
case NextAction::ReceiveResponse:
|
||||||
{
|
{
|
||||||
int num_data_received = m_sock_server.Receive(buffer);
|
int num_data_received = m_sock_server.Receive(buffer);
|
||||||
if (!m_sock_server.IsConnected())
|
m_next_action = NextAction::SendCommand;
|
||||||
|
if (num_data_received == 0)
|
||||||
{
|
{
|
||||||
m_next_action = NextAction::SendCommand;
|
|
||||||
constexpr u32 reply = SI_ERROR_NO_RESPONSE;
|
constexpr u32 reply = SI_ERROR_NO_RESPONSE;
|
||||||
std::memcpy(buffer, &reply, sizeof(reply));
|
std::memcpy(buffer, &reply, sizeof(reply));
|
||||||
return sizeof(reply);
|
return sizeof(reply);
|
||||||
|
@ -344,8 +344,6 @@ int CSIDevice_GBA::RunBuffer(u8* buffer, int length)
|
||||||
"%01d [< %02x%02x%02x%02x%02x] (%i)", m_device_number,
|
"%01d [< %02x%02x%02x%02x%02x] (%i)", m_device_number,
|
||||||
buffer[3], buffer[2], buffer[1], buffer[0], buffer[7], num_data_received);
|
buffer[3], buffer[2], buffer[1], buffer[0], buffer[7], num_data_received);
|
||||||
#endif
|
#endif
|
||||||
if (num_data_received > 0)
|
|
||||||
m_next_action = NextAction::SendCommand;
|
|
||||||
return num_data_received;
|
return num_data_received;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue