]> granicus.if.org Git - gc/commitdiff
Fix GC_get_stack_base if called before GC_init (Win32)
authorEli Barzilay <eli@racket-lang.org>
Tue, 7 Jul 2015 22:22:23 +0000 (01:22 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Mon, 1 Feb 2016 07:42:40 +0000 (10:42 +0300)
(Apply part of commit db2b9f1 from 'racket_gc' branch.)

* os_dep.c (GC_get_stack_base): Call GC_setpagesize if GC_page_size is
not initialized (only if MSWIN32 but not CYGWIN32).

os_dep.c

index 9128b16943ee9535df4e0793ee27a637fde7abae..b7adf5e6ba078ba7bf448e899ac7bafcfb8ed7c0 100644 (file)
--- a/os_dep.c
+++ b/os_dep.c
@@ -749,10 +749,17 @@ GC_INNER word GC_page_size = 0;
 
     GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *sb)
     {
-      ptr_t trunc_sp = (ptr_t)((word)GC_approx_sp() & ~(GC_page_size - 1));
+      ptr_t trunc_sp;
+      word size;
+
+      /* Set page size if it is not ready (so client can use this       */
+      /* function even before GC is initialized).                       */
+      if (!GC_page_size) GC_setpagesize();
+
+      trunc_sp = (ptr_t)((word)GC_approx_sp() & ~(GC_page_size - 1));
       /* FIXME: This won't work if called from a deeply recursive       */
       /* client code (and the committed stack space has grown).         */
-      word size = GC_get_writable_length(trunc_sp, 0);
+      size = GC_get_writable_length(trunc_sp, 0);
       GC_ASSERT(size != 0);
       sb -> mem_base = trunc_sp + size;
       return GC_SUCCESS;