Author: abidh Date: Tue Feb 10 11:10:39 2015 New Revision: 228709 URL: http://llvm.org/viewvc/llvm-project?rev=228709&view=rev Log: Fix multiple problems of lldb-mi blocking on input monitoring and needing a return.
Summary: One of the problem is reported here. http://llvm.org/bugs/show_bug.cgi?id=22411 A fix was committed for this problem that works only for OSX. This revision extends that fix to other system. The select system call has some limitation with multi-threaded application which have been addresses here. LLDB-mi exits if quit command is given but needs an extra retur if -gdb-exit is given. That issue has also been addressed. Reviewers: ki.stfu, emaste Reviewed By: ki.stfu Subscribers: lldb-commits Differential Revision: http://reviews.llvm.org/D7529 Modified: lldb/trunk/test/tools/lldb-mi/TestMiExit.py lldb/trunk/tools/lldb-mi/MICmnStreamStdinLinux.cpp lldb/trunk/tools/lldb-mi/MICmnStreamStdinLinux.h Modified: lldb/trunk/test/tools/lldb-mi/TestMiExit.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/tools/lldb-mi/TestMiExit.py?rev=228709&r1=228708&r2=228709&view=diff ============================================================================== --- lldb/trunk/test/tools/lldb-mi/TestMiExit.py (original) +++ lldb/trunk/test/tools/lldb-mi/TestMiExit.py Tue Feb 10 11:10:39 2015 @@ -28,7 +28,6 @@ class MiExitTestCase(lldbmi_testcase.MiT # Test -gdb-exit: try to exit and check that program is finished self.runCmd("-gdb-exit") - self.runCmd("") #FIXME hangs here on Linux; extra return is needed self.expect("\^exit") import pexpect self.expect(pexpect.EOF) Modified: lldb/trunk/tools/lldb-mi/MICmnStreamStdinLinux.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmnStreamStdinLinux.cpp?rev=228709&r1=228708&r2=228709&view=diff ============================================================================== --- lldb/trunk/tools/lldb-mi/MICmnStreamStdinLinux.cpp (original) +++ lldb/trunk/tools/lldb-mi/MICmnStreamStdinLinux.cpp Tue Feb 10 11:10:39 2015 @@ -20,10 +20,8 @@ //-- // Third Party Headers: -#if defined(__APPLE__) #include <sys/select.h> #include <unistd.h> // For STDIN_FILENO -#endif // defined( __APPLE__ ) #include <string.h> // For std::strerror() // In-house headers: @@ -43,6 +41,7 @@ CMICmnStreamStdinLinux::CMICmnStreamStdi : m_constBufferSize(1024) , m_pStdin(nullptr) , m_pCmdBuffer(nullptr) + , m_waitForInput(true) { } @@ -153,28 +152,32 @@ CMICmnStreamStdinLinux::Shutdown(void) bool CMICmnStreamStdinLinux::InputAvailable(bool &vwbAvail) { -#if defined(__APPLE__) - // The code below is needed on OSX where lldb-mi hangs when doing -exec-run. - // The hang seems to come from calling fgets and fileno from different thread. - // Although this problem was not observed on Linux. - // A solution based on 'ioctl' was initially committed but it seems to make - // lldb-mi takes much more processor time. The solution based on 'select' works - // well but it seems to slow the execution of lldb-mi tests a lot on Linux. - // As a result, this code is #defined to run only on OSX. + // Wait for the input using select API. Timeout is used so that we get an + // opportunity to check if m_waitForInput has been set to false by other thread. fd_set setOfStdin; - FD_ZERO(&setOfStdin); - FD_SET(STDIN_FILENO, &setOfStdin); + struct timeval tv; - // Wait while input would be available - if (::select(STDIN_FILENO + 1, &setOfStdin, nullptr, nullptr, nullptr) == -1) + while (m_waitForInput) { - vwbAvail = false; - return MIstatus::failure; + FD_ZERO(&setOfStdin); + FD_SET(STDIN_FILENO, &setOfStdin); + tv.tv_sec = 1; + tv.tv_usec = 0; + int ret = ::select(STDIN_FILENO + 1, &setOfStdin, nullptr, nullptr, &tv); + if (ret == 0) // Timeout. Loop back if m_waitForInput is true + continue; + else if (ret == -1) // Error condition. Return + { + vwbAvail = false; + return MIstatus::failure; + } + else // Have some valid input + { + vwbAvail = true; + return MIstatus::success; + } } - -#endif // defined( __APPLE__ ) - vwbAvail = true; - return MIstatus::success; + return MIstatus::failure; } //++ ------------------------------------------------------------------------------------ @@ -221,5 +224,5 @@ CMICmnStreamStdinLinux::ReadLine(CMIUtil void CMICmnStreamStdinLinux::InterruptReadLine(void) { - fclose(stdin); + m_waitForInput = false; } Modified: lldb/trunk/tools/lldb-mi/MICmnStreamStdinLinux.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmnStreamStdinLinux.h?rev=228709&r1=228708&r2=228709&view=diff ============================================================================== --- lldb/trunk/tools/lldb-mi/MICmnStreamStdinLinux.h (original) +++ lldb/trunk/tools/lldb-mi/MICmnStreamStdinLinux.h Tue Feb 10 11:10:39 2015 @@ -69,4 +69,5 @@ class CMICmnStreamStdinLinux : public CM const MIuint m_constBufferSize; FILE *m_pStdin; MIchar *m_pCmdBuffer; + bool m_waitForInput; }; _______________________________________________ lldb-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
