[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
This commit is contained in:
Pavel Labath 2022-03-17 15:09:12 +01:00
parent 53e9ee3027
commit 14bd14f9f9
4 changed files with 66 additions and 11 deletions

View File

@ -4361,18 +4361,18 @@ public:
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();
}
}
}

View File

@ -0,0 +1 @@
include Makefile.rules

View File

@ -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()

View File

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