From 9d9a58e1841386b14bf0b03bf4bffc2e50181edb Mon Sep 17 00:00:00 2001 From: Neil Jerram Date: Mon, 29 Jun 2009 20:37:02 +0100 Subject: [PATCH] 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. --- libguile/gc-freelist.c | 5 ++++- libguile/gc.h | 7 ++++++- libguile/inline.h | 16 ++++++++++++++++ libguile/threads.c | 4 ++++ 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