Fix brick table issue on Unix
authorJan Vorlicek <janvorli@microsoft.com>
Mon, 11 Apr 2016 11:42:07 +0000 (13:42 +0200)
committerJan Vorlicek <janvorli@microsoft.com>
Mon, 11 Apr 2016 11:42:07 +0000 (13:42 +0200)
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.

Commit migrated from https://github.com/dotnet/coreclr/commit/54e626fec535ce9eb1f97420c619572911eed583

src/coreclr/src/gc/gc.cpp

index d039947..3147a58 100644 (file)
@@ -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++)