]> git.sur5r.net Git - openldap/commitdiff
NT portability fix from HEAD
authorKurt Zeilenga <kurt@openldap.org>
Wed, 17 Mar 2004 21:11:37 +0000 (21:11 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Wed, 17 Mar 2004 21:11:37 +0000 (21:11 +0000)
libraries/libldap_r/thr_nt.c

index a68d2608e43d8ab2efe551c5c29a0058fb0adfd4..5919ee6d49098f902b8c27aec39fb605fb94dd38 100644 (file)
 
 #include "ldap_pvt_thread.h"
 
+typedef struct ldap_int_thread_s {
+       long tid;
+       HANDLE thd;
+} ldap_int_thread_s;
+
+#ifndef NT_MAX_THREADS
+#define NT_MAX_THREADS 1024
+#endif
+
+static ldap_int_thread_s tids[NT_MAX_THREADS];
+static int ntids;
+
+
 /* mingw compiler very sensitive about getting prototypes right */
 typedef unsigned __stdcall thrfunc_t(void *);
 
@@ -50,7 +63,9 @@ ldap_pvt_thread_create( ldap_pvt_thread_t * thread,
 
        if ( thd ) {
                *thread = (ldap_pvt_thread_t) tid;
-               CloseHandle( thd );
+               tids[ntids].tid = tid;
+               tids[ntids].thd = thd;
+               ntids++;
                rc = 0;
        }
        return rc;
@@ -66,12 +81,19 @@ int
 ldap_pvt_thread_join( ldap_pvt_thread_t thread, void **thread_return )
 {
        DWORD status;
-       HANDLE thd;
-       HANDLE __stdcall OpenThread( int, int, int );
+       int i;
 
-       thd = OpenThread( SYNCHRONIZE, 0, thread );
-       status = WaitForSingleObject( thd, INFINITE );
-       CloseHandle( thd );
+       for (i=0; i<ntids; i++) {
+               if ( tids[i].tid == thread )
+                       break;
+       }
+       if ( i > ntids ) return -1;
+
+       status = WaitForSingleObject( tids[i].thd, INFINITE );
+       for (; i<ntids; i++) {
+               tids[i] = tids[i+1];
+       }
+       ntids--;
        return status == WAIT_FAILED ? -1 : 0;
 }