? threadproc/win32/win32_thread.diff
? include/arch/win32/win32.apr_arch_threadproc.h.diff
Index: threadproc/win32/thread.c
===================================================================
RCS file: /home/cvspublic/apr/threadproc/win32/thread.c,v
retrieving revision 1.57
diff -u -r1.57 thread.c
--- threadproc/win32/thread.c	10 Jun 2004 10:57:25 -0000	1.57
+++ threadproc/win32/thread.c	19 Jul 2004 16:17:16 -0000
@@ -22,7 +22,8 @@
 #if APR_HAVE_PROCESS_H
 #include <process.h>
 #endif
-#include "apr_arch_misc.h"   
+#include "apr_arch_misc.h" 
+#include "apr_atomic.h"  
 
 /* Chosen for us by apr_initialize */
 DWORD tls_apr_thread = 0;
@@ -78,6 +79,22 @@
     return thd->func(thd, thd->data);
 }
 
+static int apr_thread_close_os_handle (apr_thread_t *thd);
+static int apr_thread_close_os_handle (apr_thread_t *thd)
+{
+    if (!thd->td) {
+       return APR_SUCCESS;
+    }
+
+    if (!apr_atomic_read32(&thd->joined) && CloseHandle(thd->td)) {
+        thd->td = NULL;
+        return APR_SUCCESS;
+    }
+    else {
+        return apr_get_os_error();
+    }
+}
+
 APR_DECLARE(apr_status_t) apr_thread_create(apr_thread_t **new,
                                             apr_threadattr_t *attr,
                                             apr_thread_start_t func,
@@ -95,6 +112,10 @@
     (*new)->pool = pool;
     (*new)->data = data;
     (*new)->func = func;
+    (*new)->td	 = NULL;
+    (*new)->exitval = APR_SUCCESS;
+    (*new)->exit_called=0;
+    (*new)->joined = 0;
     
     stat = apr_pool_create(&(*new)->pool, pool);
     if (stat != APR_SUCCESS) {
@@ -120,8 +141,7 @@
     }
 #endif
     if (attr && attr->detach) {
-        CloseHandle((*new)->td);
-        (*new)->td = NULL;
+       apr_thread_close_os_handle(*new);
     }
 
     return APR_SUCCESS;
@@ -131,11 +151,10 @@
                                           apr_status_t retval)
 {
     thd->exitval = retval;
+    thd->exit_called=1;
     apr_pool_destroy(thd->pool);
 #ifndef _WIN32_WCE
-    if (thd->td) {
-        CloseHandle(thd->td);
-    }
+    apr_thread_close_os_handle(thd);
     _endthreadex(0);
 #else
     ExitThread(0);
@@ -147,25 +166,36 @@
                                           apr_thread_t *thd)
 {
     apr_status_t rv;
-
-    rv = WaitForSingleObject(thd->td, INFINITE);
-    if ( rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED) {
-        *retval = thd->exitval;
-        return APR_SUCCESS;
+    DWORD hinfo;
+    
+    apr_atomic_inc32(&thd->joined);
+    if(GetHandleInformation(thd->td,&hinfo))/*check for good handle*/
+    {       
+       rv = WaitForSingleObject(thd->td, INFINITE);
+       
+       if ( rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED ) {
+	  *retval = thd->exitval;
+	  apr_atomic_dec32(&thd->joined);
+	  apr_thread_close_os_handle(thd);
+	  return APR_SUCCESS;
+       }
+    }
+
+    /*assume thread finished ?*/
+    if(thd->exit_called)
+    {
+       *retval = thd->exitval;
+       return APR_SUCCESS;
     }
+
+    apr_atomic_dec32(&thd->joined);
     /* Wait failed */
-    return apr_get_os_error();;
+    return apr_get_os_error();
 }
 
 APR_DECLARE(apr_status_t) apr_thread_detach(apr_thread_t *thd)
-{
-    if (thd->td && CloseHandle(thd->td)) {
-        thd->td = NULL;
-        return APR_SUCCESS;
-    }
-    else {
-        return apr_get_os_error();
-    }
+{    
+    return apr_thread_close_os_handle(thd);
 }
 
 APR_DECLARE(void) apr_thread_yield()
Index: include/arch/win32/apr_arch_threadproc.h
===================================================================
RCS file: /home/cvspublic/apr/include/arch/win32/apr_arch_threadproc.h,v
retrieving revision 1.3
diff -u -r1.3 apr_arch_threadproc.h
--- include/arch/win32/apr_arch_threadproc.h	1 Mar 2004 21:05:44 -0000	1.3
+++ include/arch/win32/apr_arch_threadproc.h	19 Jul 2004 16:17:16 -0000
@@ -25,6 +25,8 @@
 struct apr_thread_t {
     apr_pool_t *pool;
     HANDLE td;
+    apr_uint32_t joined;
+    apr_byte_t exit_called;
     apr_int32_t cancel;
     apr_int32_t cancel_how;
     void *data;
