]> granicus.if.org Git - gc/commitdiff
Fix GC_clear_stack by declaring 'dummy' local array as volatile
authorIvan Maidanski <ivmai@mail.ru>
Tue, 23 Oct 2012 03:45:51 +0000 (07:45 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Wed, 24 Oct 2012 11:15:00 +0000 (15:15 +0400)
* misc.c (GC_clear_stack): Declare "dummy" local array as volatile to
prevent optimizing it out by compiler; add cast of "dummy" to void*
(to un-volatile the pointer) in BZERO call (only if THREADS).

misc.c

diff --git a/misc.c b/misc.c
index e3c4d1af2bfa55405d0b4a729696c90a5c4f4ad2..207d4518556530b3d1323463481671a2c6741583 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -305,7 +305,7 @@ GC_API void * GC_CALL GC_clear_stack(void *arg)
 {
     ptr_t sp = GC_approx_sp();  /* Hotter than actual sp */
 #   ifdef THREADS
-        word dummy[SMALL_CLEAR_SIZE];
+        word volatile dummy[SMALL_CLEAR_SIZE];
         static unsigned random_no = 0;
                                  /* Should be more random than it is ... */
                                  /* Used to occasionally clear a bigger  */
@@ -337,7 +337,7 @@ GC_API void * GC_CALL GC_clear_stack(void *arg)
                         /* implementations of GC_clear_stack_inner.     */
         return GC_clear_stack_inner(arg, limit);
     } else {
-        BZERO(dummy, SMALL_CLEAR_SIZE*sizeof(word));
+        BZERO((void *)dummy, SMALL_CLEAR_SIZE*sizeof(word));
         return arg;
     }
 # else