PR target/42811 (prerequisite)

PR target/42811 (prerequisite)
	* include/private/gc_priv.h (struct roots) [CYGWIN32]: Don't
	declare r_next member on Cygwin as on other windows hosts.
	(LOG_RT_SIZE) [CYGWIN32]: Don't define likewise.
	(RT_SIZE) [CYGWIN32]: Likewise.
	(struct _GC_arrays) [CYGWIN32]: Do declare _heap_bases[] member
	likewise.
	(GC_heap_bases) [CYGWIN32]: Do define likewise.
	(struct _SYSTEM_INFO) [CYGWIN32]: Do forward-declare likewise.
	(GC_sysinfo) [CYGWIN32]: Do declare extern likewise.
	(GC_n_heap_bases) [CYGWIN32]: Likewise.
	(GC_is_tmp_root) [CYGWIN32]: Do prototype likewise.
	* include/private/gcconfig.h (GC_win32_get_mem) [CYGWIN32]: Likewise.
	(GET_MEM) [CYGWIN32]: Do define likewise.
	* boehm-gc/ptr_chck.c (GC_is_visible) [CYGWIN32]: Do handle dynamic
	registration likewise.
	* boehm-gc/os_dep.c (GC_setpagesize) [CYGWIN32]: Do define likewise.
	(GC_no_win32_dlls) [CYGWIN32]: Define as constant false, unlike
	other windows hosts.
	(GC_sysinfo) [CYGWIN32]: Define as on other windows hosts.
	(GC_n_heap_bases) [CYGWIN32]: Likewise.
	(GLOBAL_ALLOC_TEST) [CYGWIN32]: Likewise.
	(GC_win32_get_mem) [CYGWIN32]: Likewise, but wrapping GC_unix_get_mem
	rather than GlobalAlloc/VirtualAlloc.
	(GC_win32_free_heap) [CYGWIN32]: Likewise, but wrapping free instead
	of GlobalFree (even though the function body is optimised away).
	* boehm-gc/mark_rts.c (add_roots_to_index) [CYGWIN32]: Define as on
	other windows hosts.
	(GC_add_roots_inner) [CYGWIN32]: Avoid overlapping or adjacent
	intervals likewise.
	(GC_clear_roots) [CYGWIN32]: Clear GC_root_index[] likewise.
	(GC_rebuild_root_index) [CYGWIN32]: Define as on other windows hosts.
	(GC_remove_tmp_roots) [CYGWIN32]: Call it likewise.
	(GC_remove_roots) [CYGWIN32]: Don't define, as on other windows hosts.
	(GC_is_tmp_root) [CYGWIN32]: Define, as on other windows hosts.
	(GC_cond_register_dynamic_libraries) [CYGWIN32]: Handle temporary
	roots and dynamic registration likewise.
	* boehm-gc/dyn_load.c (GC_has_static_roots) [CYGWIN32]: Define as on
	other windows hosts.
	(GC_register_has_static_roots_callback) [CYGWIN32]: Likewise.
	(GC_cond_add_roots) [CYGWIN32]: Likewise.
	(GC_register_main_static_data) [CYGWIN32]: Define to always return
	false, as on MSWINCE
	(HAVE_REGISTER_MAIN_STATIC_DATA) [CYGWIN32]: Define as on other
	windows hosts.
	(GC_warn_fb) [CYGWIN32]: Likewise.
	(GC_disallow_ignore_fb) [CYGWIN32]: Likewise.
	(GC_ignore_fb_mb) [CYGWIN32]: Likewise.
	(GC_ignore_fb) [CYGWIN32]: Likewise.
	(is_frame_buffer) [CYGWIN32]: Likewise.
	(GC_dump_meminfo) [CYGWIN32]: Likewise.
	(GC_wnt) [CYGWIN32]: Define to constant true.
	(GC_register_dynamic_libraries) [CYGWIN32]: Define as on other
	windows hosts.

From-SVN: r157604
This commit is contained in:
Dave Korn 2010-03-21 19:34:19 +00:00 committed by Dave Korn
parent 242ba3086f
commit 045a52c82e
7 changed files with 112 additions and 36 deletions

View File

@ -1,3 +1,60 @@
2010-03-21 Dave Korn <dave.korn.cygwin@gmail.com>
PR target/42811 (prerequisite)
* include/private/gc_priv.h (struct roots) [CYGWIN32]: Don't
declare r_next member on Cygwin as on other windows hosts.
(LOG_RT_SIZE) [CYGWIN32]: Don't define likewise.
(RT_SIZE) [CYGWIN32]: Likewise.
(struct _GC_arrays) [CYGWIN32]: Do declare _heap_bases[] member
likewise.
(GC_heap_bases) [CYGWIN32]: Do define likewise.
(struct _SYSTEM_INFO) [CYGWIN32]: Do forward-declare likewise.
(GC_sysinfo) [CYGWIN32]: Do declare extern likewise.
(GC_n_heap_bases) [CYGWIN32]: Likewise.
(GC_is_tmp_root) [CYGWIN32]: Do prototype likewise.
* include/private/gcconfig.h (GC_win32_get_mem) [CYGWIN32]: Likewise.
(GET_MEM) [CYGWIN32]: Do define likewise.
* boehm-gc/ptr_chck.c (GC_is_visible) [CYGWIN32]: Do handle dynamic
registration likewise.
* boehm-gc/os_dep.c (GC_setpagesize) [CYGWIN32]: Do define likewise.
(GC_no_win32_dlls) [CYGWIN32]: Define as constant false, unlike
other windows hosts.
(GC_sysinfo) [CYGWIN32]: Define as on other windows hosts.
(GC_n_heap_bases) [CYGWIN32]: Likewise.
(GLOBAL_ALLOC_TEST) [CYGWIN32]: Likewise.
(GC_win32_get_mem) [CYGWIN32]: Likewise, but wrapping GC_unix_get_mem
rather than GlobalAlloc/VirtualAlloc.
(GC_win32_free_heap) [CYGWIN32]: Likewise, but wrapping free instead
of GlobalFree (even though the function body is optimised away).
* boehm-gc/mark_rts.c (add_roots_to_index) [CYGWIN32]: Define as on
other windows hosts.
(GC_add_roots_inner) [CYGWIN32]: Avoid overlapping or adjacent
intervals likewise.
(GC_clear_roots) [CYGWIN32]: Clear GC_root_index[] likewise.
(GC_rebuild_root_index) [CYGWIN32]: Define as on other windows hosts.
(GC_remove_tmp_roots) [CYGWIN32]: Call it likewise.
(GC_remove_roots) [CYGWIN32]: Don't define, as on other windows hosts.
(GC_is_tmp_root) [CYGWIN32]: Define, as on other windows hosts.
(GC_cond_register_dynamic_libraries) [CYGWIN32]: Handle temporary
roots and dynamic registration likewise.
* boehm-gc/dyn_load.c (GC_has_static_roots) [CYGWIN32]: Define as on
other windows hosts.
(GC_register_has_static_roots_callback) [CYGWIN32]: Likewise.
(GC_cond_add_roots) [CYGWIN32]: Likewise.
(GC_register_main_static_data) [CYGWIN32]: Define to always return
false, as on MSWINCE
(HAVE_REGISTER_MAIN_STATIC_DATA) [CYGWIN32]: Define as on other
windows hosts.
(GC_warn_fb) [CYGWIN32]: Likewise.
(GC_disallow_ignore_fb) [CYGWIN32]: Likewise.
(GC_ignore_fb_mb) [CYGWIN32]: Likewise.
(GC_ignore_fb) [CYGWIN32]: Likewise.
(is_frame_buffer) [CYGWIN32]: Likewise.
(GC_dump_meminfo) [CYGWIN32]: Likewise.
(GC_wnt) [CYGWIN32]: Define to constant true.
(GC_register_dynamic_libraries) [CYGWIN32]: Define as on other
windows hosts.
2009-12-09 Matthias Klose <doko@ubuntu.com> 2009-12-09 Matthias Klose <doko@ubuntu.com>
* include/private/gc_locks.h: For __ARM_EABI__ define * include/private/gc_locks.h: For __ARM_EABI__ define

View File

@ -49,10 +49,13 @@
# undef GC_must_restore_redefined_dlopen # undef GC_must_restore_redefined_dlopen
# endif # endif
#if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(MSWINCE)) \ #if (defined(DYNAMIC_LOADING) \
|| defined(MSWIN32) \
|| defined(MSWINCE) \
|| defined(CYGWIN32)) \
&& !defined(PCR) && !defined(PCR)
#if !defined(SUNOS4) && !defined(SUNOS5DL) && !defined(IRIX5) && \ #if !defined(SUNOS4) && !defined(SUNOS5DL) && !defined(IRIX5) && \
!defined(MSWIN32) && !defined(MSWINCE) && \ !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32) && \
!(defined(ALPHA) && defined(OSF1)) && \ !(defined(ALPHA) && defined(OSF1)) && \
!defined(HPUX) && !(defined(LINUX) && defined(__ELF__)) && \ !defined(HPUX) && !(defined(LINUX) && defined(__ELF__)) && \
!defined(RS6000) && !defined(SCO_ELF) && !defined(DGUX) && \ !defined(RS6000) && !defined(SCO_ELF) && !defined(DGUX) && \
@ -717,7 +720,7 @@ void GC_register_dynamic_libraries()
# endif /* USE_PROC || IRIX5 */ # endif /* USE_PROC || IRIX5 */
# if defined(MSWIN32) || defined(MSWINCE) # if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
# define WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN
# define NOSERVICE # define NOSERVICE
@ -761,7 +764,7 @@ void GC_register_dynamic_libraries()
} }
# endif # endif
# ifdef MSWINCE # if defined(MSWINCE) || defined(CYGWIN32)
/* Do we need to separately register the main static data segment? */ /* Do we need to separately register the main static data segment? */
GC_bool GC_register_main_static_data() GC_bool GC_register_main_static_data()
{ {
@ -868,8 +871,12 @@ void GC_register_dynamic_libraries()
} }
# endif /* DEBUG_VIRTUALQUERY */ # endif /* DEBUG_VIRTUALQUERY */
extern GC_bool GC_wnt; /* Is Windows NT derivative. */ # ifdef CYGWIN32
/* Defined and set in os_dep.c. */ # define GC_wnt (TRUE)
# else
extern GC_bool GC_wnt; /* Is Windows NT derivative. */
/* Defined and set in os_dep.c. */
# endif
void GC_register_dynamic_libraries() void GC_register_dynamic_libraries()
{ {
@ -934,7 +941,7 @@ void GC_register_dynamic_libraries()
GC_cond_add_roots(base, limit); GC_cond_add_roots(base, limit);
} }
#endif /* MSWIN32 || MSWINCE */ #endif /* MSWIN32 || MSWINCE || CYGWIN32 */
#if defined(ALPHA) && defined(OSF1) #if defined(ALPHA) && defined(OSF1)

View File

@ -833,14 +833,14 @@ struct exclusion {
struct roots { struct roots {
ptr_t r_start; ptr_t r_start;
ptr_t r_end; ptr_t r_end;
# if !defined(MSWIN32) && !defined(MSWINCE) # if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
struct roots * r_next; struct roots * r_next;
# endif # endif
GC_bool r_tmp; GC_bool r_tmp;
/* Delete before registering new dynamic libraries */ /* Delete before registering new dynamic libraries */
}; };
#if !defined(MSWIN32) && !defined(MSWINCE) #if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
/* Size of hash table index to roots. */ /* Size of hash table index to roots. */
# define LOG_RT_SIZE 6 # define LOG_RT_SIZE 6
# define RT_SIZE (1 << LOG_RT_SIZE) /* Power of 2, may be != MAX_ROOT_SETS */ # define RT_SIZE (1 << LOG_RT_SIZE) /* Power of 2, may be != MAX_ROOT_SETS */
@ -1024,7 +1024,7 @@ struct _GC_arrays {
struct HeapSect { struct HeapSect {
ptr_t hs_start; word hs_bytes; ptr_t hs_start; word hs_bytes;
} _heap_sects[MAX_HEAP_SECTS]; } _heap_sects[MAX_HEAP_SECTS];
# if defined(MSWIN32) || defined(MSWINCE) # if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
ptr_t _heap_bases[MAX_HEAP_SECTS]; ptr_t _heap_bases[MAX_HEAP_SECTS];
/* Start address of memory regions obtained from kernel. */ /* Start address of memory regions obtained from kernel. */
# endif # endif
@ -1033,7 +1033,7 @@ struct _GC_arrays {
/* Commited lengths of memory regions obtained from kernel. */ /* Commited lengths of memory regions obtained from kernel. */
# endif # endif
struct roots _static_roots[MAX_ROOT_SETS]; struct roots _static_roots[MAX_ROOT_SETS];
# if !defined(MSWIN32) && !defined(MSWINCE) # if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
struct roots * _root_index[RT_SIZE]; struct roots * _root_index[RT_SIZE];
# endif # endif
struct exclusion _excl_table[MAX_EXCLUSIONS]; struct exclusion _excl_table[MAX_EXCLUSIONS];
@ -1091,7 +1091,7 @@ GC_API GC_FAR struct _GC_arrays GC_arrays;
# ifdef USE_MUNMAP # ifdef USE_MUNMAP
# define GC_unmapped_bytes GC_arrays._unmapped_bytes # define GC_unmapped_bytes GC_arrays._unmapped_bytes
# endif # endif
# if defined(MSWIN32) || defined(MSWINCE) # if defined(MSWIN32) || defined(MSWINCE) || defined (CYGWIN32)
# define GC_heap_bases GC_arrays._heap_bases # define GC_heap_bases GC_arrays._heap_bases
# endif # endif
# ifdef MSWINCE # ifdef MSWINCE
@ -1187,7 +1187,7 @@ extern word GC_n_heap_sects; /* Number of separately added heap */
extern word GC_page_size; extern word GC_page_size;
# if defined(MSWIN32) || defined(MSWINCE) # if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
struct _SYSTEM_INFO; struct _SYSTEM_INFO;
extern struct _SYSTEM_INFO GC_sysinfo; extern struct _SYSTEM_INFO GC_sysinfo;
extern word GC_n_heap_bases; /* See GC_heap_bases. */ extern word GC_n_heap_bases; /* See GC_heap_bases. */
@ -1479,7 +1479,7 @@ void GC_remove_roots_inner GC_PROTO((char * b, char * e));
GC_bool GC_is_static_root GC_PROTO((ptr_t p)); GC_bool GC_is_static_root GC_PROTO((ptr_t p));
/* Is the address p in one of the registered static */ /* Is the address p in one of the registered static */
/* root sections? */ /* root sections? */
# if defined(MSWIN32) || defined(_WIN32_WCE_EMULATION) # if defined(MSWIN32) || defined(_WIN32_WCE_EMULATION) || defined(CYGWIN32)
GC_bool GC_is_tmp_root GC_PROTO((ptr_t p)); GC_bool GC_is_tmp_root GC_PROTO((ptr_t p));
/* Is the address p in one of the temporary static */ /* Is the address p in one of the temporary static */
/* root sections? */ /* root sections? */

View File

@ -2375,7 +2375,7 @@
calloc(1, (size_t)bytes + GC_page_size) \ calloc(1, (size_t)bytes + GC_page_size) \
+ GC_page_size-1) + GC_page_size-1)
# else # else
# ifdef MSWIN32 # if defined(MSWIN32) || defined(CYGWIN32)
extern ptr_t GC_win32_get_mem(); extern ptr_t GC_win32_get_mem();
# define GET_MEM(bytes) (struct hblk *)GC_win32_get_mem(bytes) # define GET_MEM(bytes) (struct hblk *)GC_win32_get_mem(bytes)
# else # else

View File

@ -22,7 +22,7 @@
struct roots { struct roots {
ptr_t r_start; ptr_t r_start;
ptr_t r_end; ptr_t r_end;
# if !defined(MSWIN32) && !defined(MSWINCE) # if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
struct roots * r_next; struct roots * r_next;
# endif # endif
GC_bool r_tmp; GC_bool r_tmp;
@ -87,7 +87,7 @@ ptr_t p;
return(FALSE); return(FALSE);
} }
#if !defined(MSWIN32) && !defined(MSWINCE) #if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
/* /*
# define LOG_RT_SIZE 6 # define LOG_RT_SIZE 6
# define RT_SIZE (1 << LOG_RT_SIZE) -- Power of 2, may be != MAX_ROOT_SETS # define RT_SIZE (1 << LOG_RT_SIZE) -- Power of 2, may be != MAX_ROOT_SETS
@ -139,7 +139,7 @@ struct roots *p;
GC_root_index[h] = p; GC_root_index[h] = p;
} }
# else /* MSWIN32 || MSWINCE */ # else /* MSWIN32 || MSWINCE || CYGWIN32 */
# define add_roots_to_index(p) # define add_roots_to_index(p)
@ -175,7 +175,7 @@ GC_bool tmp;
{ {
struct roots * old; struct roots * old;
# if defined(MSWIN32) || defined(MSWINCE) # if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
/* Spend the time to ensure that there are no overlapping */ /* Spend the time to ensure that there are no overlapping */
/* or adjacent intervals. */ /* or adjacent intervals. */
/* This could be done faster with e.g. a */ /* This could be done faster with e.g. a */
@ -244,7 +244,7 @@ GC_bool tmp;
GC_static_roots[n_root_sets].r_start = (ptr_t)b; GC_static_roots[n_root_sets].r_start = (ptr_t)b;
GC_static_roots[n_root_sets].r_end = (ptr_t)e; GC_static_roots[n_root_sets].r_end = (ptr_t)e;
GC_static_roots[n_root_sets].r_tmp = tmp; GC_static_roots[n_root_sets].r_tmp = tmp;
# if !defined(MSWIN32) && !defined(MSWINCE) # if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
GC_static_roots[n_root_sets].r_next = 0; GC_static_roots[n_root_sets].r_next = 0;
# endif # endif
add_roots_to_index(GC_static_roots + n_root_sets); add_roots_to_index(GC_static_roots + n_root_sets);
@ -263,7 +263,7 @@ void GC_clear_roots GC_PROTO((void))
roots_were_cleared = TRUE; roots_were_cleared = TRUE;
n_root_sets = 0; n_root_sets = 0;
GC_root_size = 0; GC_root_size = 0;
# if !defined(MSWIN32) && !defined(MSWINCE) # if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
{ {
register int i; register int i;
@ -285,7 +285,7 @@ int i;
n_root_sets--; n_root_sets--;
} }
#if !defined(MSWIN32) && !defined(MSWINCE) #if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
static void GC_rebuild_root_index() static void GC_rebuild_root_index()
{ {
register int i; register int i;
@ -308,12 +308,12 @@ void GC_remove_tmp_roots()
i++; i++;
} }
} }
#if !defined(MSWIN32) && !defined(MSWINCE) #if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
GC_rebuild_root_index(); GC_rebuild_root_index();
#endif #endif
} }
#if !defined(MSWIN32) && !defined(MSWINCE) #if !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32)
void GC_remove_roots(b, e) void GC_remove_roots(b, e)
char * b; char * e; char * b; char * e;
{ {
@ -340,9 +340,9 @@ char * b; char * e;
} }
GC_rebuild_root_index(); GC_rebuild_root_index();
} }
#endif /* !defined(MSWIN32) && !defined(MSWINCE) */ #endif /* !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32) */
#if defined(MSWIN32) || defined(_WIN32_WCE_EMULATION) #if defined(MSWIN32) || defined(_WIN32_WCE_EMULATION) || defined(CYGWIN32)
/* Workaround for the OS mapping and unmapping behind our back: */ /* Workaround for the OS mapping and unmapping behind our back: */
/* Is the address p in one of the temporary static root sections? */ /* Is the address p in one of the temporary static root sections? */
GC_bool GC_is_tmp_root(p) GC_bool GC_is_tmp_root(p)
@ -364,7 +364,7 @@ ptr_t p;
} }
return(FALSE); return(FALSE);
} }
#endif /* MSWIN32 || _WIN32_WCE_EMULATION */ #endif /* MSWIN32 || _WIN32_WCE_EMULATION || defined(CYGWIN32) */
ptr_t GC_approx_sp() ptr_t GC_approx_sp()
{ {
@ -557,7 +557,7 @@ void GC_push_gc_structures GC_PROTO((void))
void GC_cond_register_dynamic_libraries() void GC_cond_register_dynamic_libraries()
{ {
# if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(MSWINCE) \ # if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(MSWINCE) \
|| defined(PCR)) && !defined(SRC_M3) || defined(CYGWIN32) || defined(PCR)) && !defined(SRC_M3)
GC_remove_tmp_roots(); GC_remove_tmp_roots();
if (!GC_no_dls) GC_register_dynamic_libraries(); if (!GC_no_dls) GC_register_dynamic_libraries();
# else # else

View File

@ -107,7 +107,7 @@
# undef GC_AMIGA_DEF # undef GC_AMIGA_DEF
#endif #endif
#if defined(MSWIN32) || defined(MSWINCE) #if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
# define WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN
# define NOSERVICE # define NOSERVICE
# include <windows.h> # include <windows.h>
@ -584,7 +584,7 @@ void GC_enable_signals()
/* Find the page size */ /* Find the page size */
word GC_page_size; word GC_page_size;
# if defined(MSWIN32) || defined(MSWINCE) # if defined(MSWIN32) || defined(MSWINCE) || defined (CYGWIN32)
void GC_setpagesize() void GC_setpagesize()
{ {
GetSystemInfo(&GC_sysinfo); GetSystemInfo(&GC_sysinfo);
@ -1169,7 +1169,11 @@ void GC_register_data_segments()
# else /* !OS2 */ # else /* !OS2 */
# if defined(MSWIN32) || defined(MSWINCE) # if defined(MSWIN32) || defined(MSWINCE) || defined (CYGWIN32)
# ifdef CYGWIN32
# define GC_no_win32_dlls (FALSE)
# endif
# ifdef MSWIN32 # ifdef MSWIN32
/* Unfortunately, we have to handle win32s very differently from NT, */ /* Unfortunately, we have to handle win32s very differently from NT, */
@ -1664,11 +1668,13 @@ void * os2_alloc(size_t bytes)
# endif /* OS2 */ # endif /* OS2 */
# if defined(MSWIN32) || defined(MSWINCE) # if defined(MSWIN32) || defined(MSWINCE) || defined(CYGWIN32)
SYSTEM_INFO GC_sysinfo; SYSTEM_INFO GC_sysinfo;
# endif # endif
# ifdef MSWIN32 # if defined(MSWIN32) || defined(CYGWIN32)
word GC_n_heap_bases = 0;
# ifdef USE_GLOBAL_ALLOC # ifdef USE_GLOBAL_ALLOC
# define GLOBAL_ALLOC_TEST 1 # define GLOBAL_ALLOC_TEST 1
@ -1676,13 +1682,14 @@ SYSTEM_INFO GC_sysinfo;
# define GLOBAL_ALLOC_TEST GC_no_win32_dlls # define GLOBAL_ALLOC_TEST GC_no_win32_dlls
# endif # endif
word GC_n_heap_bases = 0;
ptr_t GC_win32_get_mem(bytes) ptr_t GC_win32_get_mem(bytes)
word bytes; word bytes;
{ {
ptr_t result; ptr_t result;
# ifdef CYGWIN32
result = GC_unix_get_mem (bytes);
# else
if (GLOBAL_ALLOC_TEST) { if (GLOBAL_ALLOC_TEST) {
/* VirtualAlloc doesn't like PAGE_EXECUTE_READWRITE. */ /* VirtualAlloc doesn't like PAGE_EXECUTE_READWRITE. */
/* There are also unconfirmed rumors of other */ /* There are also unconfirmed rumors of other */
@ -1702,6 +1709,7 @@ word bytes;
MEM_COMMIT | MEM_RESERVE, MEM_COMMIT | MEM_RESERVE,
PAGE_EXECUTE_READWRITE); PAGE_EXECUTE_READWRITE);
} }
#endif
if (HBLKDISPL(result) != 0) ABORT("Bad VirtualAlloc result"); if (HBLKDISPL(result) != 0) ABORT("Bad VirtualAlloc result");
/* If I read the documentation correctly, this can */ /* If I read the documentation correctly, this can */
/* only happen if HBLKSIZE > 64k or not a power of 2. */ /* only happen if HBLKSIZE > 64k or not a power of 2. */
@ -1714,7 +1722,11 @@ void GC_win32_free_heap ()
{ {
if (GC_no_win32_dlls) { if (GC_no_win32_dlls) {
while (GC_n_heap_bases > 0) { while (GC_n_heap_bases > 0) {
# ifdef CYGWIN32
free (GC_heap_bases[--GC_n_heap_bases]);
# else
GlobalFree (GC_heap_bases[--GC_n_heap_bases]); GlobalFree (GC_heap_bases[--GC_n_heap_bases]);
# endif
GC_heap_bases[GC_n_heap_bases] = 0; GC_heap_bases[GC_n_heap_bases] = 0;
} }
} }

View File

@ -247,7 +247,7 @@ ptr_t p;
if (GC_is_static_root(p)) return(p); if (GC_is_static_root(p)) return(p);
/* Else do it again correctly: */ /* Else do it again correctly: */
# if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || \ # if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || \
defined(MSWINCE) || defined(PCR)) \ defined(MSWINCE) || defined (CYGWIN32) || defined(PCR)) \
&& !defined(SRC_M3) && !defined(SRC_M3)
DISABLE_SIGNALS(); DISABLE_SIGNALS();
GC_register_dynamic_libraries(); GC_register_dynamic_libraries();