1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-02 21:10:27 +02:00

Simplify critical section implementation

* libguile/async.h (SCM_CRITICAL_SECTION_START)
  (SCM_CRITICAL_SECTION_END): Define in just one way.
* libguile/async.c (critical_section_mutex): New static variable.
  (scm_critical_section_start, scm_critical_section_end): Inline
  internal body of critical section gates.
  (scm_init_async): Init critical_section_mutex.
* libguile/threads.c (scm_threads_prehistory): Don't declare critical
  section mutex here.
This commit is contained in:
Andy Wingo 2016-11-01 22:48:19 +01:00
parent c88d0cc402
commit b410667e64
3 changed files with 12 additions and 42 deletions

View file

@ -299,21 +299,23 @@ scm_c_call_with_unblocked_asyncs (void *(*proc) (void *data), void *data)
} }
/* These are function variants of the same-named macros (uppercase) for use static scm_i_pthread_mutex_t critical_section_mutex;
outside of libguile. This is so that `SCM_I_CURRENT_THREAD', which may
reside in TLS, is not accessed from outside of libguile. It thus allows
libguile to be built with the "local-dynamic" TLS model. */
void void
scm_critical_section_start (void) scm_critical_section_start (void)
{ {
SCM_CRITICAL_SECTION_START; scm_i_pthread_mutex_lock (&critical_section_mutex);
SCM_I_CURRENT_THREAD->block_asyncs++;
SCM_I_CURRENT_THREAD->critical_section_level++;
} }
void void
scm_critical_section_end (void) scm_critical_section_end (void)
{ {
SCM_CRITICAL_SECTION_END; SCM_I_CURRENT_THREAD->critical_section_level--;
SCM_I_CURRENT_THREAD->block_asyncs--;
scm_i_pthread_mutex_unlock (&critical_section_mutex);
scm_async_tick ();
} }
@ -321,6 +323,8 @@ scm_critical_section_end (void)
void void
scm_init_async () scm_init_async ()
{ {
scm_i_pthread_mutex_init (&critical_section_mutex,
scm_i_pthread_mutexattr_recursive);
#include "libguile/async.x" #include "libguile/async.x"
} }

View file

@ -48,39 +48,11 @@ SCM_API void scm_dynwind_unblock_asyncs (void);
/* Critical sections */ /* Critical sections */
/* XXX - every critical section needs to be examined whether the
requirements for SCM_CRITICAL_SECTION_START/END are fulfilled. See
the manual.
*/
/* Defined in threads.c. */
SCM_INTERNAL scm_i_pthread_mutex_t scm_i_critical_section_mutex;
SCM_API void scm_critical_section_start (void); SCM_API void scm_critical_section_start (void);
SCM_API void scm_critical_section_end (void); SCM_API void scm_critical_section_end (void);
#ifdef BUILDING_LIBGUILE #define SCM_CRITICAL_SECTION_START scm_critical_section_start ()
#define SCM_CRITICAL_SECTION_END scm_critical_section_end ()
# define SCM_CRITICAL_SECTION_START \
do { \
scm_i_pthread_mutex_lock (&scm_i_critical_section_mutex); \
SCM_I_CURRENT_THREAD->block_asyncs++; \
SCM_I_CURRENT_THREAD->critical_section_level++; \
} while (0)
# define SCM_CRITICAL_SECTION_END \
do { \
SCM_I_CURRENT_THREAD->critical_section_level--; \
SCM_I_CURRENT_THREAD->block_asyncs--; \
scm_i_pthread_mutex_unlock (&scm_i_critical_section_mutex); \
scm_async_tick (); \
} while (0)
#else /* !BUILDING_LIBGUILE */
# define SCM_CRITICAL_SECTION_START scm_critical_section_start ()
# define SCM_CRITICAL_SECTION_END scm_critical_section_end ()
#endif /* !BUILDING_LIBGUILE */
SCM_INTERNAL void scm_init_async (void); SCM_INTERNAL void scm_init_async (void);

View file

@ -1939,10 +1939,6 @@ static scm_i_pthread_cond_t wake_up_cond;
static int threads_initialized_p = 0; static int threads_initialized_p = 0;
/* This mutex is used by SCM_CRITICAL_SECTION_START/END.
*/
scm_i_pthread_mutex_t scm_i_critical_section_mutex;
static SCM dynwind_critical_section_mutex; static SCM dynwind_critical_section_mutex;
void void
@ -1971,8 +1967,6 @@ scm_threads_prehistory (void *base)
PTHREAD_MUTEX_RECURSIVE); PTHREAD_MUTEX_RECURSIVE);
#endif #endif
scm_i_pthread_mutex_init (&scm_i_critical_section_mutex,
scm_i_pthread_mutexattr_recursive);
scm_i_pthread_mutex_init (&scm_i_misc_mutex, NULL); scm_i_pthread_mutex_init (&scm_i_misc_mutex, NULL);
scm_i_pthread_cond_init (&wake_up_cond, NULL); scm_i_pthread_cond_init (&wake_up_cond, NULL);