Author: ovyalov Date: Fri Nov 21 10:18:57 2014 New Revision: 222541 URL: http://llvm.org/viewvc/llvm-project?rev=222541&view=rev Log: Extend PipePosix with child_processes_inherit support - to control whether pipe handles should be inherited by a child process.
http://reviews.llvm.org/D6348 Modified: lldb/trunk/include/lldb/Host/posix/PipePosix.h lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp lldb/trunk/source/Host/posix/PipePosix.cpp Modified: lldb/trunk/include/lldb/Host/posix/PipePosix.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/posix/PipePosix.h?rev=222541&r1=222540&r2=222541&view=diff ============================================================================== --- lldb/trunk/include/lldb/Host/posix/PipePosix.h (original) +++ lldb/trunk/include/lldb/Host/posix/PipePosix.h Fri Nov 21 10:18:57 2014 @@ -36,7 +36,7 @@ public: ~Pipe(); bool - Open(); + Open(bool child_processes_inherit = false); bool IsValid() const; Modified: lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp?rev=222541&r1=222540&r2=222541&view=diff ============================================================================== --- lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp (original) +++ lldb/trunk/source/Host/posix/ConnectionFileDescriptorPosix.cpp Fri Nov 21 10:18:57 2014 @@ -96,7 +96,7 @@ ConnectionFileDescriptor::OpenCommandPip Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_CONNECTION)); // Make the command file descriptor here: - if (!m_pipe.Open()) + if (!m_pipe.Open(m_child_processes_inherit)) { if (log) log->Printf("%p ConnectionFileDescriptor::OpenCommandPipe () - could not make pipe: %s", static_cast<void *>(this), Modified: lldb/trunk/source/Host/posix/PipePosix.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/posix/PipePosix.cpp?rev=222541&r1=222540&r2=222541&view=diff ============================================================================== --- lldb/trunk/source/Host/posix/PipePosix.cpp (original) +++ lldb/trunk/source/Host/posix/PipePosix.cpp Fri Nov 21 10:18:57 2014 @@ -10,6 +10,7 @@ #include "lldb/Host/posix/PipePosix.h" #include <unistd.h> +#include <fcntl.h> using namespace lldb_private; @@ -17,6 +18,25 @@ int Pipe::kInvalidDescriptor = -1; enum PIPES { READ, WRITE }; // Constants 0 and 1 for READ and WRITE +// pipe2 is supported by Linux, FreeBSD v10 and higher. +// TODO: Add more platforms that support pipe2. +#define PIPE2_SUPPORTED defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD__ >= 10) + +namespace +{ + +#if defined(FD_CLOEXEC) && !PIPE2_SUPPORTED +bool SetCloexecFlag(int fd) +{ + int flags = ::fcntl(fd, F_GETFD); + if (flags == -1) + return false; + return (::fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == 0); +} +#endif + +} + Pipe::Pipe() { m_fds[READ] = Pipe::kInvalidDescriptor; @@ -29,13 +49,30 @@ Pipe::~Pipe() } bool -Pipe::Open() +Pipe::Open(bool child_processes_inherit) { if (IsValid()) return true; +#if PIPE2_SUPPORTED + if (::pipe2(m_fds, (child_processes_inherit) ? 0 : O_CLOEXEC) == 0) + return true; +#else if (::pipe(m_fds) == 0) + { +#ifdef FD_CLOEXEC + if (!child_processes_inherit) + { + if (!SetCloexecFlag(m_fds[0]) || !SetCloexecFlag(m_fds[1])) + { + Close(); + return false; + } + } +#endif return true; + } +#endif m_fds[READ] = Pipe::kInvalidDescriptor; m_fds[WRITE] = Pipe::kInvalidDescriptor; _______________________________________________ lldb-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
