[prev in list] [next in list] [prev in thread] [next in thread] 

List:       apr-dev
Subject:    Re: [PATCH] Win32 apr_proc cleanup
From:       "William A. Rowe, Jr." <wrowe () covalent ! net>
Date:       2001-11-27 5:09:03
[Download RAW message or body]

Do we really need this?  We have the otherchild logic [working correctly,
I hope!]  What is Unix doing on this issue?

Bill

----- Original Message ----- 
From: "Mladen Turk" <mturk@mappingsoft.com>
To: <dev@apr.apache.org>
Sent: Thursday, November 22, 2001 3:38 AM
Subject: [PATCH] Win32 apr_proc cleanup


> Hi,
> 
> I think that this is one of the showstoppers.
> 
> When creating a process the patch allocates an extra struct from the
> pool that can be used in pool cleanup to close the process handle but
> only if the proccess is not active. It registers the cleanup function to
> that pool.
> 
> If the process is still active it can be terminated (I've put that
> inside #if 0), but I'm not sure if that's what we need, but it can be
> handy.
> 
> Comments?


Index: proc.c
===================================================================
RCS file: /home/cvspublic/apr/threadproc/win32/proc.c,v
retrieving revision 1.59
diff -u -r1.59 proc.c
--- proc.c      2001/10/23 17:56:42     1.59
+++ proc.c      2001/11/22 09:13:22
@@ -65,6 +65,50 @@
 #include <string.h>
 #include <process.h>
 
+/** The opaque pool cleanup struct */
+typedef struct win_proc_t win_proc_t;
+
+struct win_proc_t {
+    HANDLE hProcess;
+    DWORD  dwProcessId;
+};
+
+apr_status_t win_proc_cleanup(void *theProc)
+{
+    win_proc_t *proc = theProc;
+    DWORD  exit_code;
+    
+    if (proc->hProcess != INVALID_HANDLE_VALUE && 
+        GetExitCodeProcess(proc->hProcess, &exit_code)) {
+        if (exit_code != STILL_ACTIVE) {
+            CloseHandle(proc->hProcess);
+            proc->hProcess = INVALID_HANDLE_VALUE;
+            OutputDebugString("Closing NonActive Process HANDLE");
+            return APR_SUCCESS;
+        }
+#if 0
+#pragma message("Proccess termination enabled !")
+        /* XXX: Should we terminate the process 
+         * on apr_pool_clean if the process is still active? 
+        */
+        else {
+            if (OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc->dwProcessId)) {
+                if (TerminateProcess(proc->hProcess, 1)) {   
+                    CloseHandle(proc->hProcess);
+                    proc->hProcess = INVALID_HANDLE_VALUE;
+                    return APR_SUCCESS;
+                }
+            }
+            return APR_EACCES;
+        }
+#else
+        else
+            return APR_EBUSY;
+#endif
+    }
+    return APR_NOTFOUND;
+}
+
 /* 
  * some of the ideas expressed herein are based off of Microsoft
  * Knowledge Base article: Q190351
@@ -296,6 +340,7 @@
     char *pEnvBlock;
     PROCESS_INFORMATION pi;
     DWORD dwCreationFlags = 0;
+    win_proc_t *phandle;
 
     new->in = attr->parent_in;
     new->err = attr->parent_err;
@@ -406,9 +451,9 @@
                 pNext = wcschr(pNext, L'\0') + 1;
                 i++;
             }
-           if (!i)
+        if (!i)
                 *(pNext++) = L'\0';
-           *pNext = L'\0';
+        *pNext = L'\0';
         }
         else 
 #endif /* APR_HAS_UNICODE_FS */
@@ -423,9 +468,9 @@
                 pNext = strchr(pNext, '\0') + 1;
                 i++;
             }
-           if (!i)
+        if (!i)
                 *(pNext++) = '\0';
-           *pNext = '\0';
+        *pNext = '\0';
         }
     } 
 
@@ -536,6 +581,13 @@
         apr_file_close(attr->child_err);
     }
     CloseHandle(pi.hThread);
+    
+    /* create the cleanup sruct */
+    phandle = apr_palloc(cont, sizeof(win_proc_t));
+    phandle->hProcess = pi.hProcess;
+    phandle->dwProcessId = pi.dwProcessId;
+    apr_pool_cleanup_register(cont, (void *)phandle, win_proc_cleanup,
+                              apr_pool_cleanup_null);
 
     return APR_SUCCESS;
 }
@@ -560,7 +612,7 @@
             if (exitcode)
                 *exitcode = (apr_wait_t)stat;
             CloseHandle(proc->hproc);
-            proc->hproc = NULL;
+            proc->hproc = INVALID_HANDLE_VALUE;
             return APR_CHILD_DONE;
         }
     }

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic