labath created this revision. labath added a reviewer: JDevlieghere. Herald added a project: All. labath requested review of this revision. Herald added a project: LLDB.
D120762 <https://reviews.llvm.org/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. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D121912 Files: lldb/source/Target/Process.cpp lldb/test/API/iohandler/sigint/Makefile lldb/test/API/iohandler/sigint/TestProcessIOHandlerInterrupt.py lldb/test/API/iohandler/sigint/cat.cpp
Index: lldb/test/API/iohandler/sigint/cat.cpp =================================================================== --- /dev/null +++ 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; +} Index: lldb/test/API/iohandler/sigint/TestProcessIOHandlerInterrupt.py =================================================================== --- /dev/null +++ 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() Index: lldb/test/API/iohandler/sigint/Makefile =================================================================== --- /dev/null +++ lldb/test/API/iohandler/sigint/Makefile @@ -0,0 +1 @@ +include Makefile.rules Index: lldb/source/Target/Process.cpp =================================================================== --- lldb/source/Target/Process.cpp +++ lldb/source/Target/Process.cpp @@ -4361,18 +4361,18 @@ 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(); } } }
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits