[Lldb-commits] [lldb] r222541 - Extend PipePosix with child_processes_inherit support - to control whether pipe handles should be inherited by a child process.

Oleksiy Vyalov ovyalov at google.com
Fri Nov 21 08:18:58 PST 2014


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;





More information about the lldb-commits mailing list