1 /* thread.c - glue routines to provide a consistent thread interface */
7 #if defined( HAVE_PTHREADS )
9 #ifndef HAVE_PTHREAD_KILL
11 * Some pthreads packages (ie: DCE) don't have pthread_kill()
12 * pthread_kill() routine)
18 pthread_kill( pthread_t tid, int sig )
20 kill( getpid(), sig );
22 #endif /* HAVE_PTHREAD_KILL */
24 #if !defined(HAVE_SCHED_YIELD) && !defined(HAVE_PTHREAD_YIELD)
26 * Some pthreads packages don't have sched_yield() nor
27 * the draft4 pthread_kill() routine, assume it's not
33 /* assume pthread implementation is preemptive */
35 #endif /* missing sched_yield() */
37 #elif defined( HAVE_MACH_CTHREADS )
39 /***********************************************************************
41 * under NEXTSTEP or OPENSTEP use CThreads *
42 * lukeh@xedoc.com.au *
44 ***********************************************************************/
47 pthread_attr_init( pthread_attr_t *attr )
54 pthread_attr_destroy( pthread_attr_t *attr )
60 pthread_attr_getdetachstate( pthread_attr_t *attr, int *detachstate )
67 pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
82 *tid = cthread_fork(func, arg);
83 return ( *tid == NULL ? -1 : 0 );
93 pthread_exit( any_t a )
99 pthread_join( pthread_t tid, int *pStatus )
102 status = (int) cthread_join ( tid );
111 pthread_kill( pthread_t tid, int sig )
118 pthread_mutex_init( pthread_mutex_t *mp, pthread_mutexattr_t *attr )
126 pthread_mutex_destroy( pthread_mutex_t *mp )
133 pthread_mutex_lock( pthread_mutex_t *mp )
140 pthread_mutex_unlock( pthread_mutex_t *mp )
147 pthread_mutex_trylock( pthread_mutex_t *mp )
149 return mutex_try_lock( mp );
153 pthread_cond_init( pthread_cond_t *cv, pthread_condattr_t *attr )
155 condition_init( cv );
160 pthread_cond_destroy( pthread_cond_t *cv )
162 condition_clear( cv );
167 pthread_cond_wait( pthread_cond_t *cv, pthread_mutex_t *mp )
169 condition_wait( cv, mp );
174 pthread_cond_signal( pthread_cond_t *cv )
176 condition_signal( cv );
181 pthread_cond_broadcast( pthread_cond_t *cv )
183 condition_broadcast( cv );
187 #elif defined( HAVE_THR )
196 pthread_attr_init( pthread_attr_t *attr )
203 pthread_attr_destroy( pthread_attr_t *attr )
210 pthread_attr_getdetachstate( pthread_attr_t *attr, int *detachstate )
212 *detachstate = *attr;
217 pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
227 pthread_attr_t *attr,
232 return( thr_create( NULL, 0, func, arg, *attr, tid ) );
236 pthread_yield( void )
248 pthread_join( pthread_t tid, int *status )
250 thr_join( tid, NULL, (void **) status );
254 pthread_kill( pthread_t tid, int sig )
256 thr_kill( tid, sig );
261 pthread_mutex_init( pthread_mutex_t *mp, pthread_mutexattr_t *attr )
263 return( mutex_init( mp, attr ? *attr : USYNC_THREAD, NULL ) );
267 pthread_mutex_destroy( pthread_mutex_t *mp )
269 return( mutex_destroy( mp ) );
273 pthread_mutex_lock( pthread_mutex_t *mp )
275 return( mutex_lock( mp ) );
279 pthread_mutex_unlock( pthread_mutex_t *mp )
281 return( mutex_unlock( mp ) );
285 pthread_mutex_trylock( pthread_mutex_t *mp )
287 return( mutex_trylock( mp ) );
291 pthread_cond_init( pthread_cond_t *cv, pthread_condattr_t *attr )
293 return( cond_init( cv, attr ? *attr : USYNC_THREAD, NULL ) );
297 pthread_cond_destroy( pthread_cond_t *cv )
299 return( cond_destroy( cv ) );
303 pthread_cond_wait( pthread_cond_t *cv, pthread_mutex_t *mp )
305 return( cond_wait( cv, mp ) );
309 pthread_cond_signal( pthread_cond_t *cv )
311 return( cond_signal( cv ) );
315 pthread_cond_broadcast( pthread_cond_t *cv )
317 return( cond_broadcast( cv ) );
320 #elif defined( HAVE_LWP )
329 pthread_attr_init( pthread_attr_t *attr )
336 pthread_attr_destroy( pthread_attr_t *attr )
342 pthread_attr_getdetachstate( pthread_attr_t *attr, int *detachstate )
344 *detachstate = *attr;
349 pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
356 lwp_create_stack( VFP func, void *arg, int stackno )
360 free_stack( stackno );
367 pthread_attr_t *attr,
375 if ( (stack = get_stack( &stackno )) == NULL ) {
378 return( lwp_create( tid, lwp_create_stack, MINPRIO, 0, stack, 3, func,
383 pthread_yield( void )
395 pthread_join( pthread_t tid, int *status )
402 pthread_kill( pthread_t tid, int sig )
409 pthread_mutex_init( pthread_mutex_t *mp, pthread_mutexattr_t *attr )
411 return( mon_create( mp ) );
415 pthread_mutex_destroy( pthread_mutex_t *mp )
417 return( mon_destroy( *mp ) );
421 pthread_mutex_lock( pthread_mutex_t *mp )
423 return( mon_enter( *mp ) );
427 pthread_mutex_unlock( pthread_mutex_t *mp )
429 return( mon_exit( *mp ) );
433 pthread_mutex_trylock( pthread_mutex_t *mp )
435 return( mon_cond_enter( *mp ) );
439 pthread_cond_init( pthread_cond_t *cv, pthread_condattr_t *attr )
442 * lwp cv_create requires the monitor id be passed in
443 * when the cv is created, pthreads passes it when the
444 * condition is waited for. so, we fake the creation
445 * here and actually do it when the cv is waited for
455 pthread_cond_destroy( pthread_cond_t *cv )
457 return( cv->lcv_created ? cv_destroy( cv->lcv_cv ) : 0 );
461 pthread_cond_wait( pthread_cond_t *cv, pthread_mutex_t *mp )
463 if ( ! cv->lcv_created ) {
464 cv_create( &cv->lcv_cv, *mp );
468 return( cv_wait( cv->lcv_cv ) );
472 pthread_cond_signal( pthread_cond_t *cv )
474 return( cv->lcv_created ? cv_notify( cv->lcv_cv ) : 0 );
478 pthread_cond_broadcast( pthread_cond_t *cv )
480 return( cv->lcv_created ? cv_broadcast( cv->lcv_cv ) : 0 );
484 #elif defined( HAVE_NT_THREADS )
487 pthread_attr_init( pthread_attr_t *attr )
494 pthread_attr_destroy( pthread_attr_t *attr )
500 pthread_attr_getdetachstate( pthread_attr_t *attr, int *detachstate )
502 *detachstate = *attr;
507 pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
516 pthread_attr_t *attr,
521 *tid = (pthread_t)_beginthread( (void *) func, 0, arg );
522 return ( (unsigned long)*tid == -1 ? -1 : 0 );
538 pthread_join( pthread_t tid, int *pStatus )
541 status = WaitForSingleObject( tid, INFINITE );
542 if ( pStatus != NULL)
544 if ( status != WAIT_FAILED )
547 *pStatus = WAIT_ABANDONED;
553 pthread_kill( pthread_t tid, int sig )
560 pthread_mutex_init( pthread_mutex_t *mp, pthread_mutexattr_t *attr )
562 *mp = CreateMutex( NULL, 0, NULL );
567 pthread_mutex_destroy( pthread_mutex_t *mp )
574 pthread_mutex_lock( pthread_mutex_t *mp )
576 WaitForSingleObject( *mp, INFINITE );
581 pthread_mutex_unlock( pthread_mutex_t *mp )
588 pthread_mutex_trylock( pthread_mutex_t *mp )
592 status = WaitForSingleObject( *mp, 0 );
593 if ( (status == WAIT_FAILED) || (status == WAIT_TIMEOUT) )
600 pthread_cond_init( pthread_cond_t *cv, pthread_condattr_t *attr )
602 *cv = CreateEvent( NULL, FALSE, FALSE, NULL );
607 pthread_cond_destroy( pthread_cond_t *cv )
614 pthread_cond_wait( pthread_cond_t *cv, pthread_mutex_t *mp )
617 WaitForSingleObject( *cv, INFINITE );
618 WaitForSingleObject( *mp, INFINITE );
623 pthread_cond_signal( pthread_cond_t *cv )
630 pthread_cond_broadcast( pthread_cond_t *cv )
638 /***********************************************************************
640 * no threads package defined for this system - fake ok returns from *
641 * all threads routines (making it single-threaded). *
643 ***********************************************************************/
647 pthread_attr_init( pthread_attr_t *attr )
654 pthread_attr_destroy( pthread_attr_t *attr )
661 pthread_attr_getdetachstate( pthread_attr_t *attr, int *detachstate )
668 pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
677 pthread_attr_t *attr,
688 pthread_yield( void )
701 pthread_kill( pthread_t tid, int sig )
707 pthread_join( pthread_t tid, int *status )
714 pthread_mutex_init( pthread_mutex_t *mp, pthread_mutexattr_t *attr )
721 pthread_mutex_destroy( pthread_mutex_t *mp )
728 pthread_mutex_lock( pthread_mutex_t *mp )
735 pthread_mutex_unlock( pthread_mutex_t *mp )
742 pthread_mutex_trylock( pthread_mutex_t *mp )
749 pthread_cond_init( pthread_cond_t *cv, pthread_condattr_t *attr )
756 pthread_cond_destroy( pthread_cond_t *cv )
763 pthread_cond_wait( pthread_cond_t *cv, pthread_mutex_t *mp )
770 pthread_cond_signal( pthread_cond_t *cv )
777 pthread_cond_broadcast( pthread_cond_t *cv )
782 #endif /* no threads package */