* xbuild/Microsoft.Common.targets (PostBuildEvent): If
[mono.git] / libgc / misc.c
index 5b10feeb961faa9badb793eae3b4659ed24cab5c..22fc564c89518bc08b2d1f19b695beac1c048e14 100644 (file)
@@ -81,6 +81,8 @@
 /* dyn_load.c isn't linked in.                                         */
 #ifdef DYNAMIC_LOADING
 # define GC_REGISTER_MAIN_STATIC_DATA() GC_register_main_static_data()
+#elif defined(GC_DONT_REGISTER_MAIN_STATIC_DATA)
+# define GC_REGISTER_MAIN_STATIC_DATA() FALSE
 #else
 # define GC_REGISTER_MAIN_STATIC_DATA() TRUE
 #endif
@@ -246,7 +248,7 @@ void *arg2;
        byte_sz = WORDS_TO_BYTES(word_sz);
        if (GC_all_interior_pointers) {
            /* We need one extra byte; don't fill in GC_size_map[byte_sz] */
-           byte_sz--;
+           byte_sz -= EXTRA_BYTES;
        }
 
        for (j = low_limit; j <= byte_sz; j++) GC_size_map[j] = word_sz;  
@@ -466,6 +468,15 @@ size_t GC_get_total_bytes GC_PROTO(())
     return ((size_t) WORDS_TO_BYTES(GC_words_allocd+GC_words_allocd_before_gc));
 }
 
+int GC_get_suspend_signal GC_PROTO(())
+{
+#if defined(SIG_SUSPEND) && defined(GC_PTHREADS) && !defined(GC_MACOSX_THREADS)
+       return SIG_SUSPEND;
+#else
+       return -1;
+#endif
+}
+
 GC_bool GC_is_initialized = FALSE;
 
 void GC_init()
@@ -477,9 +488,9 @@ void GC_init()
 #if defined(GC_WIN32_THREADS) && !defined(GC_PTHREADS)
     if (!GC_is_initialized) {
       BOOL (WINAPI *pfn) (LPCRITICAL_SECTION, DWORD) = NULL;
-      HMODULE hK32 = GetModuleHandle("kernel32.dll");
+      HMODULE hK32 = GetModuleHandle(_T("kernel32.dll"));
       if (hK32)
-          (FARPROC) pfn = GetProcAddress(hK32,
+          pfn = GetProcAddress(hK32,
                          "InitializeCriticalSectionAndSpinCount");
       if (pfn)
           pfn(&GC_allocate_ml, 4000);
@@ -804,7 +815,10 @@ void GC_init_inner()
 
 void GC_enable_incremental GC_PROTO(())
 {
-# if !defined(SMALL_CONFIG)
+# if !defined(SMALL_CONFIG) && !defined(KEEP_BACK_PTRS)
+  /* If we are keeping back pointers, the GC itself dirties all        */
+  /* pages on which objects have been marked, making           */
+  /* incremental GC pointless.                                 */
   if (!GC_find_leak) {
     DCL_LOCK_STATE;