From 40fc9de7a47141c372e3b55fa9fd4e905b2bfe6b Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Thu, 14 Apr 2016 23:33:15 +0200 Subject: [PATCH] Fix brick table issue on Unix There is a problem with Clang compiling a loop that sets a range of brick table entries that are "shorts" as a memset. That causes it to be written by bytes in some cases on OSX (and it is a mere chance that the memset on Linux is implemented so that it doesn't use byte access). This was causing corruption of the brick table on OSX. The fix is to mark the pointer that iterates over the brick table as volatile to prevent the compiler from using the memset. --- src/gc/gc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gc/gc.cpp b/src/gc/gc.cpp index d039947518fd..3147a580726a 100644 --- a/src/gc/gc.cpp +++ b/src/gc/gc.cpp @@ -11177,7 +11177,7 @@ void gc_heap::adjust_limit_clr (uint8_t* start, size_t limit_size, b++; dprintf (3, ("Allocation Clearing bricks [%Ix, %Ix[", b, brick_of (align_on_brick (start + limit_size)))); - short* x = &brick_table [b]; + volatile short* x = &brick_table [b]; short* end_x = &brick_table [brick_of (align_on_brick (start + limit_size))]; for (;x < end_x;x++)