]> git.sur5r.net Git - openldap/blobdiff - libraries/liblthread/thread.c
Add basic NT thread support.
[openldap] / libraries / liblthread / thread.c
index 0e7ebdd30561bd34b7347bb8b424fc64ef9519f9..af2a14eb88ca0abdbcd8a5516006e84f24d9ab45 100644 (file)
@@ -6,7 +6,7 @@
 
 #if defined( HAVE_PTHREADS )
 
-#ifdef HAVE_DCE
+#ifndef HAVE_PTHREAD_KILL
 /***********************************************************************
  *                                                                     *
  * pthreads package with DCE - no mapping to do (except to create a    *
@@ -20,7 +20,7 @@ pthread_kill( pthread_t tid, int sig )
 {
        kill( getpid(), sig );
 }
-#endif /* DCE */
+#endif /* HAVE_PTHREAD_KILL */
 
 #elif defined( HAVE_MACH_CTHREADS )
 
@@ -72,7 +72,7 @@ pthread_create(
 }
 
 void
-pthread_yield()
+pthread_yield( void )
 {
        cthread_yield();
 }
@@ -172,7 +172,7 @@ pthread_cond_broadcast( pthread_cond_t *cv )
        return( 0 );
 }
 
-#elif defined( HAVE_LWP_THR )
+#elif defined( HAVE_THR )
 
 /*******************
  *                 *
@@ -180,7 +180,6 @@ pthread_cond_broadcast( pthread_cond_t *cv )
  *                 *
  *******************/
 
-#if !defined(__SunOS_5_6)
 int
 pthread_attr_init( pthread_attr_t *attr )
 {
@@ -220,15 +219,13 @@ pthread_create(
 {
        return( thr_create( NULL, 0, func, arg, *attr, tid ) );
 }
-#endif /* ! sunos56 */
 
 void
-pthread_yield()
+pthread_yield( void )
 {
        thr_yield();
 }
 
-#if !defined(__SunOS_5_6)
 void
 pthread_exit()
 {
@@ -307,7 +304,6 @@ pthread_cond_broadcast( pthread_cond_t *cv )
 {
        return( cond_broadcast( cv ) );
 }
-#endif /* ! sunos56 */
 
 #elif defined( HAVE_LWP )
 
@@ -317,9 +313,6 @@ pthread_cond_broadcast( pthread_cond_t *cv )
  *           *
  *************/
 
-extern stkalign_t      *get_stack();
-static void            lwp_create_stack();
-
 int
 pthread_attr_init( pthread_attr_t *attr )
 {
@@ -347,6 +340,14 @@ pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
        return( 0 );
 }
 
+static void
+lwp_create_stack( VFP func, void *arg, int stackno )
+{
+       (*func)( arg );
+
+       free_stack( stackno );
+}
+
 /* ARGSUSED */
 int
 pthread_create(
@@ -366,16 +367,8 @@ pthread_create(
            arg, stackno ) );
 }
 
-static void
-lwp_create_stack( VFP func, void *arg, int stackno )
-{
-       (*func)( arg );
-
-       free_stack( stackno );
-}
-
 void
-pthread_yield()
+pthread_yield( void )
 {
        lwp_yield( SELF );
 }
@@ -476,6 +469,161 @@ pthread_cond_broadcast( pthread_cond_t *cv )
 }
 
 
+#elif defined( HAVE_NT_MULTITHREADS )
+
+#include <process.h>
+#include <winsock2.h>
+
+int
+pthread_attr_init( pthread_attr_t *attr )
+{
+       *attr = 0;
+       return( 0 );
+}
+
+int
+pthread_attr_destroy( pthread_attr_t *attr )
+{
+       return( 0 );
+}
+
+int
+pthread_attr_getdetachstate( pthread_attr_t *attr, int *detachstate )
+{
+       *detachstate = *attr;
+       return( 0 );
+}
+
+int
+pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
+{
+       *attr = detachstate;
+       return( 0 );
+}
+
+int
+pthread_create(
+    pthread_t          *tid,
+    pthread_attr_t     *attr,
+    VFP                        func,
+    void               *arg
+)
+{
+       *tid = (pthread_t)_beginthread( (void *) func, 0, arg );
+        return ( (unsigned long)*tid == -1 ? -1 : 0 );
+}
+
+void
+pthread_yield()
+{
+
+}
+
+void
+pthread_exit( void )
+{
+       _endthread( );
+}
+
+void
+pthread_join( pthread_t tid, int *pStatus )
+{
+       DWORD status;
+       status = WaitForSingleObject( tid, INFINITE );
+       if ( pStatus != NULL)
+       {
+               if ( status != WAIT_FAILED )
+                       *pStatus = 0;
+               else
+                       *pStatus = WAIT_ABANDONED;
+       }
+}
+
+
+void
+pthread_kill( pthread_t tid, int sig )
+{
+       return;
+}
+
+
+int
+pthread_mutex_init( pthread_mutex_t *mp, pthread_mutexattr_t *attr )
+{
+       *mp = CreateMutex( NULL, 0, NULL );
+       return ( 0 );
+}
+
+int
+pthread_mutex_destroy( pthread_mutex_t *mp )
+{
+       CloseHandle( *mp );
+       return ( 0 );
+}
+
+int
+pthread_mutex_lock( pthread_mutex_t *mp )
+{
+       WaitForSingleObject( *mp, INFINITE );
+       return ( 0 );
+}
+
+int
+pthread_mutex_unlock( pthread_mutex_t *mp )
+{
+       ReleaseMutex( *mp );
+       return ( 0 );
+}
+
+int
+pthread_mutex_trylock( pthread_mutex_t *mp )
+{
+       DWORD status;
+
+       status = WaitForSingleObject( *mp, 0 );
+       if ( (status == WAIT_FAILED) || (status == WAIT_TIMEOUT) )
+               return 0;
+       else
+               return 1;
+}
+
+int
+pthread_cond_init( pthread_cond_t *cv, pthread_condattr_t *attr )
+{
+       *cv = CreateEvent( NULL, FALSE, FALSE, NULL );
+       return( 0 );
+}
+
+int
+pthread_cond_destroy( pthread_cond_t *cv )
+{
+       CloseHandle( *cv );
+       return( 0 );
+}
+
+int
+pthread_cond_wait( pthread_cond_t *cv, pthread_mutex_t *mp )
+{
+       ReleaseMutex( *mp );
+       WaitForSingleObject( *cv, INFINITE );
+       WaitForSingleObject( *mp, INFINITE );
+       return( 0 );
+}
+
+int
+pthread_cond_signal( pthread_cond_t *cv )
+{
+       SetEvent( *cv );
+       return( 0 );
+}
+
+int
+pthread_cond_broadcast( pthread_cond_t *cv )
+{
+       SetEvent( *cv );
+       return( 0 );
+}
+
 #else
 
 /***********************************************************************
@@ -528,7 +676,7 @@ pthread_create(
 }
 
 void
-pthread_yield()
+pthread_yield( void )
 {
        return;
 }