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 )
183 #if !defined(__SunOS_5_6)
185 pthread_attr_init( pthread_attr_t *attr )
192 pthread_attr_destroy( pthread_attr_t *attr )
199 pthread_attr_getdetachstate( pthread_attr_t *attr, int *detachstate )
201 *detachstate = *attr;
206 pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
216 pthread_attr_t *attr,
221 return( thr_create( NULL, 0, func, arg, *attr, tid ) );
223 #endif /* ! sunos56 */
231 #if !defined(__SunOS_5_6)
239 pthread_join( pthread_t tid, int *status )
241 thr_join( tid, NULL, (void **) status );
245 pthread_kill( pthread_t tid, int sig )
247 thr_kill( tid, sig );
252 pthread_mutex_init( pthread_mutex_t *mp, pthread_mutexattr_t *attr )
254 return( mutex_init( mp, attr ? *attr : USYNC_THREAD, NULL ) );
258 pthread_mutex_destroy( pthread_mutex_t *mp )
260 return( mutex_destroy( mp ) );
264 pthread_mutex_lock( pthread_mutex_t *mp )
266 return( mutex_lock( mp ) );
270 pthread_mutex_unlock( pthread_mutex_t *mp )
272 return( mutex_unlock( mp ) );
276 pthread_mutex_trylock( pthread_mutex_t *mp )
278 return( mutex_trylock( mp ) );
282 pthread_cond_init( pthread_cond_t *cv, pthread_condattr_t *attr )
284 return( cond_init( cv, attr ? *attr : USYNC_THREAD, NULL ) );
288 pthread_cond_destroy( pthread_cond_t *cv )
290 return( cond_destroy( cv ) );
294 pthread_cond_wait( pthread_cond_t *cv, pthread_mutex_t *mp )
296 return( cond_wait( cv, mp ) );
300 pthread_cond_signal( pthread_cond_t *cv )
302 return( cond_signal( cv ) );
306 pthread_cond_broadcast( pthread_cond_t *cv )
308 return( cond_broadcast( cv ) );
310 #endif /* ! sunos56 */
312 #elif defined( HAVE_LWP )
321 pthread_attr_init( pthread_attr_t *attr )
328 pthread_attr_destroy( pthread_attr_t *attr )
334 pthread_attr_getdetachstate( pthread_attr_t *attr, int *detachstate )
336 *detachstate = *attr;
341 pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
348 lwp_create_stack( VFP func, void *arg, int stackno )
352 free_stack( stackno );
359 pthread_attr_t *attr,
367 if ( (stack = get_stack( &stackno )) == NULL ) {
370 return( lwp_create( tid, lwp_create_stack, MINPRIO, 0, stack, 3, func,
387 pthread_join( pthread_t tid, int *status )
394 pthread_kill( pthread_t tid, int sig )
401 pthread_mutex_init( pthread_mutex_t *mp, pthread_mutexattr_t *attr )
403 return( mon_create( mp ) );
407 pthread_mutex_destroy( pthread_mutex_t *mp )
409 return( mon_destroy( *mp ) );
413 pthread_mutex_lock( pthread_mutex_t *mp )
415 return( mon_enter( *mp ) );
419 pthread_mutex_unlock( pthread_mutex_t *mp )
421 return( mon_exit( *mp ) );
425 pthread_mutex_trylock( pthread_mutex_t *mp )
427 return( mon_cond_enter( *mp ) );
431 pthread_cond_init( pthread_cond_t *cv, pthread_condattr_t *attr )
434 * lwp cv_create requires the monitor id be passed in
435 * when the cv is created, pthreads passes it when the
436 * condition is waited for. so, we fake the creation
437 * here and actually do it when the cv is waited for
447 pthread_cond_destroy( pthread_cond_t *cv )
449 return( cv->lcv_created ? cv_destroy( cv->lcv_cv ) : 0 );
453 pthread_cond_wait( pthread_cond_t *cv, pthread_mutex_t *mp )
455 if ( ! cv->lcv_created ) {
456 cv_create( &cv->lcv_cv, *mp );
460 return( cv_wait( cv->lcv_cv ) );
464 pthread_cond_signal( pthread_cond_t *cv )
466 return( cv->lcv_created ? cv_notify( cv->lcv_cv ) : 0 );
470 pthread_cond_broadcast( pthread_cond_t *cv )
472 return( cv->lcv_created ? cv_broadcast( cv->lcv_cv ) : 0 );
478 /***********************************************************************
480 * no threads package defined for this system - fake ok returns from *
481 * all threads routines (making it single-threaded). *
483 ***********************************************************************/
487 pthread_attr_init( pthread_attr_t *attr )
494 pthread_attr_destroy( pthread_attr_t *attr )
501 pthread_attr_getdetachstate( pthread_attr_t *attr, int *detachstate )
508 pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )
517 pthread_attr_t *attr,
541 pthread_kill( pthread_t tid, int sig )
547 pthread_join( pthread_t tid, int *status )
554 pthread_mutex_init( pthread_mutex_t *mp, pthread_mutexattr_t *attr )
561 pthread_mutex_destroy( pthread_mutex_t *mp )
568 pthread_mutex_lock( pthread_mutex_t *mp )
575 pthread_mutex_unlock( pthread_mutex_t *mp )
582 pthread_mutex_trylock( pthread_mutex_t *mp )
589 pthread_cond_init( pthread_cond_t *cv, pthread_condattr_t *attr )
596 pthread_cond_destroy( pthread_cond_t *cv )
603 pthread_cond_wait( pthread_cond_t *cv, pthread_mutex_t *mp )
610 pthread_cond_signal( pthread_cond_t *cv )
617 pthread_cond_broadcast( pthread_cond_t *cv )
622 #endif /* no threads package */