OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 { | 247 { |
248 ASSERT(getThreadState()->isInGC()); | 248 ASSERT(getThreadState()->isInGC()); |
249 ASSERT(!m_firstUnsweptPage); | 249 ASSERT(!m_firstUnsweptPage); |
250 | 250 |
251 // Move all pages to a list of unswept pages. | 251 // Move all pages to a list of unswept pages. |
252 m_firstUnsweptPage = m_firstPage; | 252 m_firstUnsweptPage = m_firstPage; |
253 m_firstPage = nullptr; | 253 m_firstPage = nullptr; |
254 } | 254 } |
255 | 255 |
256 #if defined(ADDRESS_SANITIZER) | 256 #if defined(ADDRESS_SANITIZER) |
257 void BaseArena::poisonArena(BlinkGC::ObjectsToPoison objectsToPoison, BlinkGC::P
oisoning poisoning) | 257 void BaseArena::poisonArena() |
258 { | 258 { |
259 // TODO(sof): support complete poisoning of all arenas. | 259 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) |
260 ASSERT(objectsToPoison != BlinkGC::MarkedAndUnmarked || arenaIndex() == Blin
kGC::EagerSweepArenaIndex); | 260 page->poisonUnmarkedObjects(); |
261 | |
262 // This method may either be called to poison (SetPoison) heap | |
263 // object payloads prior to sweeping, or it may be called at | |
264 // the completion of a sweep to unpoison (ClearPoison) the | |
265 // objects remaining in the heap. Those will all be live and unmarked. | |
266 // | |
267 // Poisoning may be limited to unmarked objects only, or apply to all. | |
268 if (poisoning == BlinkGC::SetPoison) { | |
269 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) | |
270 page->poisonObjects(objectsToPoison, poisoning); | |
271 return; | |
272 } | |
273 // Support clearing of poisoning after sweeping has completed, | |
274 // in which case the pages of the live objects are reachable | |
275 // via m_firstPage. | |
276 ASSERT(!m_firstUnsweptPage); | |
277 for (BasePage* page = m_firstPage; page; page = page->next()) | |
278 page->poisonObjects(objectsToPoison, poisoning); | |
279 } | 261 } |
280 #endif | 262 #endif |
281 | 263 |
282 Address BaseArena::lazySweep(size_t allocationSize, size_t gcInfoIndex) | 264 Address BaseArena::lazySweep(size_t allocationSize, size_t gcInfoIndex) |
283 { | 265 { |
284 // If there are no pages to be swept, return immediately. | 266 // If there are no pages to be swept, return immediately. |
285 if (!m_firstUnsweptPage) | 267 if (!m_firstUnsweptPage) |
286 return nullptr; | 268 return nullptr; |
287 | 269 |
288 RELEASE_ASSERT(getThreadState()->isSweepingInProgress()); | 270 RELEASE_ASSERT(getThreadState()->isSweepingInProgress()); |
(...skipping 943 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1232 header->unmark(); | 1214 header->unmark(); |
1233 headerAddress += size; | 1215 headerAddress += size; |
1234 startOfGap = headerAddress; | 1216 startOfGap = headerAddress; |
1235 ASSERT(headerAddress <= payloadEnd()); | 1217 ASSERT(headerAddress <= payloadEnd()); |
1236 } | 1218 } |
1237 if (startOfGap != payloadEnd()) | 1219 if (startOfGap != payloadEnd()) |
1238 arenaForNormalPage()->addToFreeList(startOfGap, payloadEnd() - startOfGa
p); | 1220 arenaForNormalPage()->addToFreeList(startOfGap, payloadEnd() - startOfGa
p); |
1239 } | 1221 } |
1240 | 1222 |
1241 #if defined(ADDRESS_SANITIZER) | 1223 #if defined(ADDRESS_SANITIZER) |
1242 void NormalPage::poisonObjects(BlinkGC::ObjectsToPoison objectsToPoison, BlinkGC
::Poisoning poisoning) | 1224 void NormalPage::poisonUnmarkedObjects() |
1243 { | 1225 { |
1244 for (Address headerAddress = payload(); headerAddress < payloadEnd();) { | 1226 for (Address headerAddress = payload(); headerAddress < payloadEnd();) { |
1245 HeapObjectHeader* header = reinterpret_cast<HeapObjectHeader*>(headerAdd
ress); | 1227 HeapObjectHeader* header = reinterpret_cast<HeapObjectHeader*>(headerAdd
ress); |
1246 ASSERT(header->size() < blinkPagePayloadSize()); | 1228 ASSERT(header->size() < blinkPagePayloadSize()); |
1247 // Check if a free list entry first since we cannot call | 1229 // Check if a free list entry first since we cannot call |
1248 // isMarked on a free list entry. | 1230 // isMarked on a free list entry. |
1249 if (header->isFree()) { | 1231 if (header->isFree()) { |
1250 headerAddress += header->size(); | 1232 headerAddress += header->size(); |
1251 continue; | 1233 continue; |
1252 } | 1234 } |
1253 ASSERT(header->checkHeader()); | 1235 ASSERT(header->checkHeader()); |
1254 if (objectsToPoison == BlinkGC::MarkedAndUnmarked || !header->isMarked()
) { | 1236 if (!header->isMarked()) |
1255 if (poisoning == BlinkGC::SetPoison) | 1237 ASAN_POISON_MEMORY_REGION(header->payload(), header->payloadSize()); |
1256 ASAN_POISON_MEMORY_REGION(header->payload(), header->payloadSize
()); | |
1257 else | |
1258 ASAN_UNPOISON_MEMORY_REGION(header->payload(), header->payloadSi
ze()); | |
1259 } | |
1260 headerAddress += header->size(); | 1238 headerAddress += header->size(); |
1261 } | 1239 } |
1262 } | 1240 } |
1263 #endif | 1241 #endif |
1264 | 1242 |
1265 void NormalPage::populateObjectStartBitMap() | 1243 void NormalPage::populateObjectStartBitMap() |
1266 { | 1244 { |
1267 memset(&m_objectStartBitMap, 0, objectStartBitMapSize); | 1245 memset(&m_objectStartBitMap, 0, objectStartBitMapSize); |
1268 Address start = payload(); | 1246 Address start = payload(); |
1269 for (Address headerAddress = start; headerAddress < payloadEnd();) { | 1247 for (Address headerAddress = start; headerAddress < payloadEnd();) { |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1481 } | 1459 } |
1482 | 1460 |
1483 void LargeObjectPage::makeConsistentForMutator() | 1461 void LargeObjectPage::makeConsistentForMutator() |
1484 { | 1462 { |
1485 HeapObjectHeader* header = heapObjectHeader(); | 1463 HeapObjectHeader* header = heapObjectHeader(); |
1486 if (header->isMarked()) | 1464 if (header->isMarked()) |
1487 header->unmark(); | 1465 header->unmark(); |
1488 } | 1466 } |
1489 | 1467 |
1490 #if defined(ADDRESS_SANITIZER) | 1468 #if defined(ADDRESS_SANITIZER) |
1491 void LargeObjectPage::poisonObjects(BlinkGC::ObjectsToPoison objectsToPoison, Bl
inkGC::Poisoning poisoning) | 1469 void LargeObjectPage::poisonUnmarkedObjects() |
1492 { | 1470 { |
1493 HeapObjectHeader* header = heapObjectHeader(); | 1471 HeapObjectHeader* header = heapObjectHeader(); |
1494 if (objectsToPoison == BlinkGC::MarkedAndUnmarked || !header->isMarked()) { | 1472 if (!header->isMarked()) |
1495 if (poisoning == BlinkGC::SetPoison) | 1473 ASAN_POISON_MEMORY_REGION(header->payload(), header->payloadSize()); |
1496 ASAN_POISON_MEMORY_REGION(header->payload(), header->payloadSize()); | |
1497 else | |
1498 ASAN_UNPOISON_MEMORY_REGION(header->payload(), header->payloadSize()
); | |
1499 } | |
1500 } | 1474 } |
1501 #endif | 1475 #endif |
1502 | 1476 |
1503 void LargeObjectPage::checkAndMarkPointer(Visitor* visitor, Address address) | 1477 void LargeObjectPage::checkAndMarkPointer(Visitor* visitor, Address address) |
1504 { | 1478 { |
1505 ASSERT(contains(address)); | 1479 ASSERT(contains(address)); |
1506 if (!containedInObjectPayload(address) || heapObjectHeader()->isDead()) | 1480 if (!containedInObjectPayload(address) || heapObjectHeader()->isDead()) |
1507 return; | 1481 return; |
1508 markPointer(visitor, heapObjectHeader()); | 1482 markPointer(visitor, heapObjectHeader()); |
1509 } | 1483 } |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1588 | 1562 |
1589 m_hasEntries = true; | 1563 m_hasEntries = true; |
1590 size_t index = hash(address); | 1564 size_t index = hash(address); |
1591 ASSERT(!(index & 1)); | 1565 ASSERT(!(index & 1)); |
1592 Address cachePage = roundToBlinkPageStart(address); | 1566 Address cachePage = roundToBlinkPageStart(address); |
1593 m_entries[index + 1] = m_entries[index]; | 1567 m_entries[index + 1] = m_entries[index]; |
1594 m_entries[index] = cachePage; | 1568 m_entries[index] = cachePage; |
1595 } | 1569 } |
1596 | 1570 |
1597 } // namespace blink | 1571 } // namespace blink |
OLD | NEW |