dyn_load.c: Renamed GC_win32s to GC_no_win32_dlls.

2002-03-12  Adam Megacz  <adam@xwt.org>

        * dyn_load.c: Renamed GC_win32s to GC_no_win32_dlls.
        * misc.c: Renamed GC_is_win32s() to GC_no_win32_dlls
        * os_dep.c: Renamed GC_win32s to GC_no_win32_dlls and
        statically initialized it to TRUE if compiling with GCC.
        * win32_threads.c (thread_start): We no longer use SEH if
        compiling with GCC.
        * mark.c (GC_mark_some): We no longer use SEH if
        compiling with GCC.

From-SVN: r50671
This commit is contained in:
Adam Megacz 2002-03-12 19:06:36 +00:00 committed by Adam Megacz
parent 089c8f9764
commit 916c46b5ab
6 changed files with 38 additions and 23 deletions

View File

@ -1,3 +1,14 @@
2002-03-12 Adam Megacz <adam@xwt.org>
* dyn_load.c: Renamed GC_win32s to GC_no_win32_dlls.
* misc.c: Renamed GC_is_win32s() to GC_no_win32_dlls
* os_dep.c: Renamed GC_win32s to GC_no_win32_dlls and
statically initialized it to TRUE if compiling with GCC.
* win32_threads.c (thread_start): We no longer use SEH if
compiling with GCC.
* mark.c (GC_mark_some): We no longer use SEH if
compiling with GCC.
2002-03-09 Bryce McKinlay <bryce@waitaki.otago.ac.nz> 2002-03-09 Bryce McKinlay <bryce@waitaki.otago.ac.nz>
* include/gc_priv.h: Define ALIGN_DOUBLE on 32 bit targets if GCJ * include/gc_priv.h: Define ALIGN_DOUBLE on 32 bit targets if GCJ

View File

@ -775,7 +775,7 @@ void GC_register_dynamic_libraries()
# endif # endif
# ifndef MSWINCE # ifndef MSWINCE
extern GC_bool GC_win32s; extern GC_bool GC_no_win32_dlls;
# endif # endif
void GC_register_dynamic_libraries() void GC_register_dynamic_libraries()
@ -788,7 +788,7 @@ void GC_register_dynamic_libraries()
char * limit, * new_limit; char * limit, * new_limit;
# ifdef MSWIN32 # ifdef MSWIN32
if (GC_win32s) return; if (GC_no_win32_dlls) return;
# endif # endif
base = limit = p = GC_sysinfo.lpMinimumApplicationAddress; base = limit = p = GC_sysinfo.lpMinimumApplicationAddress;
# if defined(MSWINCE) && !defined(_WIN32_WCE_EMULATION) # if defined(MSWINCE) && !defined(_WIN32_WCE_EMULATION)

View File

@ -264,7 +264,7 @@ static void alloc_mark_stack();
GC_bool GC_mark_some(cold_gc_frame) GC_bool GC_mark_some(cold_gc_frame)
ptr_t cold_gc_frame; ptr_t cold_gc_frame;
{ {
#ifdef MSWIN32 #if defined(MSWIN32) && !defined(__GNUC__)
/* Windows 98 appears to asynchronously create and remove writable */ /* Windows 98 appears to asynchronously create and remove writable */
/* memory mappings, for reasons we haven't yet understood. Since */ /* memory mappings, for reasons we haven't yet understood. Since */
/* we look for writable regions to determine the root set, we may */ /* we look for writable regions to determine the root set, we may */
@ -274,7 +274,7 @@ ptr_t cold_gc_frame;
/* Note that this code should never generate an incremental GC write */ /* Note that this code should never generate an incremental GC write */
/* fault. */ /* fault. */
__try { __try {
#endif #endif /* defined(MSWIN32) && !defined(__GNUC__) */
switch(GC_mark_state) { switch(GC_mark_state) {
case MS_NONE: case MS_NONE:
return(FALSE); return(FALSE);
@ -395,7 +395,7 @@ ptr_t cold_gc_frame;
ABORT("GC_mark_some: bad state"); ABORT("GC_mark_some: bad state");
return(FALSE); return(FALSE);
} }
#ifdef MSWIN32 #if defined(MSWIN32) && !defined(__GNUC__)
} __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? } __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
# ifdef CONDPRINT # ifdef CONDPRINT
@ -410,7 +410,7 @@ ptr_t cold_gc_frame;
scan_ptr = 0; scan_ptr = 0;
return FALSE; return FALSE;
} }
#endif /* MSWIN32 */ #endif /* defined(MSWIN32) && !defined(__GNUC__) */
} }

View File

@ -483,9 +483,9 @@ int sig;
#endif #endif
#ifdef MSWIN32 #ifdef MSWIN32
extern GC_bool GC_is_win32s(); extern GC_bool GC_no_win32_dlls;
#else #else
# define GC_is_win32s() FALSE # define GC_no_win32_dlls FALSE
#endif #endif
void GC_init_inner() void GC_init_inner()
@ -637,7 +637,7 @@ void GC_init_inner()
GC_pcr_install(); GC_pcr_install();
# endif # endif
# if !defined(SMALL_CONFIG) # if !defined(SMALL_CONFIG)
if (!GC_is_win32s() && 0 != GETENV("GC_ENABLE_INCREMENTAL")) { if (!GC_no_win32_dlls && 0 != GETENV("GC_ENABLE_INCREMENTAL")) {
GC_ASSERT(!GC_incremental); GC_ASSERT(!GC_incremental);
GC_setpagesize(); GC_setpagesize();
# ifndef GC_SOLARIS_THREADS # ifndef GC_SOLARIS_THREADS
@ -681,7 +681,7 @@ void GC_enable_incremental GC_PROTO(())
LOCK(); LOCK();
if (GC_incremental) goto out; if (GC_incremental) goto out;
GC_setpagesize(); GC_setpagesize();
if (GC_is_win32s()) goto out; if (GC_no_win32_dlls) goto out;
# ifndef GC_SOLARIS_THREADS # ifndef GC_SOLARIS_THREADS
GC_dirty_init(); GC_dirty_init();
# endif # endif

View File

@ -928,19 +928,17 @@ void GC_register_data_segments()
/* all real work is done by GC_register_dynamic_libraries. Under */ /* all real work is done by GC_register_dynamic_libraries. Under */
/* win32s, we cannot find the data segments associated with dll's. */ /* win32s, we cannot find the data segments associated with dll's. */
/* We rgister the main data segment here. */ /* We rgister the main data segment here. */
GC_bool GC_win32s = FALSE; /* We're running under win32s. */ # ifdef __GCC__
GC_bool GC_no_win32_dlls = TRUE; /* GCC can't do SEH, so we can't use VirtualQuery */
GC_bool GC_is_win32s() # else
{ GC_bool GC_no_win32_dlls = FALSE;
DWORD v = GetVersion(); # endif
/* Check that this is not NT, and Windows major version <= 3 */
return ((v & 0x80000000) && (v & 0xff) <= 3);
}
void GC_init_win32() void GC_init_win32()
{ {
GC_win32s = GC_is_win32s(); /* if we're running under win32s, assume that no DLLs will be loaded */
DWORD v = GetVersion();
GC_no_win32_dlls |= ((v & 0x80000000) && (v & 0xff) <= 3);
} }
/* Return the smallest address a such that VirtualQuery */ /* Return the smallest address a such that VirtualQuery */
@ -1008,7 +1006,7 @@ void GC_register_data_segments()
char * base; char * base;
char * limit, * new_limit; char * limit, * new_limit;
if (!GC_win32s) return; if (!GC_no_win32_dlls) return;
p = base = limit = GC_least_described_address(static_root); p = base = limit = GC_least_described_address(static_root);
while (p < GC_sysinfo.lpMaximumApplicationAddress) { while (p < GC_sysinfo.lpMaximumApplicationAddress) {
result = VirtualQuery(p, &buf, sizeof(buf)); result = VirtualQuery(p, &buf, sizeof(buf));
@ -1307,7 +1305,7 @@ SYSTEM_INFO GC_sysinfo;
# ifdef USE_GLOBAL_ALLOC # ifdef USE_GLOBAL_ALLOC
# define GLOBAL_ALLOC_TEST 1 # define GLOBAL_ALLOC_TEST 1
# else # else
# define GLOBAL_ALLOC_TEST GC_win32s # define GLOBAL_ALLOC_TEST GC_no_win32_dlls
# endif # endif
word GC_n_heap_bases = 0; word GC_n_heap_bases = 0;
@ -1338,7 +1336,7 @@ word bytes;
void GC_win32_free_heap () void GC_win32_free_heap ()
{ {
if (GC_win32s) { if (GC_no_win32_dlls) {
while (GC_n_heap_bases > 0) { while (GC_n_heap_bases > 0) {
GlobalFree (GC_heap_bases[--GC_n_heap_bases]); GlobalFree (GC_heap_bases[--GC_n_heap_bases]);
GC_heap_bases[GC_n_heap_bases] = 0; GC_heap_bases[GC_n_heap_bases] = 0;

View File

@ -447,16 +447,22 @@ static DWORD WINAPI thread_start(LPVOID arg)
/* Clear the thread entry even if we exit with an exception. */ /* Clear the thread entry even if we exit with an exception. */
/* This is probably pointless, since an uncaught exception is */ /* This is probably pointless, since an uncaught exception is */
/* supposed to result in the process being killed. */ /* supposed to result in the process being killed. */
#ifndef __GNUC__
__try { __try {
#endif /* __GNUC__ */
ret = args.start (args.param); ret = args.start (args.param);
#ifndef __GNUC__
} __finally { } __finally {
#endif /* __GNUC__ */
LOCK(); LOCK();
args.entry->stack = 0; args.entry->stack = 0;
args.entry->in_use = FALSE; args.entry->in_use = FALSE;
/* cast away volatile qualifier */ /* cast away volatile qualifier */
BZERO((void *) &args.entry->context, sizeof(CONTEXT)); BZERO((void *) &args.entry->context, sizeof(CONTEXT));
UNLOCK(); UNLOCK();
#ifndef __GNUC__
} }
#endif /* __GNUC__ */
return ret; return ret;
} }