teemperor created this revision. teemperor added a reviewer: jingham. Herald added a subscriber: abidh.
https://reviews.llvm.org/D48465 is currently blocked by the fact that tab-completing the first expression is deadlocking LLDB. The reason for this deadlock is that when we push the ProcessIO handler for reading the Objective-C runtime information from the executable (which is triggerd when we parse the an expression for the first time_, the IOHandler can't be pushed as the Editline::Cancel method is deadlocking. The deadlock in Editline is coming from the m_output_mutex, which is locked before we go into tab completion. Even without this lock, calling Cancel on Editline will mean that Editline cleans up behind itself and deletes the current user-input, which is screws up the console when we are tab-completing at the same time. I think for now the most reasonable way of fixing this is to just not call Cancel on the current IOHandler when we push the ProcessIO handler. The ProcessIO handler is anyway always temporary, so not cleaning up for the current IOHandler for the short duration while the non-interactive ProcessIO handler is in charge doesn't sound too bad. As we can't really write unit tests for IOHandler itself (due to the hard dependency on an initialized Debugger including all its global state) and Editline completion is currently also not really testable in an automatic fashion, the test for this has to be that the expression command completion in https://reviews.llvm.org/D48465 doesn't fail the first time. I'll provide a proper unit test for this once I got around and made the IOHandler code testable, but for now unblocking https://reviews.llvm.org/D48465 is more critical. Repository: rLLDB LLDB https://reviews.llvm.org/D50912 Files: source/Core/Debugger.cpp Index: source/Core/Debugger.cpp =================================================================== --- source/Core/Debugger.cpp +++ source/Core/Debugger.cpp @@ -1098,7 +1098,11 @@ // this new input reader take over if (top_reader_sp) { top_reader_sp->Deactivate(); - top_reader_sp->Cancel(); + // For the ProcessIO handler we don't cancel the current IOHandler. The + // current IOHandler shouldn't be influenced by the fact that the temporary + // ProcessIO handler has hijacked the IO. + if (reader_sp->GetType() != IOHandler::Type::ProcessIO) + top_reader_sp->Cancel(); } }
Index: source/Core/Debugger.cpp =================================================================== --- source/Core/Debugger.cpp +++ source/Core/Debugger.cpp @@ -1098,7 +1098,11 @@ // this new input reader take over if (top_reader_sp) { top_reader_sp->Deactivate(); - top_reader_sp->Cancel(); + // For the ProcessIO handler we don't cancel the current IOHandler. The + // current IOHandler shouldn't be influenced by the fact that the temporary + // ProcessIO handler has hijacked the IO. + if (reader_sp->GetType() != IOHandler::Type::ProcessIO) + top_reader_sp->Cancel(); } }
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits