[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
6.21.5 Blocking in Guile Mode
Up to Guile version 1.8, a thread blocked in guile mode would prevent
the garbage collector from running. Thus threads had to explicitly
leave guile mode with scm_without_guile ()
before making a
potentially blocking call such as a mutex lock, a select ()
system call, etc. The following functions could be used to temporarily
leave guile mode or to perform some common blocking operations in a
supported way.
Starting from Guile 2.0, blocked threads no longer hinder garbage collection. Thus, the functions below are not needed anymore. They can still be used to inform the GC that a thread is about to block, giving it a (small) optimization opportunity for “stop the world” garbage collections, should they occur while the thread is blocked.
- C Function: void * scm_without_guile (void *(*func) (void *), void *data)
Leave guile mode, call func on data, enter guile mode and return the result of calling func.
While a thread has left guile mode, it must not call any libguile functions except
scm_with_guile
orscm_without_guile
and must not use any libguile macros. Also, local variables of typeSCM
that are allocated while not in guile mode are not protected from the garbage collector.When used from non-guile mode, calling
scm_without_guile
is still allowed: it simply calls func. In that way, you can leave guile mode without having to know whether the current thread is in guile mode or not.
- C Function: int scm_pthread_mutex_lock (pthread_mutex_t *mutex)
Like
pthread_mutex_lock
, but leaves guile mode while waiting for the mutex.
- C Function: int scm_pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex)
- C Function: int scm_pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex, struct timespec *abstime)
Like
pthread_cond_wait
andpthread_cond_timedwait
, but leaves guile mode while waiting for the condition variable.
- C Function: int scm_std_select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
Like
select
but leaves guile mode while waiting. Also, the delivery of a system async causes this function to be interrupted with error codeEINTR
.
- C Function: unsigned int scm_std_sleep (unsigned int seconds)
Like
sleep
, but leaves guile mode while sleeping. Also, the delivery of a system async causes this function to be interrupted.
- C Function: unsigned long scm_std_usleep (unsigned long usecs)
Like
usleep
, but leaves guile mode while sleeping. Also, the delivery of a system async causes this function to be interrupted.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated on April 20, 2013 using texi2html 5.0.