[Lldb-commits] [lldb] 14bd14f - [lldb] Fix ^C handling in IOHandlerProcessSTDIO
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Fri Mar 18 01:00:47 PDT 2022
Author: Pavel Labath
Date: 2022-03-18T08:58:30+01:00
New Revision: 14bd14f9f92f9f5eff43ec3a977b127dea1cb521
URL: https://github.com/llvm/llvm-project/commit/14bd14f9f92f9f5eff43ec3a977b127dea1cb521
DIFF: https://github.com/llvm/llvm-project/commit/14bd14f9f92f9f5eff43ec3a977b127dea1cb521.diff
LOG: [lldb] Fix ^C handling in IOHandlerProcessSTDIO
D120762 accidentally moved the interrupt check into the block which was
reading stdio. This meant that a ^C only took effect after a regular
character has been pressed.
This patch fixes that and adds a (pexpect) test.
Differential Revision: https://reviews.llvm.org/D121912
Added:
lldb/test/API/iohandler/sigint/Makefile
lldb/test/API/iohandler/sigint/TestProcessIOHandlerInterrupt.py
lldb/test/API/iohandler/sigint/cat.cpp
Modified:
lldb/source/Target/Process.cpp
Removed:
################################################################################
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index 122f20b2a751e..54a19833c8a65 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -4361,18 +4361,18 @@ class IOHandlerProcessSTDIO : public IOHandler {
break;
} else
break;
+ }
- if (select_helper.FDIsSetRead(pipe_read_fd)) {
- size_t bytes_read;
- // Consume the interrupt byte
- Status error = m_pipe.Read(&ch, 1, bytes_read);
- if (error.Success()) {
- if (ch == 'q')
- break;
- if (ch == 'i')
- if (StateIsRunningState(m_process->GetState()))
- m_process->SendAsyncInterrupt();
- }
+ if (select_helper.FDIsSetRead(pipe_read_fd)) {
+ size_t bytes_read;
+ // Consume the interrupt byte
+ Status error = m_pipe.Read(&ch, 1, bytes_read);
+ if (error.Success()) {
+ if (ch == 'q')
+ break;
+ if (ch == 'i')
+ if (StateIsRunningState(m_process->GetState()))
+ m_process->SendAsyncInterrupt();
}
}
}
diff --git a/lldb/test/API/iohandler/sigint/Makefile b/lldb/test/API/iohandler/sigint/Makefile
new file mode 100644
index 0000000000000..22f1051530f87
--- /dev/null
+++ b/lldb/test/API/iohandler/sigint/Makefile
@@ -0,0 +1 @@
+include Makefile.rules
diff --git a/lldb/test/API/iohandler/sigint/TestProcessIOHandlerInterrupt.py b/lldb/test/API/iohandler/sigint/TestProcessIOHandlerInterrupt.py
new file mode 100644
index 0000000000000..f1bd76e348caf
--- /dev/null
+++ b/lldb/test/API/iohandler/sigint/TestProcessIOHandlerInterrupt.py
@@ -0,0 +1,42 @@
+"""
+Test sending SIGINT Process IOHandler
+"""
+
+import os
+
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test.lldbpexpect import PExpectTest
+
+class TestCase(PExpectTest):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def test(self):
+ self.build(dictionary={"CXX_SOURCES":"cat.cpp"})
+ self.launch(executable=self.getBuildArtifact(), timeout=5)
+
+ self.child.sendline("process launch")
+ self.child.expect("Process .* launched")
+
+ self.child.sendline("Hello cat")
+ self.child.expect_exact("read: Hello cat")
+
+ self.child.sendintr()
+ self.child.expect("Process .* stopped")
+ self.expect_prompt()
+
+ self.expect("bt", substrs=["input_copy_loop"])
+
+ self.child.sendline("continue")
+ self.child.expect("Process .* resuming")
+
+ self.child.sendline("Goodbye cat")
+ self.child.expect_exact("read: Goodbye cat")
+
+ self.child.sendeof()
+ self.child.expect("Process .* exited")
+ self.expect_prompt()
+
+ self.quit()
diff --git a/lldb/test/API/iohandler/sigint/cat.cpp b/lldb/test/API/iohandler/sigint/cat.cpp
new file mode 100644
index 0000000000000..5a3d9380e3826
--- /dev/null
+++ b/lldb/test/API/iohandler/sigint/cat.cpp
@@ -0,0 +1,12 @@
+#include <iostream>
+
+void input_copy_loop() {
+ std::string str;
+ while (std::getline(std::cin, str))
+ std::cout << "read: " << str << std::endl;
+}
+
+int main() {
+ input_copy_loop();
+ return 0;
+}
More information about the lldb-commits
mailing list