summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Jerram <neil@ossau.uklinux.net>2009-06-29 20:37:02 +0100
committerNeil Jerram <neil@ossau.uklinux.net>2009-06-29 21:15:12 +0100
commit9d9a58e1841386b14bf0b03bf4bffc2e50181edb (patch)
tree4e4d077c60ac6be19b0ef85f4907629295acffb3
parent954d46413fbc6e7c6be0bab5fab8de0e4abb4e17 (diff)
downloadguile-9d9a58e1841386b14bf0b03bf4bffc2e50181edb.tar.gz
For MinGW hide exported struct variables behind pointers
MinGW apparently can't export/import struct variables from/to a DLL, so wrap the ones needed by inline.h in exported/imported pointer variables. All of the following changes apply to a MinGW build only. * libguile/gc-freelist.c (scm_i_master_freelist_ptr, scm_i_master_freelist2_ptr): New API variables. * libguile/gc.h (scm_i_freelist_ptr, scm_i_freelist2_ptr, scm_i_master_freelist_ptr, scm_i_master_freelist2_ptr): New global variable declarations. * libguile/inline.h (scm_cell): Use scm_i_freelist_ptr and scm_i_master_freelist_ptr instead of scm_i_freelist and scm_i_master_freelist. (scm_double_cell): Use scm_i_freelist2_ptr and scm_i_master_freelist2_ptr instead of scm_i_freelist2 and scm_i_master_freelist2. * libguile/threads.c (scm_i_freelist_ptr, scm_i_freelist2_ptr): New global variables.
-rw-r--r--libguile/gc-freelist.c5
-rw-r--r--libguile/gc.h7
-rw-r--r--libguile/inline.h16
-rw-r--r--libguile/threads.c4
4 files changed, 30 insertions, 2 deletions
diff --git a/libguile/gc-freelist.c b/libguile/gc-freelist.c
index c8824dfb9..ca8a96251 100644
--- a/libguile/gc-freelist.c
+++ b/libguile/gc-freelist.c
@@ -29,7 +29,10 @@
scm_t_cell_type_statistics scm_i_master_freelist;
scm_t_cell_type_statistics scm_i_master_freelist2;
-
+#ifdef __MINGW32__
+scm_t_cell_type_statistics *scm_i_master_freelist_ptr = &scm_i_master_freelist;
+scm_t_cell_type_statistics *scm_i_master_freelist2_ptr = &scm_i_master_freelist2;
+#endif
diff --git a/libguile/gc.h b/libguile/gc.h
index 3cedeb4eb..72af104d3 100644
--- a/libguile/gc.h
+++ b/libguile/gc.h
@@ -276,7 +276,12 @@ SCM_API scm_i_pthread_key_t scm_i_freelist;
SCM_API scm_i_pthread_key_t scm_i_freelist2;
SCM_API struct scm_t_cell_type_statistics scm_i_master_freelist;
SCM_API struct scm_t_cell_type_statistics scm_i_master_freelist2;
-
+#ifdef __MINGW32__
+SCM_API scm_i_pthread_key_t *scm_i_freelist_ptr;
+SCM_API scm_i_pthread_key_t *scm_i_freelist2_ptr;
+SCM_API struct scm_t_cell_type_statistics *scm_i_master_freelist_ptr;
+SCM_API struct scm_t_cell_type_statistics *scm_i_master_freelist2_ptr;
+#endif
SCM_API unsigned long scm_gc_cells_swept;
SCM_API unsigned long scm_gc_cells_collected;
diff --git a/libguile/inline.h b/libguile/inline.h
index eae1e22aa..2069c7e20 100644
--- a/libguile/inline.h
+++ b/libguile/inline.h
@@ -109,10 +109,18 @@ SCM
scm_cell (scm_t_bits car, scm_t_bits cdr)
{
SCM z;
+#ifdef __MINGW32__
+ SCM *freelist = SCM_FREELIST_LOC (*scm_i_freelist_ptr);
+#else
SCM *freelist = SCM_FREELIST_LOC (scm_i_freelist);
+#endif
if (scm_is_null (*freelist))
+#ifdef __MINGW32__
+ z = scm_gc_for_newcell (scm_i_master_freelist_ptr, freelist);
+#else
z = scm_gc_for_newcell (&scm_i_master_freelist, freelist);
+#endif
else
{
z = *freelist;
@@ -180,10 +188,18 @@ scm_double_cell (scm_t_bits car, scm_t_bits cbr,
scm_t_bits ccr, scm_t_bits cdr)
{
SCM z;
+#ifdef __MINGW32__
+ SCM *freelist = SCM_FREELIST_LOC (*scm_i_freelist2_ptr);
+#else
SCM *freelist = SCM_FREELIST_LOC (scm_i_freelist2);
+#endif
if (scm_is_null (*freelist))
+#ifdef __MINGW32__
+ z = scm_gc_for_newcell (scm_i_master_freelist2_ptr, freelist);
+#else
z = scm_gc_for_newcell (&scm_i_master_freelist2, freelist);
+#endif
else
{
z = *freelist;
diff --git a/libguile/threads.c b/libguile/threads.c
index 3d6df11eb..95a905c17 100644
--- a/libguile/threads.c
+++ b/libguile/threads.c
@@ -1680,6 +1680,10 @@ scm_dynwind_critical_section (SCM mutex)
/*** Initialization */
scm_i_pthread_key_t scm_i_freelist, scm_i_freelist2;
+#ifdef __MINGW32__
+scm_i_pthread_key_t *scm_i_freelist_ptr = &scm_i_freelist;
+scm_i_pthread_key_t *scm_i_freelist2_ptr = &scm_i_freelist2;
+#endif
scm_i_pthread_mutex_t scm_i_misc_mutex;
#if SCM_USE_PTHREAD_THREADS