Merge pull request #3524 from FearlessTobi/port-5106
Port citra-emu/citra#5106: "gdbstub: Ensure gdbstub doesn't drop packets crucial to initialization"
This commit is contained in:
		| @@ -166,7 +166,7 @@ struct System::Impl { | ||||
|         service_manager = std::make_shared<Service::SM::ServiceManager>(); | ||||
|  | ||||
|         Service::Init(service_manager, system); | ||||
|         GDBStub::Init(); | ||||
|         GDBStub::DeferStart(); | ||||
|  | ||||
|         renderer = VideoCore::CreateRenderer(emu_window, system); | ||||
|         if (!renderer->Init()) { | ||||
|   | ||||
| @@ -141,6 +141,7 @@ constexpr char target_xml[] = | ||||
| )"; | ||||
|  | ||||
| int gdbserver_socket = -1; | ||||
| bool defer_start = false; | ||||
|  | ||||
| u8 command_buffer[GDB_BUFFER_SIZE]; | ||||
| u32 command_length; | ||||
| @@ -1166,6 +1167,9 @@ static void RemoveBreakpoint() { | ||||
|  | ||||
| void HandlePacket() { | ||||
|     if (!IsConnected()) { | ||||
|         if (defer_start) { | ||||
|             ToggleServer(true); | ||||
|         } | ||||
|         return; | ||||
|     } | ||||
|  | ||||
| @@ -1256,6 +1260,10 @@ void ToggleServer(bool status) { | ||||
|     } | ||||
| } | ||||
|  | ||||
| void DeferStart() { | ||||
|     defer_start = true; | ||||
| } | ||||
|  | ||||
| static void Init(u16 port) { | ||||
|     if (!server_enabled) { | ||||
|         // Set the halt loop to false in case the user enabled the gdbstub mid-execution. | ||||
| @@ -1341,6 +1349,7 @@ void Shutdown() { | ||||
|     if (!server_enabled) { | ||||
|         return; | ||||
|     } | ||||
|     defer_start = false; | ||||
|  | ||||
|     LOG_INFO(Debug_GDBStub, "Stopping GDB ..."); | ||||
|     if (gdbserver_socket != -1) { | ||||
|   | ||||
| @@ -43,6 +43,13 @@ void ToggleServer(bool status); | ||||
| /// Start the gdbstub server. | ||||
| void Init(); | ||||
|  | ||||
| /** | ||||
|  * Defer initialization of the gdbstub to the first packet processing functions. | ||||
|  * This avoids a case where the gdbstub thread is frozen after initialization | ||||
|  * and fails to respond in time to packets. | ||||
|  */ | ||||
| void DeferStart(); | ||||
|  | ||||
| /// Stop gdbstub server. | ||||
| void Shutdown(); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user