diff options
author | Ludovic Courtès <ludo@gnu.org> | 2009-10-02 15:28:29 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2009-10-09 14:10:03 +0200 |
commit | 46935a1fac58e50276f7e7e49e5fa6bab53c0848 (patch) | |
tree | 61a07bfd49251b8b0a7798c490f15f0beef4d552 | |
parent | b8ec9daba60ceb14b443d3a44ab5043edcb474df (diff) | |
download | guile-46935a1fac58e50276f7e7e49e5fa6bab53c0848.tar.gz |
Arrange so that `SCM_I_CURRENT_THREAD' is not accessed outside of libguile.
* libguile/__scm.h (scm_async_tick): New declaration.
(SCM_ASYNC_TICK)[!BUILDING_LIBGUILE]: Use `scm_async_tick ()'.
* libguile/async.c (scm_critical_section_start,
scm_critical_section_end, scm_async_tick): New functions.
* libguile/async.h (scm_i_critical_section_mutex): Made internal.
(scm_critical_section_start, scm_critical_section_end): New
declarations.
(SCM_CRITICAL_SECTION_START,
SCM_CRITICAL_SECTION_END)[!BUILDING_LIBGUILE]: Use the same-named
function (lower-case).
* libguile/stackchk.h (SCM_STACK_OVERFLOW_P): Conditionalize on
`BUILDING_LIBGUILE'.
* libguile/threads.h (SCM_I_CURRENT_THREAD, scm_i_dynwinds,
scm_i_set_dynwinds, scm_i_last_debug_frame,
scm_i_set_last_debug_frame): Conditionalize on `BUILDING_LIBGUILE'.
-rw-r--r-- | libguile/__scm.h | 23 | ||||
-rw-r--r-- | libguile/async.c | 23 | ||||
-rw-r--r-- | libguile/async.h | 34 | ||||
-rw-r--r-- | libguile/stackchk.h | 6 | ||||
-rw-r--r-- | libguile/threads.h | 19 |
5 files changed, 79 insertions, 26 deletions
diff --git a/libguile/__scm.h b/libguile/__scm.h index a1f3b342d..d16415454 100644 --- a/libguile/__scm.h +++ b/libguile/__scm.h @@ -492,11 +492,24 @@ typedef long SCM_STACKITEM; #define SCM_STACK_PTR(ptr) ((SCM_STACKITEM *) (void *) (ptr)) -#define SCM_ASYNC_TICK /*fixme* should change names */ \ -do { \ - if (SCM_I_CURRENT_THREAD->pending_asyncs) \ - scm_async_click (); \ -} while (0) +SCM_API void scm_async_tick (void); + +#ifdef BUILDING_LIBGUILE + +/* FIXME: should change names */ +# define SCM_ASYNC_TICK \ + do \ + { \ + if (SCM_I_CURRENT_THREAD->pending_asyncs) \ + scm_async_click (); \ + } \ + while (0) + +#else /* !BUILDING_LIBGUILE */ + +# define SCM_ASYNC_TICK (scm_async_tick ()) + +#endif /* !BUILDING_LIBGUILE */ /* Anthony Green writes: diff --git a/libguile/async.c b/libguile/async.c index 948aefa57..664264f3c 100644 --- a/libguile/async.c +++ b/libguile/async.c @@ -472,6 +472,29 @@ scm_dynwind_unblock_asyncs () scm_dynwind_unwind_handler (increase_block, t, SCM_F_WIND_EXPLICITLY); } + +/* These are function variants of the same-named macros (uppercase) for use + 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 +scm_critical_section_start (void) +{ + SCM_CRITICAL_SECTION_START; +} + +void +scm_critical_section_end (void) +{ + SCM_CRITICAL_SECTION_END; +} + +void +scm_async_tick (void) +{ + SCM_ASYNC_TICK; +} diff --git a/libguile/async.h b/libguile/async.h index f666437ed..ceb2b960b 100644 --- a/libguile/async.h +++ b/libguile/async.h @@ -57,22 +57,34 @@ void scm_dynwind_unblock_asyncs (void); */ /* Defined in threads.c. */ -extern scm_i_pthread_mutex_t scm_i_critical_section_mutex; +SCM_INTERNAL scm_i_pthread_mutex_t scm_i_critical_section_mutex; -#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++; \ +SCM_API void scm_critical_section_start (void); +SCM_API void scm_critical_section_end (void); + +#ifdef BUILDING_LIBGUILE + +# 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--; \ +# 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_click (); \ + scm_async_click (); \ } 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); #if (SCM_ENABLE_DEPRECATED == 1) diff --git a/libguile/stackchk.h b/libguile/stackchk.h index 6aa0fec18..ed149067b 100644 --- a/libguile/stackchk.h +++ b/libguile/stackchk.h @@ -3,7 +3,7 @@ #ifndef SCM_STACKCHK_H #define SCM_STACKCHK_H -/* Copyright (C) 1995,1996,1998,2000, 2003, 2006, 2008 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998,2000, 2003, 2006, 2008, 2009 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -34,7 +34,7 @@ */ #define SCM_STACK_CHECKING_P SCM_STACK_LIMIT -#ifdef STACK_CHECKING +#if defined BUILDING_LIBGUILE && defined STACK_CHECKING # if SCM_STACK_GROWS_UP # define SCM_STACK_OVERFLOW_P(s)\ (SCM_STACK_PTR (s) \ @@ -52,7 +52,7 @@ } #else # define SCM_CHECK_STACK /**/ -#endif /* STACK_CHECKING */ +#endif SCM_API int scm_stack_checking_enabled_p; diff --git a/libguile/threads.h b/libguile/threads.h index 842f0d9d0..f7908e4fb 100644 --- a/libguile/threads.h +++ b/libguile/threads.h @@ -3,7 +3,7 @@ #ifndef SCM_THREADS_H #define SCM_THREADS_H -/* Copyright (C) 1996,1997,1998,2000,2001, 2002, 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. +/* Copyright (C) 1996,1997,1998,2000,2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -192,15 +192,20 @@ SCM_API SCM scm_thread_exited_p (SCM thread); SCM_API void scm_dynwind_critical_section (SCM mutex); -#define SCM_I_CURRENT_THREAD \ +#ifdef BUILDING_LIBGUILE + +# define SCM_I_CURRENT_THREAD \ ((scm_i_thread *) scm_i_pthread_getspecific (scm_i_thread_key)) SCM_API scm_i_pthread_key_t scm_i_thread_key; -#define scm_i_dynwinds() (SCM_I_CURRENT_THREAD->dynwinds) -#define scm_i_set_dynwinds(w) (SCM_I_CURRENT_THREAD->dynwinds = (w)) -#define scm_i_last_debug_frame() (SCM_I_CURRENT_THREAD->last_debug_frame) -#define scm_i_set_last_debug_frame(f) \ - (SCM_I_CURRENT_THREAD->last_debug_frame = (f)) +# define scm_i_dynwinds() (SCM_I_CURRENT_THREAD->dynwinds) +# define scm_i_set_dynwinds(w) (SCM_I_CURRENT_THREAD->dynwinds = (w)) +# define scm_i_last_debug_frame() (SCM_I_CURRENT_THREAD->last_debug_frame) +# define scm_i_set_last_debug_frame(f) \ + (SCM_I_CURRENT_THREAD->last_debug_frame = (f)) + +#endif /* BUILDING_LIBGUILE */ + SCM_INTERNAL scm_i_pthread_mutex_t scm_i_misc_mutex; |