You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by wr...@apache.org on 2007/10/05 04:11:22 UTC

svn commit: r582057 - in /apr/apr/branches/0.9.x: CHANGES include/apr_thread_proc.h threadproc/win32/proc.c

Author: wrowe
Date: Thu Oct  4 19:11:21 2007
New Revision: 582057

URL: http://svn.apache.org/viewvc?rev=582057&view=rev
Log:
Revert to 0.9.14 behavior; only sane recourse if this
behavior fix is deferred to 1.3.0 release.

Modified:
    apr/apr/branches/0.9.x/CHANGES
    apr/apr/branches/0.9.x/include/apr_thread_proc.h
    apr/apr/branches/0.9.x/threadproc/win32/proc.c

Modified: apr/apr/branches/0.9.x/CHANGES
URL: http://svn.apache.org/viewvc/apr/apr/branches/0.9.x/CHANGES?rev=582057&r1=582056&r2=582057&view=diff
==============================================================================
--- apr/apr/branches/0.9.x/CHANGES [utf-8] (original)
+++ apr/apr/branches/0.9.x/CHANGES [utf-8] Thu Oct  4 19:11:21 2007
@@ -4,16 +4,15 @@
   *) Cause apr_file_dup2() on Win32 to update the MSVCRT psuedo-stdio
      handles for fd-based and FILE * based I/O.  [William Rowe]
 
-  *) Introduce APR_NO_FILE as an option to apr_procattr_io_set() for any 
-     of the three stdio streams to cause the corresponding streams to NOT
-     be inherited to a WIN32 child process (passes INVALID_HANDLE_VALUE).
-     This is of little importance to most developers, except those who had
-     exploited an inconsistency between Unix and Win32 that was corrected
-     on Win32 with APR version 0.9.16.  The feature to have NO_FILE work
-     across platforms and leave a specified std stream closed becomes 
-     portable in APR version 1.3.0 (it remains equivilant to APR_NO_PIPE 
-     on non-Windows platforms throughout APR versions 0.9.x and 1.2.x).
-     [William Rowe]
+  *) Revert Win32 to the 0.9.14 behavior of apr_proc_create() for any 
+     of the three stdio streams which are not initialized, through either
+     apr_procattr_io_set() or apr_procattr_stdXXX_set(), when given a
+     procattr_t with one or two streams which were initialized through
+     apr_procattr_stdXXX_set().  Once again, these do not inherit the 
+     parent process stdio stream to WIN32 child processes (passing 
+     INVALID_HANDLE_VALUE instead) as on Unix.  Note APR 1.3.0 adopts 
+     the unix behavior of inheriting any uninitialed streams as the 
+     parent's corresponding stdio stream, in such cases.  [William Rowe]
 
 Changes with APR 0.9.16
 

Modified: apr/apr/branches/0.9.x/include/apr_thread_proc.h
URL: http://svn.apache.org/viewvc/apr/apr/branches/0.9.x/include/apr_thread_proc.h?rev=582057&r1=582056&r2=582057&view=diff
==============================================================================
--- apr/apr/branches/0.9.x/include/apr_thread_proc.h (original)
+++ apr/apr/branches/0.9.x/include/apr_thread_proc.h Thu Oct  4 19:11:21 2007
@@ -87,15 +87,6 @@
 /** @see apr_procattr_io_set */
 #define APR_CHILD_BLOCK      4
 
-/** @see apr_procattr_io_set 
- * @note introduced strictly for Win32 to apr revision 1.2.12 (to restore
- * the non-portable default behavior of 1.2.9 and prior versions on Win32).
- * This becomes portable to all platforms effective revision 1.3.0, ensuring
- * the standard files specified in the call to apr_procattr_io_set are not
- * open in the created process (on Win32 as INVALID_HANDLE_VALUEs).
- */
-#define APR_NO_FILE          8
-
 /** @see apr_procattr_limit_set */
 #define APR_LIMIT_CPU        0
 /** @see apr_procattr_limit_set */

Modified: apr/apr/branches/0.9.x/threadproc/win32/proc.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/0.9.x/threadproc/win32/proc.c?rev=582057&r1=582056&r2=582057&view=diff
==============================================================================
--- apr/apr/branches/0.9.x/threadproc/win32/proc.c (original)
+++ apr/apr/branches/0.9.x/threadproc/win32/proc.c Thu Oct  4 19:11:21 2007
@@ -32,11 +32,6 @@
 #include <process.h>
 #endif
 
-/* Heavy on no'ops, here's what we want to pass if there is APR_NO_FILE
- * requested for a specific child handle;
- */
-static apr_file_t no_file = { NULL, INVALID_HANDLE_VALUE, };
-
 /* We have very carefully excluded volumes of definitions from the
  * Microsoft Platform SDK, which kill the build time performance.
  * These the sole constants we borrow from WinBase.h and WinUser.h
@@ -93,29 +88,20 @@
         else if (in == APR_PARENT_BLOCK)
             in = APR_WRITE_BLOCK;
 
-        if (in == APR_NO_FILE)
-            attr->child_in = &no_file;
-        else
-            stat = apr_create_nt_pipe(&attr->child_in, &attr->parent_in,
-                                      in, attr->pool);
+        stat = apr_create_nt_pipe(&attr->child_in, &attr->parent_in,
+                                  in, attr->pool);
         if (stat == APR_SUCCESS)
             stat = apr_file_inherit_unset(attr->parent_in);
     }
     if (out && stat == APR_SUCCESS) {
-        if (out == APR_NO_FILE)
-            attr->child_out = &no_file;
-        else
-            stat = apr_create_nt_pipe(&attr->parent_out, &attr->child_out,
-                                      out, attr->pool);
+        stat = apr_create_nt_pipe(&attr->parent_out, &attr->child_out,
+                                  out, attr->pool);
         if (stat == APR_SUCCESS)
             stat = apr_file_inherit_unset(attr->parent_out);
     }
     if (err && stat == APR_SUCCESS) {
-        if (err == APR_NO_FILE)
-            attr->child_err = &no_file;
-        else
-            stat = apr_create_nt_pipe(&attr->parent_err, &attr->child_err,
-                                      err, attr->pool);
+        stat = apr_create_nt_pipe(&attr->parent_err, &attr->child_err,
+                                  err, attr->pool);
         if (stat == APR_SUCCESS)
             stat = apr_file_inherit_unset(attr->parent_err);
     }
@@ -129,7 +115,7 @@
     apr_status_t rv = APR_SUCCESS;
 
     if (child_in) {
-        if ((attr->child_in == NULL) || (attr->child_in == &no_file))
+        if (attr->child_in == NULL)
             rv = apr_file_dup(&attr->child_in, child_in, attr->pool);
         else
             rv = apr_file_dup2(attr->child_in, child_in, attr->pool);
@@ -155,7 +141,7 @@
     apr_status_t rv = APR_SUCCESS;
 
     if (child_out) {
-        if ((attr->child_out == NULL) || (attr->child_out == &no_file))
+        if (attr->child_out == NULL)
             rv = apr_file_dup(&attr->child_out, child_out, attr->pool);
         else
             rv = apr_file_dup2(attr->child_out, child_out, attr->pool);
@@ -181,7 +167,7 @@
     apr_status_t rv = APR_SUCCESS;
 
     if (child_err) {
-        if ((attr->child_err == NULL) || (attr->child_err == &no_file))
+        if (attr->child_err == NULL)
             rv = apr_file_dup(&attr->child_err, child_err, attr->pool);
         else
             rv = apr_file_dup2(attr->child_err, child_err, attr->pool);
@@ -680,49 +666,49 @@
             si.dwFlags |= STARTF_USESTDHANDLES;
 
             si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
+            if (GetHandleInformation(si.hStdInput, &stdin_reset)
+                    && (stdin_reset &= HANDLE_FLAG_INHERIT))
+                SetHandleInformation(si.hStdInput,
+                                     HANDLE_FLAG_INHERIT, 0);
+
             if (attr->child_in && attr->child_in->filehand)
             {
-                if (GetHandleInformation(si.hStdInput,
-                                         &stdin_reset)
-                        && (stdin_reset &= HANDLE_FLAG_INHERIT))
-                    SetHandleInformation(si.hStdInput,
-                                         HANDLE_FLAG_INHERIT, 0);
-
-                if ( (si.hStdInput = attr->child_in->filehand) 
-                                   != INVALID_HANDLE_VALUE )
-                    SetHandleInformation(si.hStdInput, HANDLE_FLAG_INHERIT,
-                                                       HANDLE_FLAG_INHERIT);
+                si.hStdInput = attr->child_in->filehand;
+                SetHandleInformation(si.hStdInput, HANDLE_FLAG_INHERIT,
+                                                   HANDLE_FLAG_INHERIT);
             }
+            else
+                si.hStdInput = INVALID_HANDLE_VALUE;
             
             si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
+            if (GetHandleInformation(si.hStdOutput, &stdout_reset)
+                    && (stdout_reset &= HANDLE_FLAG_INHERIT))
+                SetHandleInformation(si.hStdOutput,
+                                     HANDLE_FLAG_INHERIT, 0);
+
             if (attr->child_out && attr->child_out->filehand)
             {
-                if (GetHandleInformation(si.hStdOutput,
-                                         &stdout_reset)
-                        && (stdout_reset &= HANDLE_FLAG_INHERIT))
-                    SetHandleInformation(si.hStdOutput,
-                                         HANDLE_FLAG_INHERIT, 0);
-
-                if ( (si.hStdOutput = attr->child_out->filehand) 
-                                   != INVALID_HANDLE_VALUE )
-                    SetHandleInformation(si.hStdOutput, HANDLE_FLAG_INHERIT,
-                                                        HANDLE_FLAG_INHERIT);
+                si.hStdOutput = attr->child_out->filehand;
+                SetHandleInformation(si.hStdOutput, HANDLE_FLAG_INHERIT,
+                                                    HANDLE_FLAG_INHERIT);
             }
+            else
+                si.hStdOutput = INVALID_HANDLE_VALUE;
 
             si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
+            if (GetHandleInformation(si.hStdError, &stderr_reset)
+                    && (stderr_reset &= HANDLE_FLAG_INHERIT))
+                SetHandleInformation(si.hStdError,
+                                     HANDLE_FLAG_INHERIT, 0);
+
             if (attr->child_err && attr->child_err->filehand)
             {
-                if (GetHandleInformation(si.hStdError,
-                                         &stderr_reset)
-                        && (stderr_reset &= HANDLE_FLAG_INHERIT))
-                    SetHandleInformation(si.hStdError,
-                                         HANDLE_FLAG_INHERIT, 0);
-
-                if ( (si.hStdError = attr->child_err->filehand) 
-                                   != INVALID_HANDLE_VALUE )
-                    SetHandleInformation(si.hStdError, HANDLE_FLAG_INHERIT,
-                                                       HANDLE_FLAG_INHERIT);
+                si.hStdError = attr->child_err->filehand;
+                SetHandleInformation(si.hStdError, HANDLE_FLAG_INHERIT,
+                                                   HANDLE_FLAG_INHERIT);
             }
+            else
+                si.hStdError = INVALID_HANDLE_VALUE;
         }
         rv = CreateProcessW(wprg, wcmd,        /* Executable & Command line */
                             NULL, NULL,        /* Proc & thread security attributes */
@@ -816,13 +802,13 @@
     new->hproc = pi.hProcess;
     new->pid = pi.dwProcessId;
 
-    if ((attr->child_in) && (attr->child_in != &no_file)) {
+    if (attr->child_in) {
         apr_file_close(attr->child_in);
     }
-    if ((attr->child_out) && (attr->child_out != &no_file)) {
+    if (attr->child_out) {
         apr_file_close(attr->child_out);
     }
-    if ((attr->child_err) && (attr->child_err != &no_file)) {
+    if (attr->child_err) {
         apr_file_close(attr->child_err);
     }
     CloseHandle(pi.hThread);