summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2009-10-02 15:28:29 +0200
committerLudovic Courtès <ludo@gnu.org>2009-10-09 14:10:03 +0200
commit46935a1fac58e50276f7e7e49e5fa6bab53c0848 (patch)
tree61a07bfd49251b8b0a7798c490f15f0beef4d552
parentb8ec9daba60ceb14b443d3a44ab5043edcb474df (diff)
downloadguile-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.h23
-rw-r--r--libguile/async.c23
-rw-r--r--libguile/async.h34
-rw-r--r--libguile/stackchk.h6
-rw-r--r--libguile/threads.h19
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;