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 + +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; +}