cm_tc16_mutex, (a)) #define SCM_VALIDATE_CONDVAR(pos, a) \ scm_assert_smob_type (scm_tc16_condvar, (a)) SCM_API SCM scm_spawn_thread (scm_t_catch_body body, void *body_data, scm_t_catch_handler handler, void *handler_data); SCM_API void *scm_without_guile (void *(*func)(void *), void *data); SCM_API void *scm_with_guile (void *(*func)(void *), void *data); SCM_INTERNAL void scm_threads_prehistory (void *); SCM_INTERNAL void scm_init_threads (void); SCM_INTERNAL void scm_init_threads_default_dynamic_state (void); SCM_INTERNAL void scm_i_dynwind_pthread_mutex_lock_block_asyncs (scm_i_pthread_mutex_t *mutex); SCM_API SCM scm_call_with_new_thread (SCM thunk, SCM handler); SCM_API SCM scm_yield (void); SCM_API SCM scm_cancel_thread (SCM t); SCM_API SCM scm_join_thread (SCM t); SCM_API SCM scm_join_thread_timed (SCM t, SCM timeout, SCM timeoutval); SCM_API SCM scm_thread_p (SCM t); SCM_API SCM scm_make_mutex (void); SCM_API SCM scm_make_recursive_mutex (void); SCM_API SCM scm_make_mutex_with_kind (SCM kind); SCM_API SCM scm_lock_mutex (SCM m); SCM_API SCM scm_timed_lock_mutex (SCM m, SCM timeout); SCM_API void scm_dynwind_lock_mutex (SCM mutex); SCM_API SCM scm_try_mutex (SCM m); SCM_API SCM scm_unlock_mutex (SCM m); SCM_API SCM scm_mutex_p (SCM o); SCM_API SCM scm_mutex_locked_p (SCM m); SCM_API SCM scm_mutex_owner (SCM m); SCM_API SCM scm_mutex_level (SCM m); SCM_API SCM scm_make_condition_variable (void); SCM_API SCM scm_wait_condition_variable (SCM cond, SCM mutex); SCM_API SCM scm_timed_wait_condition_variable (SCM cond, SCM mutex, SCM abstime); SCM_API SCM scm_signal_condition_variable (SCM cond); SCM_API SCM scm_broadcast_condition_variable (SCM cond); SCM_API SCM scm_condition_variable_p (SCM o); SCM_API SCM scm_current_thread (void); SCM_API SCM scm_all_threads (void); SCM_API int scm_c_thread_exited_p (SCM thread); SCM_API SCM scm_thread_exited_p (SCM thread); #ifdef BUILDING_LIBGUILE /* Though we don't need the key for SCM_I_CURRENT_THREAD if we have TLS, we do use it for cleanup purposes. */ SCM_INTERNAL scm_i_pthread_key_t scm_i_thread_key; # ifdef SCM_HAVE_THREAD_STORAGE_CLASS SCM_INTERNAL SCM_THREAD_LOCAL scm_thread *scm_i_current_thread; # define SCM_I_CURRENT_THREAD (scm_i_current_thread) # else /* !SCM_HAVE_THREAD_STORAGE_CLASS */ # define SCM_I_CURRENT_THREAD \ ((scm_thread *) scm_i_pthread_getspecific (scm_i_thread_key)) # endif /* !SCM_HAVE_THREAD_STORAGE_CLASS */ #endif /* BUILDING_LIBGUILE */ SCM_INTERNAL scm_i_pthread_mutex_t scm_i_misc_mutex; /* Convenience functions for working with the pthread API in guile mode. */ #if SCM_USE_PTHREAD_THREADS SCM_API int scm_pthread_mutex_lock (pthread_mutex_t *mutex); SCM_API void scm_dynwind_pthread_mutex_lock (pthread_mutex_t *mutex); SCM_API int scm_pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex); SCM_API int scm_pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex, const scm_t_timespec *abstime); #endif /* More convenience functions. */ SCM_API unsigned int scm_std_sleep (unsigned int); SCM_API unsigned long scm_std_usleep (unsigned long); SCM_API SCM scm_total_processor_count (void); SCM_API SCM scm_current_processor_count (void); #endif /* SCM_THREADS_H */