$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r65431 - sandbox/SOC/2010/process/boost/process
From: boris_at_[hidden]
Date: 2010-09-15 15:48:58
Author: bschaeling
Date: 2010-09-15 15:48:58 EDT (Wed, 15 Sep 2010)
New Revision: 65431
URL: http://svn.boost.org/trac/boost/changeset/65431
Log:
Enhanced boost::process::handle to change the default behavior on close
Text files modified: 
   sandbox/SOC/2010/process/boost/process/handle.hpp          |    17 ++++++++++++-----                       
   sandbox/SOC/2010/process/boost/process/operations.hpp      |     8 --------                                
   sandbox/SOC/2010/process/boost/process/stream_behavior.hpp |    17 +++--------------                       
   3 files changed, 15 insertions(+), 27 deletions(-)
Modified: sandbox/SOC/2010/process/boost/process/handle.hpp
==============================================================================
--- sandbox/SOC/2010/process/boost/process/handle.hpp	(original)
+++ sandbox/SOC/2010/process/boost/process/handle.hpp	2010-09-15 15:48:58 EDT (Wed, 15 Sep 2010)
@@ -71,6 +71,11 @@
     }
 
     /**
+     * RAII settings to specify if handle should be automatically closed.
+     */
+    enum close_type { do_close, dont_close };
+
+    /**
      * Constructs a handle from a native handle.
      *
      * This constructor creates a new \a handle object that takes
@@ -80,8 +85,8 @@
      *
      * \see release()
      */
-    handle(native_type native)
-    : impl_(boost::make_shared<impl>(native))
+    handle(native_type native, close_type close = handle::do_close)
+    : impl_(boost::make_shared<impl>(native, close))
     {
     }
 
@@ -139,14 +144,15 @@
     public:
         typedef handle::native_type native_type;
 
-        impl(native_type native)
-        : native_(native)
+        impl(native_type native, close_type close)
+        : native_(native),
+        close_(close)
         {
         }
 
         ~impl()
         {
-            if (valid())
+            if (valid() && close_ == handle::do_close)
             {
 #if defined(BOOST_POSIX_API)
                 ::close(native_);
@@ -188,6 +194,7 @@
 
     private:
         native_type native_;
+        close_type close_;
     };
 
     /**
Modified: sandbox/SOC/2010/process/boost/process/operations.hpp
==============================================================================
--- sandbox/SOC/2010/process/boost/process/operations.hpp	(original)
+++ sandbox/SOC/2010/process/boost/process/operations.hpp	2010-09-15 15:48:58 EDT (Wed, 15 Sep 2010)
@@ -328,10 +328,6 @@
             delete[] envp.second[i];
         delete[] envp.second;
 
-        stdin_pair.first.close();
-        stdout_pair.first.close();
-        stderr_pair.first.close();
-
         return child(pid,
             stdin_pair.second,
             stdout_pair.second,
@@ -367,10 +363,6 @@
         envstrs.get(), workdir.get(), &startup_info, &pi) == 0)
         BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("CreateProcess() failed");
 
-    stdin_pair.first.close();
-    stdout_pair.first.close();
-    stderr_pair.first.close();
-
     handle hprocess(pi.hProcess);
 
     if (CloseHandle(pi.hThread) == 0)
Modified: sandbox/SOC/2010/process/boost/process/stream_behavior.hpp
==============================================================================
--- sandbox/SOC/2010/process/boost/process/stream_behavior.hpp	(original)
+++ sandbox/SOC/2010/process/boost/process/stream_behavior.hpp	2010-09-15 15:48:58 EDT (Wed, 15 Sep 2010)
@@ -63,28 +63,17 @@
 {
 public:
     inherit(handle::native_type h)
-    : h_(h)
+    : h_(h, handle::dont_close)
     {
     }
 
     std::pair<handle, handle> operator()(bool) const
     {
-#if defined(BOOST_POSIX_API)
-        int h = dup(h_);
-        if (h == -1)
-            BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("dup(2) failed");
-#elif defined(BOOST_WINDOWS_API)
-        HANDLE h;
-        if (!DuplicateHandle(GetCurrentProcess(), h_, GetCurrentProcess(),
-            &h, 0, TRUE, DUPLICATE_SAME_ACCESS))
-            BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR(
-                "SetHandleInformation() failed");
-#endif
-        return std::make_pair(h, handle());
+        return std::make_pair(h_, handle());
     }
 
 private:
-    handle::native_type h_;
+    handle h_;
 };
 
 /**