llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lldb

Author: Igor Kudrin (igorkudrin)

<details>
<summary>Changes</summary>

Tests in `TestDAP_server.py` create `DebugAdapterServer`, passing a connection 
string. `DebugAdapterServer.__init__()` creates a socket and passes the 
associated input and output streams to its parent class, `DebugCommunication`. 
`DAPTestCaseBase.launch()`, which is called from 
`TestDAP_server.run_debug_session()`, adds a teardown hook that eventually 
calls `DebugCommunication.terminate()`. If the socket is not closed when this 
hook executes, it waits indefinitely for the receiving thread to join.

In the normal case, when a test passes, the connection is closed by calling 
`self.dap_server.request_disconnect()` at the end of 
`TestDAP_server.run_debug_session()`. If a test fails, the cleanup hook is 
called while the connection is still active, which results in a hang. This can 
be reproduced by removing the call to `request_disconnect()` or by changing the 
condition in the `assertEqual()` on the previous line.

The fix passes the opened socket to 'DebugCommunication' and closes the socket 
explicitly in 'DebugCommunication.terminate()'.

---
Full diff: https://github.com/llvm/llvm-project/pull/209988.diff


1 Files Affected:

- (modified) lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py 
(+5) 


``````````diff
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py 
b/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
index c8acf67b23b99..8f710154c5da3 100644
--- a/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
@@ -205,11 +205,13 @@ def __init__(
         send: BinaryIO,
         init_commands: Optional[List[str]] = None,
         spawn_helper: Optional[SpawnHelperCallback] = None,
+        socket: Optional[socket.socket] = None,
     ):
         self._log = Log()
         self.send = send
         self.recv = recv
         self.spawn_helper = spawn_helper
+        self.socket = socket
 
         # Packets that have been received and processed but have not yet been
         # requested by a test case.
@@ -1643,6 +1645,8 @@ def request_custom(self, command: str, arguments: 
Optional[dict[str, Any]] = Non
         return self._send_recv(command_dict)
 
     def terminate(self):
+        if self.socket:
+            self.socket.shutdown(socket.SHUT_RDWR)
         self.send.close()
         if self._recv_thread.is_alive():
             self._recv_thread.join()
@@ -1706,6 +1710,7 @@ def __init__(
                 s.makefile("wb"),
                 init_commands,
                 spawn_helper,
+                socket=s,
             )
             self.connection = connection
         else:

``````````

</details>


https://github.com/llvm/llvm-project/pull/209988
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to