1 /* thread.c - glue routines to provide a consistent thread interface */
7 #if defined( HAVE_PTHREADS )
9 #ifndef HAVE_PTHREAD_KILL
10 /***********************************************************************
12 * pthreads package with DCE - no mapping to do (except to create a *
13 * pthread_kill() routine) *
15 ***********************************************************************/
19 pthread_kill( pthread_t tid, int sig )
21 kill( getpid(), sig );
23 #endif /* HAVE_PTHREAD_KILL */
25 #elif defined( HAVE_MACH_CTHREADS )
27 /***********************************************************************
29 * under NEXTSTEP or OPENSTEP use CThreads *
30 * lukeh@xedoc.com.au *
32 ***********************************************************************/
35 pthread_attr_init( pthread_attr_t *attr )
42 pthread_attr_destroy( pthread_attr_t *attr )
48 pthread_attr_getdetachstate( pthread_attr_t *attr, int *detachstate )
55 pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
70 *tid = cthread_fork(func, arg);
71 return ( *tid == NULL ? -1 : 0 );
81 pthread_exit( any_t a )
87 pthread_join( pthread_t tid, int *pStatus )
90 status = (int) cthread_join ( tid );
99 pthread_kill( pthread_t tid, int sig )
106 pthread_mutex_init( pthread_mutex_t *mp, pthread_mutexattr_t *attr )
114 pthread_mutex_destroy( pthread_mutex_t *mp )
121 pthread_mutex_lock( pthread_mutex_t *mp )
128 pthread_mutex_unlock( pthread_mutex_t *mp )
135 pthread_mutex_trylock( pthread_mutex_t *mp )
137 return mutex_try_lock( mp );
141 pthread_cond_init( pthread_cond_t *cv, pthread_condattr_t *attr )
143 condition_init( cv );
148 pthread_cond_destroy( pthread_cond_t *cv )
150 condition_clear( cv );
155 pthread_cond_wait( pthread_cond_t *cv, pthread_mutex_t *mp )
157 condition_wait( cv, mp );
162 pthread_cond_signal( pthread_cond_t *cv )
164 condition_signal( cv );
169 pthread_cond_broadcast( pthread_cond_t *cv )
171 condition_broadcast( cv );
175 #elif defined( HAVE_THR )
184 pthread_attr_init( pthread_attr_t *attr )
191 pthread_attr_destroy( pthread_attr_t *attr )
198 pthread_attr_getdetachstate( pthread_attr_t *attr, int *detachstate )
200 *detachstate = *attr;
205 pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
215 pthread_attr_t *attr,
220 return( thr_create( NULL, 0, func, arg, *attr, tid ) );
224 pthread_yield( void )
236 pthread_join( pthread_t tid, int *status )
238 thr_join( tid, NULL, (void **) status );
242 pthread_kill( pthread_t tid, int sig )
244 thr_kill( tid, sig );
249 pthread_mutex_init( pthread_mutex_t *mp, pthread_mutexattr_t *attr )
251 return( mutex_init( mp, attr ? *attr : USYNC_THREAD, NULL ) );
255 pthread_mutex_destroy( pthread_mutex_t *mp )
257 return( mutex_destroy( mp ) );
261 pthread_mutex_lock( pthread_mutex_t *mp )
263 return( mutex_lock( mp ) );
267 pthread_mutex_unlock( pthread_mutex_t *mp )
269 return( mutex_unlock( mp ) );
273 pthread_mutex_trylock( pthread_mutex_t *mp )
275 return( mutex_trylock( mp ) );
279 pthread_cond_init( pthread_cond_t *cv, pthread_condattr_t *attr )
281 return( cond_init( cv, attr ? *attr : USYNC_THREAD, NULL ) );
285 pthread_cond_destroy( pthread_cond_t *cv )
287 return( cond_destroy( cv ) );
291 pthread_cond_wait( pthread_cond_t *cv, pthread_mutex_t *mp )
293 return( cond_wait( cv, mp ) );
297 pthread_cond_signal( pthread_cond_t *cv )
299 return( cond_signal( cv ) );
303 pthread_cond_broadcast( pthread_cond_t *cv )
305 return( cond_broadcast( cv ) );
308 #elif defined( HAVE_LWP )
317 pthread_attr_init( pthread_attr_t *attr )
324 pthread_attr_destroy( pthread_attr_t *attr )
330 pthread_attr_getdetachstate( pthread_attr_t *attr, int *detachstate )
332 *detachstate = *attr;
337 pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
344 lwp_create_stack( VFP func, void *arg, int stackno )
348 free_stack( stackno );
355 pthread_attr_t *attr,
363 if ( (stack = get_stack( &stackno )) == NULL ) {
366 return( lwp_create( tid, lwp_create_stack, MINPRIO, 0, stack, 3, func,
371 pthread_yield( void )
383 pthread_join( pthread_t tid, int *status )
390 pthread_kill( pthread_t tid, int sig )
397 pthread_mutex_init( pthread_mutex_t *mp, pthread_mutexattr_t *attr )
399 return( mon_create( mp ) );
403 pthread_mutex_destroy( pthread_mutex_t *mp )
405 return( mon_destroy( *mp ) );
409 pthread_mutex_lock( pthread_mutex_t *mp )
411 return( mon_enter( *mp ) );
415 pthread_mutex_unlock( pthread_mutex_t *mp )
417 return( mon_exit( *mp ) );
421 pthread_mutex_trylock( pthread_mutex_t *mp )
423 return( mon_cond_enter( *mp ) );
427 pthread_cond_init( pthread_cond_t *cv, pthread_condattr_t *attr )
430 * lwp cv_create requires the monitor id be passed in
431 * when the cv is created, pthreads passes it when the
432 * condition is waited for. so, we fake the creation
433 * here and actually do it when the cv is waited for
443 pthread_cond_destroy( pthread_cond_t *cv )
445 return( cv->lcv_created ? cv_destroy( cv->lcv_cv ) : 0 );
449 pthread_cond_wait( pthread_cond_t *cv, pthread_mutex_t *mp )
451 if ( ! cv->lcv_created ) {
452 cv_create( &cv->lcv_cv, *mp );
456 return( cv_wait( cv->lcv_cv ) );
460 pthread_cond_signal( pthread_cond_t *cv )
462 return( cv->lcv_created ? cv_notify( cv->lcv_cv ) : 0 );
466 pthread_cond_broadcast( pthread_cond_t *cv )
468 return( cv->lcv_created ? cv_broadcast( cv->lcv_cv ) : 0 );
472 #elif defined( HAVE_NT_MULTITHREADS )
475 #include <winsock2.h>
478 pthread_attr_init( pthread_attr_t *attr )
485 pthread_attr_destroy( pthread_attr_t *attr )
491 pthread_attr_getdetachstate( pthread_attr_t *attr, int *detachstate )
493 *detachstate = *attr;
498 pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
507 pthread_attr_t *attr,
512 *tid = (pthread_t)_beginthread( (void *) func, 0, arg );
513 return ( (unsigned long)*tid == -1 ? -1 : 0 );
529 pthread_join( pthread_t tid, int *pStatus )
532 status = WaitForSingleObject( tid, INFINITE );
533 if ( pStatus != NULL)
535 if ( status != WAIT_FAILED )
538 *pStatus = WAIT_ABANDONED;
544 pthread_kill( pthread_t tid, int sig )
551 pthread_mutex_init( pthread_mutex_t *mp, pthread_mutexattr_t *attr )
553 *mp = CreateMutex( NULL, 0, NULL );
558 pthread_mutex_destroy( pthread_mutex_t *mp )
565 pthread_mutex_lock( pthread_mutex_t *mp )
567 WaitForSingleObject( *mp, INFINITE );
572 pthread_mutex_unlock( pthread_mutex_t *mp )
579 pthread_mutex_trylock( pthread_mutex_t *mp )
583 status = WaitForSingleObject( *mp, 0 );
584 if ( (status == WAIT_FAILED) || (status == WAIT_TIMEOUT) )
591 pthread_cond_init( pthread_cond_t *cv, pthread_condattr_t *attr )
593 *cv = CreateEvent( NULL, FALSE, FALSE, NULL );
598 pthread_cond_destroy( pthread_cond_t *cv )
605 pthread_cond_wait( pthread_cond_t *cv, pthread_mutex_t *mp )
608 WaitForSingleObject( *cv, INFINITE );
609 WaitForSingleObject( *mp, INFINITE );
614 pthread_cond_signal( pthread_cond_t *cv )
621 pthread_cond_broadcast( pthread_cond_t *cv )
629 /***********************************************************************
631 * no threads package defined for this system - fake ok returns from *
632 * all threads routines (making it single-threaded). *
634 ***********************************************************************/
638 pthread_attr_init( pthread_attr_t *attr )
645 pthread_attr_destroy( pthread_attr_t *attr )
652 pthread_attr_getdetachstate( pthread_attr_t *attr, int *detachstate )
659 pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
668 pthread_attr_t *attr,
679 pthread_yield( void )
692 pthread_kill( pthread_t tid, int sig )
698 pthread_join( pthread_t tid, int *status )
705 pthread_mutex_init( pthread_mutex_t *mp, pthread_mutexattr_t *attr )
712 pthread_mutex_destroy( pthread_mutex_t *mp )
719 pthread_mutex_lock( pthread_mutex_t *mp )
726 pthread_mutex_unlock( pthread_mutex_t *mp )
733 pthread_mutex_trylock( pthread_mutex_t *mp )
740 pthread_cond_init( pthread_cond_t *cv, pthread_condattr_t *attr )
747 pthread_cond_destroy( pthread_cond_t *cv )
754 pthread_cond_wait( pthread_cond_t *cv, pthread_mutex_t *mp )
761 pthread_cond_signal( pthread_cond_t *cv )
768 pthread_cond_broadcast( pthread_cond_t *cv )
773 #endif /* no threads package */