Index: src/elements.cc |
diff --git a/src/elements.cc b/src/elements.cc |
index 3949747c62ebed39506e88b5699400534e35d7e7..8318d290f3603d4a81307fb38f66e7bcd41c2204 100644 |
--- a/src/elements.cc |
+++ b/src/elements.cc |
@@ -1003,11 +1003,15 @@ class FastElementsAccessor |
if (length == 0) { |
array->initialize_elements(); |
} else { |
- backing_store->set_length(length); |
+ int filler_size = (old_capacity - length) * ElementSize; |
Address filler_start = backing_store->address() + |
BackingStore::OffsetOfElementAt(length); |
- int filler_size = (old_capacity - length) * ElementSize; |
array->GetHeap()->CreateFillerObjectAt(filler_start, filler_size); |
+ |
+ // We are storing the new length using release store after creating a |
+ // filler for the left-over space to avoid races with the sweeper |
+ // thread. |
+ backing_store->synchronized_set_length(length); |
} |
} else { |
// Otherwise, fill the unused tail with holes. |