^C wasn't interrupting an expression during a long evaluation or deadlock.
authorGreg Clayton <gclayton@apple.com>
Wed, 16 Jul 2014 21:05:41 +0000 (21:05 +0000)
committerGreg Clayton <gclayton@apple.com>
Wed, 16 Jul 2014 21:05:41 +0000 (21:05 +0000)
commit0fdd3ae54d07ec8a84efa9ff676d64d7693f88dc
tree4b4fe88f2f3b3fea6430cd2dea6c1c26fc0796f9
parent9185115abb9942d673236b4cb919bc3560530484
^C wasn't interrupting an expression during a long evaluation or deadlock.

The problem was that we have an IOHandler thread that services the IOHandler stack. The command interepter is on the top of the stack and it receives a "expression ..." command, and it calls the IOHandlerIsComplete() callback in the command interpereter delegate which runs an expression. This causes the IOHandlerProcessSTDIO to be pushed, but since we are running the code from the IOHandler thread, it won't get run. When CTRL+C is pressed, we do deliver the interrupt to the IOHandlerProcessSTDIO::Interrupt() function, but it was always writing 'i' to the interrupt pipe, even if we weren't actively reading from the debugger input and the pipes. This fix works around the issue by directly issuing the async interrupt to the process if the process is running.

A longer term more correct fix would to be run the IOHandler thread and have it just do the determination of the input and when complete input is received, run the code that handles that input on another thread and syncronize with that other thread to detect when more input is desired. That change is too big to make right now, so this fix will tide us over until we can get there.

<rdar://problem/16556228>

llvm-svn: 213196
lldb/source/Target/Process.cpp