mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-01 05:11:15 +00:00
[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:
parent
53e9ee3027
commit
14bd14f9f9
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
1
lldb/test/API/iohandler/sigint/Makefile
Normal file
1
lldb/test/API/iohandler/sigint/Makefile
Normal file
@ -0,0 +1 @@
|
||||
include Makefile.rules
|
@ -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()
|
12
lldb/test/API/iohandler/sigint/cat.cpp
Normal file
12
lldb/test/API/iohandler/sigint/cat.cpp
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user