Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: Source/platform/heap/HeapTest.cpp

Issue 723513002: Oilpan: Refactor the way we calculate heap statistics (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/platform/heap/Heap.cpp ('k') | Source/platform/heap/ThreadState.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 ThreadState::resumeThreads(); 215 ThreadState::resumeThreads();
216 } 216 }
217 } 217 }
218 218
219 private: 219 private:
220 ThreadState* m_state; 220 ThreadState* m_state;
221 ThreadState::SafePointScope m_safePointScope; 221 ThreadState::SafePointScope m_safePointScope;
222 bool m_parkedAllThreads; // False if we fail to park all threads 222 bool m_parkedAllThreads; // False if we fail to park all threads
223 }; 223 };
224 224
225 static void getHeapStats(HeapStats* stats) 225 static size_t objectPayloadSize()
226 { 226 {
227 TestGCScope scope(ThreadState::NoHeapPointersOnStack); 227 TestGCScope scope(ThreadState::NoHeapPointersOnStack);
228 EXPECT_TRUE(scope.allThreadsParked()); 228 EXPECT_TRUE(scope.allThreadsParked());
229 Heap::getStatsForTesting(stats); 229 return Heap::objectPayloadSizeForTesting();
230 } 230 }
231 231
232 #define DEFINE_VISITOR_METHODS(Type) \ 232 #define DEFINE_VISITOR_METHODS(Type) \
233 virtual void mark(const Type* object, TraceCallback callback) override \ 233 virtual void mark(const Type* object, TraceCallback callback) override \
234 { \ 234 { \
235 if (object) \ 235 if (object) \
236 m_count++; \ 236 m_count++; \
237 } \ 237 } \
238 virtual bool isMarked(const Type*) override { return false; } 238 virtual bool isMarked(const Type*) override { return false; }
239 239
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 362
363 int8_t at(size_t i) { return m_array[i]; } 363 int8_t at(size_t i) { return m_array[i]; }
364 void trace(Visitor*) { } 364 void trace(Visitor*) { }
365 private: 365 private:
366 static const int s_arraySize = 1000; 366 static const int s_arraySize = 1000;
367 int8_t m_array[s_arraySize]; 367 int8_t m_array[s_arraySize];
368 }; 368 };
369 369
370 // Do several GCs to make sure that later GCs don't free up old memory from 370 // Do several GCs to make sure that later GCs don't free up old memory from
371 // previously run tests in this process. 371 // previously run tests in this process.
372 static void clearOutOldGarbage(HeapStats* heapStats) 372 static void clearOutOldGarbage()
373 { 373 {
374 while (true) { 374 while (true) {
375 getHeapStats(heapStats); 375 size_t used = objectPayloadSize();
376 size_t used = heapStats->totalObjectSpace();
377 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 376 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
378 getHeapStats(heapStats); 377 if (objectPayloadSize() >= used)
379 if (heapStats->totalObjectSpace() >= used)
380 break; 378 break;
381 } 379 }
382 } 380 }
383 381
384 class OffHeapInt : public RefCounted<OffHeapInt> { 382 class OffHeapInt : public RefCounted<OffHeapInt> {
385 public: 383 public:
386 static RefPtr<OffHeapInt> create(int x) 384 static RefPtr<OffHeapInt> create(int x)
387 { 385 {
388 return adoptRef(new OffHeapInt(x)); 386 return adoptRef(new OffHeapInt(x));
389 } 387 }
(...skipping 1118 matching lines...) Expand 10 before | Expand all | Expand 10 after
1508 ThreadedHeapTester::test(); 1506 ThreadedHeapTester::test();
1509 } 1507 }
1510 1508
1511 TEST(HeapTest, ThreadedWeakness) 1509 TEST(HeapTest, ThreadedWeakness)
1512 { 1510 {
1513 ThreadedWeaknessTester::test(); 1511 ThreadedWeaknessTester::test();
1514 } 1512 }
1515 1513
1516 TEST(HeapTest, BasicFunctionality) 1514 TEST(HeapTest, BasicFunctionality)
1517 { 1515 {
1518 HeapStats heapStats; 1516 clearOutOldGarbage();
1519 clearOutOldGarbage(&heapStats); 1517 size_t initialObjectPayloadSize = objectPayloadSize();
1520 { 1518 {
1521 size_t slack = 0; 1519 size_t slack = 0;
1522 1520
1523 // When the test starts there may already have been leaked some memory 1521 // When the test starts there may already have been leaked some memory
1524 // on the heap, so we establish a base line. 1522 // on the heap, so we establish a base line.
1525 size_t baseLevel = heapStats.totalObjectSpace(); 1523 size_t baseLevel = initialObjectPayloadSize;
1526 bool testPagesAllocated = !baseLevel; 1524 bool testPagesAllocated = !baseLevel;
1527 if (testPagesAllocated) 1525 if (testPagesAllocated)
1528 EXPECT_EQ(heapStats.totalAllocatedSpace(), 0ul); 1526 EXPECT_EQ(Heap::allocatedSpace(), 0ul);
1529 1527
1530 // This allocates objects on the general heap which should add a page of memory. 1528 // This allocates objects on the general heap which should add a page of memory.
1531 DynamicallySizedObject* alloc32 = DynamicallySizedObject::create(32); 1529 DynamicallySizedObject* alloc32 = DynamicallySizedObject::create(32);
1532 slack += 4; 1530 slack += 4;
1533 memset(alloc32, 40, 32); 1531 memset(alloc32, 40, 32);
1534 DynamicallySizedObject* alloc64 = DynamicallySizedObject::create(64); 1532 DynamicallySizedObject* alloc64 = DynamicallySizedObject::create(64);
1535 slack += 4; 1533 slack += 4;
1536 memset(alloc64, 27, 64); 1534 memset(alloc64, 27, 64);
1537 1535
1538 size_t total = 96; 1536 size_t total = 96;
1539 1537
1540 getHeapStats(&heapStats); 1538 CheckWithSlack(baseLevel + total, objectPayloadSize(), slack);
1541 CheckWithSlack(baseLevel + total, heapStats.totalObjectSpace(), slack);
1542 if (testPagesAllocated) 1539 if (testPagesAllocated)
1543 EXPECT_EQ(heapStats.totalAllocatedSpace(), 2 * blinkPageSize); 1540 EXPECT_EQ(Heap::allocatedSpace(), 2 * blinkPageSize);
1544 1541
1545 EXPECT_EQ(alloc32->get(0), 40); 1542 EXPECT_EQ(alloc32->get(0), 40);
1546 EXPECT_EQ(alloc32->get(31), 40); 1543 EXPECT_EQ(alloc32->get(31), 40);
1547 EXPECT_EQ(alloc64->get(0), 27); 1544 EXPECT_EQ(alloc64->get(0), 27);
1548 EXPECT_EQ(alloc64->get(63), 27); 1545 EXPECT_EQ(alloc64->get(63), 27);
1549 1546
1550 Heap::collectGarbage(ThreadState::HeapPointersOnStack); 1547 Heap::collectGarbage(ThreadState::HeapPointersOnStack);
1551 1548
1552 EXPECT_EQ(alloc32->get(0), 40); 1549 EXPECT_EQ(alloc32->get(0), 40);
1553 EXPECT_EQ(alloc32->get(31), 40); 1550 EXPECT_EQ(alloc32->get(31), 40);
1554 EXPECT_EQ(alloc64->get(0), 27); 1551 EXPECT_EQ(alloc64->get(0), 27);
1555 EXPECT_EQ(alloc64->get(63), 27); 1552 EXPECT_EQ(alloc64->get(63), 27);
1556 } 1553 }
1557 1554
1558 clearOutOldGarbage(&heapStats); 1555 clearOutOldGarbage();
1559 size_t total = 0; 1556 size_t total = 0;
1560 size_t slack = 0; 1557 size_t slack = 0;
1561 size_t baseLevel = heapStats.totalObjectSpace(); 1558 size_t baseLevel = objectPayloadSize();
1562 bool testPagesAllocated = !baseLevel; 1559 bool testPagesAllocated = !baseLevel;
1563 if (testPagesAllocated) 1560 if (testPagesAllocated)
1564 EXPECT_EQ(heapStats.totalAllocatedSpace(), 0ul); 1561 EXPECT_EQ(Heap::allocatedSpace(), 0ul);
1565 1562
1566 size_t big = 1008; 1563 size_t big = 1008;
1567 Persistent<DynamicallySizedObject> bigArea = DynamicallySizedObject::create( big); 1564 Persistent<DynamicallySizedObject> bigArea = DynamicallySizedObject::create( big);
1568 total += big; 1565 total += big;
1569 slack += 4; 1566 slack += 4;
1570 1567
1571 size_t persistentCount = 0; 1568 size_t persistentCount = 0;
1572 const size_t numPersistents = 100000; 1569 const size_t numPersistents = 100000;
1573 Persistent<DynamicallySizedObject>* persistents[numPersistents]; 1570 Persistent<DynamicallySizedObject>* persistents[numPersistents];
1574 1571
1575 for (int i = 0; i < 1000; i++) { 1572 for (int i = 0; i < 1000; i++) {
1576 size_t size = 128 + i * 8; 1573 size_t size = 128 + i * 8;
1577 total += size; 1574 total += size;
1578 persistents[persistentCount++] = new Persistent<DynamicallySizedObject>( DynamicallySizedObject::create(size)); 1575 persistents[persistentCount++] = new Persistent<DynamicallySizedObject>( DynamicallySizedObject::create(size));
1579 slack += 4; 1576 slack += 4;
1580 getHeapStats(&heapStats); 1577 CheckWithSlack(baseLevel + total, objectPayloadSize(), slack);
1581 CheckWithSlack(baseLevel + total, heapStats.totalObjectSpace(), slack);
1582 if (testPagesAllocated) 1578 if (testPagesAllocated)
1583 EXPECT_EQ(0ul, heapStats.totalAllocatedSpace() & (blinkPageSize - 1) ); 1579 EXPECT_EQ(0ul, Heap::allocatedSpace() & (blinkPageSize - 1));
1584 } 1580 }
1585 1581
1586 { 1582 {
1587 DynamicallySizedObject* alloc32b(DynamicallySizedObject::create(32)); 1583 DynamicallySizedObject* alloc32b(DynamicallySizedObject::create(32));
1588 slack += 4; 1584 slack += 4;
1589 memset(alloc32b, 40, 32); 1585 memset(alloc32b, 40, 32);
1590 DynamicallySizedObject* alloc64b(DynamicallySizedObject::create(64)); 1586 DynamicallySizedObject* alloc64b(DynamicallySizedObject::create(64));
1591 slack += 4; 1587 slack += 4;
1592 memset(alloc64b, 27, 64); 1588 memset(alloc64b, 27, 64);
1593 EXPECT_TRUE(alloc32b != alloc64b); 1589 EXPECT_TRUE(alloc32b != alloc64b);
1594 1590
1595 total += 96; 1591 total += 96;
1596 getHeapStats(&heapStats); 1592 CheckWithSlack(baseLevel + total, objectPayloadSize(), slack);
1597 CheckWithSlack(baseLevel + total, heapStats.totalObjectSpace(), slack);
1598 if (testPagesAllocated) 1593 if (testPagesAllocated)
1599 EXPECT_EQ(0ul, heapStats.totalAllocatedSpace() & (blinkPageSize - 1) ); 1594 EXPECT_EQ(0ul, Heap::allocatedSpace() & (blinkPageSize - 1));
1600 } 1595 }
1601 1596
1602 clearOutOldGarbage(&heapStats); 1597 clearOutOldGarbage();
1603 total -= 96; 1598 total -= 96;
1604 slack -= 8; 1599 slack -= 8;
1605 if (testPagesAllocated) 1600 if (testPagesAllocated)
1606 EXPECT_EQ(0ul, heapStats.totalAllocatedSpace() & (blinkPageSize - 1)); 1601 EXPECT_EQ(0ul, Heap::allocatedSpace() & (blinkPageSize - 1));
1607 1602
1608 // Clear the persistent, so that the big area will be garbage collected. 1603 // Clear the persistent, so that the big area will be garbage collected.
1609 bigArea.release(); 1604 bigArea.release();
1610 clearOutOldGarbage(&heapStats); 1605 clearOutOldGarbage();
1611 1606
1612 total -= big; 1607 total -= big;
1613 slack -= 4; 1608 slack -= 4;
1614 getHeapStats(&heapStats); 1609 CheckWithSlack(baseLevel + total, objectPayloadSize(), slack);
1615 CheckWithSlack(baseLevel + total, heapStats.totalObjectSpace(), slack);
1616 if (testPagesAllocated) 1610 if (testPagesAllocated)
1617 EXPECT_EQ(0ul, heapStats.totalAllocatedSpace() & (blinkPageSize - 1)); 1611 EXPECT_EQ(0ul, Heap::allocatedSpace() & (blinkPageSize - 1));
1618 1612
1619 getHeapStats(&heapStats); 1613 CheckWithSlack(baseLevel + total, objectPayloadSize(), slack);
1620 CheckWithSlack(baseLevel + total, heapStats.totalObjectSpace(), slack);
1621 if (testPagesAllocated) 1614 if (testPagesAllocated)
1622 EXPECT_EQ(0ul, heapStats.totalAllocatedSpace() & (blinkPageSize - 1)); 1615 EXPECT_EQ(0ul, Heap::allocatedSpace() & (blinkPageSize - 1));
1623 1616
1624 for (size_t i = 0; i < persistentCount; i++) { 1617 for (size_t i = 0; i < persistentCount; i++) {
1625 delete persistents[i]; 1618 delete persistents[i];
1626 persistents[i] = 0; 1619 persistents[i] = 0;
1627 } 1620 }
1628 1621
1629 uint8_t* address = reinterpret_cast<uint8_t*>(Heap::reallocate<DynamicallySi zedObject>(0, 100)); 1622 uint8_t* address = reinterpret_cast<uint8_t*>(Heap::reallocate<DynamicallySi zedObject>(0, 100));
1630 for (int i = 0; i < 100; i++) 1623 for (int i = 0; i < 100; i++)
1631 address[i] = i; 1624 address[i] = i;
1632 address = reinterpret_cast<uint8_t*>(Heap::reallocate<DynamicallySizedObject >(address, 100000)); 1625 address = reinterpret_cast<uint8_t*>(Heap::reallocate<DynamicallySizedObject >(address, 100000));
1633 for (int i = 0; i < 100; i++) 1626 for (int i = 0; i < 100; i++)
1634 EXPECT_EQ(address[i], i); 1627 EXPECT_EQ(address[i], i);
1635 address = reinterpret_cast<uint8_t*>(Heap::reallocate<DynamicallySizedObject >(address, 50)); 1628 address = reinterpret_cast<uint8_t*>(Heap::reallocate<DynamicallySizedObject >(address, 50));
1636 for (int i = 0; i < 50; i++) 1629 for (int i = 0; i < 50; i++)
1637 EXPECT_EQ(address[i], i); 1630 EXPECT_EQ(address[i], i);
1638 // This should be equivalent to free(address). 1631 // This should be equivalent to free(address).
1639 EXPECT_EQ(reinterpret_cast<uintptr_t>(Heap::reallocate<DynamicallySizedObjec t>(address, 0)), 0ul); 1632 EXPECT_EQ(reinterpret_cast<uintptr_t>(Heap::reallocate<DynamicallySizedObjec t>(address, 0)), 0ul);
1640 // This should be equivalent to malloc(0). 1633 // This should be equivalent to malloc(0).
1641 EXPECT_EQ(reinterpret_cast<uintptr_t>(Heap::reallocate<DynamicallySizedObjec t>(0, 0)), 0ul); 1634 EXPECT_EQ(reinterpret_cast<uintptr_t>(Heap::reallocate<DynamicallySizedObjec t>(0, 0)), 0ul);
1642 } 1635 }
1643 1636
1644 TEST(HeapTest, SimpleAllocation) 1637 TEST(HeapTest, SimpleAllocation)
1645 { 1638 {
1646 HeapStats initialHeapStats; 1639 clearOutOldGarbage();
1647 clearOutOldGarbage(&initialHeapStats); 1640 EXPECT_EQ(0ul, objectPayloadSize());
1648 EXPECT_EQ(0ul, initialHeapStats.totalObjectSpace());
1649 1641
1650 // Allocate an object in the heap. 1642 // Allocate an object in the heap.
1651 HeapAllocatedArray* array = new HeapAllocatedArray(); 1643 HeapAllocatedArray* array = new HeapAllocatedArray();
1652 HeapStats statsAfterAllocation; 1644 EXPECT_TRUE(objectPayloadSize() >= sizeof(HeapAllocatedArray));
1653 getHeapStats(&statsAfterAllocation);
1654 EXPECT_TRUE(statsAfterAllocation.totalObjectSpace() >= sizeof(HeapAllocatedA rray));
1655 1645
1656 // Sanity check of the contents in the heap. 1646 // Sanity check of the contents in the heap.
1657 EXPECT_EQ(0, array->at(0)); 1647 EXPECT_EQ(0, array->at(0));
1658 EXPECT_EQ(42, array->at(42)); 1648 EXPECT_EQ(42, array->at(42));
1659 EXPECT_EQ(0, array->at(128)); 1649 EXPECT_EQ(0, array->at(128));
1660 EXPECT_EQ(999 % 128, array->at(999)); 1650 EXPECT_EQ(999 % 128, array->at(999));
1661 } 1651 }
1662 1652
1663 TEST(HeapTest, SimplePersistent) 1653 TEST(HeapTest, SimplePersistent)
1664 { 1654 {
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
1815 // for the conservative stack scan to find. 1805 // for the conservative stack scan to find.
1816 EXPECT_EQ(width, bars->getWidth()); 1806 EXPECT_EQ(width, bars->getWidth());
1817 } 1807 }
1818 EXPECT_EQ(Bars::width + 1, Bar::s_live); 1808 EXPECT_EQ(Bars::width + 1, Bar::s_live);
1819 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 1809 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1820 EXPECT_EQ(0u, Bar::s_live); 1810 EXPECT_EQ(0u, Bar::s_live);
1821 } 1811 }
1822 1812
1823 TEST(HeapTest, HashMapOfMembers) 1813 TEST(HeapTest, HashMapOfMembers)
1824 { 1814 {
1825 HeapStats initialHeapSize;
1826 IntWrapper::s_destructorCalls = 0; 1815 IntWrapper::s_destructorCalls = 0;
1827 1816
1828 clearOutOldGarbage(&initialHeapSize); 1817 clearOutOldGarbage();
1818 size_t initialObjectPayloadSize = objectPayloadSize();
1829 { 1819 {
1830 typedef HeapHashMap< 1820 typedef HeapHashMap<
1831 Member<IntWrapper>, 1821 Member<IntWrapper>,
1832 Member<IntWrapper>, 1822 Member<IntWrapper>,
1833 DefaultHash<Member<IntWrapper> >::Hash, 1823 DefaultHash<Member<IntWrapper> >::Hash,
1834 HashTraits<Member<IntWrapper> >, 1824 HashTraits<Member<IntWrapper> >,
1835 HashTraits<Member<IntWrapper> > > HeapObjectIdentityMap; 1825 HashTraits<Member<IntWrapper> > > HeapObjectIdentityMap;
1836 1826
1837 Persistent<HeapObjectIdentityMap> map = new HeapObjectIdentityMap(); 1827 Persistent<HeapObjectIdentityMap> map = new HeapObjectIdentityMap();
1838 1828
1839 map->clear(); 1829 map->clear();
1840 HeapStats afterSetWasCreated; 1830 size_t afterSetWasCreated = objectPayloadSize();
1841 getHeapStats(&afterSetWasCreated); 1831 EXPECT_TRUE(afterSetWasCreated > initialObjectPayloadSize);
1842 EXPECT_TRUE(afterSetWasCreated.totalObjectSpace() > initialHeapSize.tota lObjectSpace());
1843 1832
1844 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 1833 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1845 HeapStats afterGC; 1834 size_t afterGC = objectPayloadSize();
1846 getHeapStats(&afterGC); 1835 EXPECT_EQ(afterGC, afterSetWasCreated);
1847 EXPECT_EQ(afterGC.totalObjectSpace(), afterSetWasCreated.totalObjectSpac e());
1848 1836
1849 // If the additions below cause garbage collections, these 1837 // If the additions below cause garbage collections, these
1850 // pointers should be found by conservative stack scanning. 1838 // pointers should be found by conservative stack scanning.
1851 IntWrapper* one(IntWrapper::create(1)); 1839 IntWrapper* one(IntWrapper::create(1));
1852 IntWrapper* anotherOne(IntWrapper::create(1)); 1840 IntWrapper* anotherOne(IntWrapper::create(1));
1853 1841
1854 map->add(one, one); 1842 map->add(one, one);
1855 1843
1856 HeapStats afterOneAdd; 1844 size_t afterOneAdd = objectPayloadSize();
1857 getHeapStats(&afterOneAdd); 1845 EXPECT_TRUE(afterOneAdd > afterGC);
1858 EXPECT_TRUE(afterOneAdd.totalObjectSpace() > afterGC.totalObjectSpace()) ;
1859 1846
1860 HeapObjectIdentityMap::iterator it(map->begin()); 1847 HeapObjectIdentityMap::iterator it(map->begin());
1861 HeapObjectIdentityMap::iterator it2(map->begin()); 1848 HeapObjectIdentityMap::iterator it2(map->begin());
1862 ++it; 1849 ++it;
1863 ++it2; 1850 ++it2;
1864 1851
1865 map->add(anotherOne, one); 1852 map->add(anotherOne, one);
1866 1853
1867 // The addition above can cause an allocation of a new 1854 // The addition above can cause an allocation of a new
1868 // backing store. We therefore garbage collect before 1855 // backing store. We therefore garbage collect before
1869 // taking the heap stats in order to get rid of the old 1856 // taking the heap stats in order to get rid of the old
1870 // backing store. We make sure to not use conservative 1857 // backing store. We make sure to not use conservative
1871 // stack scanning as that could find a pointer to the 1858 // stack scanning as that could find a pointer to the
1872 // old backing. 1859 // old backing.
1873 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 1860 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1874 HeapStats afterAddAndGC; 1861 size_t afterAddAndGC = objectPayloadSize();
1875 getHeapStats(&afterAddAndGC); 1862 EXPECT_TRUE(afterAddAndGC >= afterOneAdd);
1876 EXPECT_TRUE(afterAddAndGC.totalObjectSpace() >= afterOneAdd.totalObjectS pace());
1877 1863
1878 EXPECT_EQ(map->size(), 2u); // Two different wrappings of '1' are distin ct. 1864 EXPECT_EQ(map->size(), 2u); // Two different wrappings of '1' are distin ct.
1879 1865
1880 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 1866 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1881 EXPECT_TRUE(map->contains(one)); 1867 EXPECT_TRUE(map->contains(one));
1882 EXPECT_TRUE(map->contains(anotherOne)); 1868 EXPECT_TRUE(map->contains(anotherOne));
1883 1869
1884 IntWrapper* gotten(map->get(one)); 1870 IntWrapper* gotten(map->get(one));
1885 EXPECT_EQ(gotten->value(), one->value()); 1871 EXPECT_EQ(gotten->value(), one->value());
1886 EXPECT_EQ(gotten, one); 1872 EXPECT_EQ(gotten, one);
1887 1873
1888 HeapStats afterGC2; 1874 size_t afterGC2 = objectPayloadSize();
1889 getHeapStats(&afterGC2); 1875 EXPECT_EQ(afterGC2, afterAddAndGC);
1890 EXPECT_EQ(afterGC2.totalObjectSpace(), afterAddAndGC.totalObjectSpace()) ;
1891 1876
1892 IntWrapper* dozen = 0; 1877 IntWrapper* dozen = 0;
1893 1878
1894 for (int i = 1; i < 1000; i++) { // 999 iterations. 1879 for (int i = 1; i < 1000; i++) { // 999 iterations.
1895 IntWrapper* iWrapper(IntWrapper::create(i)); 1880 IntWrapper* iWrapper(IntWrapper::create(i));
1896 IntWrapper* iSquared(IntWrapper::create(i * i)); 1881 IntWrapper* iSquared(IntWrapper::create(i * i));
1897 map->add(iWrapper, iSquared); 1882 map->add(iWrapper, iSquared);
1898 if (i == 12) 1883 if (i == 12)
1899 dozen = iWrapper; 1884 dozen = iWrapper;
1900 } 1885 }
1901 HeapStats afterAdding1000; 1886 size_t afterAdding1000 = objectPayloadSize();
1902 getHeapStats(&afterAdding1000); 1887 EXPECT_TRUE(afterAdding1000 > afterGC2);
1903 EXPECT_TRUE(afterAdding1000.totalObjectSpace() > afterGC2.totalObjectSpa ce());
1904 1888
1905 IntWrapper* gross(map->get(dozen)); 1889 IntWrapper* gross(map->get(dozen));
1906 EXPECT_EQ(gross->value(), 144); 1890 EXPECT_EQ(gross->value(), 144);
1907 1891
1908 // This should clear out any junk backings created by all the adds. 1892 // This should clear out any junk backings created by all the adds.
1909 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 1893 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1910 HeapStats afterGC3; 1894 size_t afterGC3 = objectPayloadSize();
1911 getHeapStats(&afterGC3); 1895 EXPECT_TRUE(afterGC3 <= afterAdding1000);
1912 EXPECT_TRUE(afterGC3.totalObjectSpace() <= afterAdding1000.totalObjectSp ace());
1913 } 1896 }
1914 1897
1915 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 1898 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1916 // The objects 'one', anotherOne, and the 999 other pairs. 1899 // The objects 'one', anotherOne, and the 999 other pairs.
1917 EXPECT_EQ(IntWrapper::s_destructorCalls, 2000); 1900 EXPECT_EQ(IntWrapper::s_destructorCalls, 2000);
1918 HeapStats afterGC4; 1901 size_t afterGC4 = objectPayloadSize();
1919 getHeapStats(&afterGC4); 1902 EXPECT_EQ(afterGC4, initialObjectPayloadSize);
1920 EXPECT_EQ(afterGC4.totalObjectSpace(), initialHeapSize.totalObjectSpace());
1921 } 1903 }
1922 1904
1923 TEST(HeapTest, NestedAllocation) 1905 TEST(HeapTest, NestedAllocation)
1924 { 1906 {
1925 HeapStats initialHeapSize; 1907 clearOutOldGarbage();
1926 clearOutOldGarbage(&initialHeapSize); 1908 size_t initialObjectPayloadSize = objectPayloadSize();
1927 { 1909 {
1928 Persistent<ConstructorAllocation> constructorAllocation = ConstructorAll ocation::create(); 1910 Persistent<ConstructorAllocation> constructorAllocation = ConstructorAll ocation::create();
1929 } 1911 }
1930 HeapStats afterFree; 1912 clearOutOldGarbage();
1931 clearOutOldGarbage(&afterFree); 1913 size_t afterFree = objectPayloadSize();
1932 EXPECT_TRUE(initialHeapSize == afterFree); 1914 EXPECT_TRUE(initialObjectPayloadSize == afterFree);
1933 } 1915 }
1934 1916
1935 TEST(HeapTest, LargeObjects) 1917 TEST(HeapTest, LargeObjects)
1936 { 1918 {
1937 HeapStats initialHeapSize; 1919 clearOutOldGarbage();
1938 clearOutOldGarbage(&initialHeapSize); 1920 size_t initialObjectPayloadSize = objectPayloadSize();
1921 size_t initialAllocatedSpace = Heap::allocatedSpace();
1939 IntWrapper::s_destructorCalls = 0; 1922 IntWrapper::s_destructorCalls = 0;
1940 LargeObject::s_destructorCalls = 0; 1923 LargeObject::s_destructorCalls = 0;
1941 { 1924 {
1942 int slack = 8; // LargeObject points to an IntWrapper that is also alloc ated. 1925 int slack = 8; // LargeObject points to an IntWrapper that is also alloc ated.
1943 Persistent<LargeObject> object = LargeObject::create(); 1926 Persistent<LargeObject> object = LargeObject::create();
1944 EXPECT_TRUE(ThreadState::current()->contains(object)); 1927 EXPECT_TRUE(ThreadState::current()->contains(object));
1945 EXPECT_TRUE(ThreadState::current()->contains(reinterpret_cast<char*>(obj ect.get()) + sizeof(LargeObject) - 1)); 1928 EXPECT_TRUE(ThreadState::current()->contains(reinterpret_cast<char*>(obj ect.get()) + sizeof(LargeObject) - 1));
1946 #if ENABLE(GC_PROFILE_MARKING) 1929 #if ENABLE(GC_PROFILE_MARKING)
1947 const GCInfo* info = ThreadState::current()->findGCInfo(reinterpret_cast <Address>(object.get())); 1930 const GCInfo* info = ThreadState::current()->findGCInfo(reinterpret_cast <Address>(object.get()));
1948 EXPECT_NE(reinterpret_cast<const GCInfo*>(0), info); 1931 EXPECT_NE(reinterpret_cast<const GCInfo*>(0), info);
1949 EXPECT_EQ(info, ThreadState::current()->findGCInfo(reinterpret_cast<Addr ess>(object.get()) + sizeof(LargeObject) - 1)); 1932 EXPECT_EQ(info, ThreadState::current()->findGCInfo(reinterpret_cast<Addr ess>(object.get()) + sizeof(LargeObject) - 1));
1950 EXPECT_NE(info, ThreadState::current()->findGCInfo(reinterpret_cast<Addr ess>(object.get()) + sizeof(LargeObject))); 1933 EXPECT_NE(info, ThreadState::current()->findGCInfo(reinterpret_cast<Addr ess>(object.get()) + sizeof(LargeObject)));
1951 EXPECT_NE(info, ThreadState::current()->findGCInfo(reinterpret_cast<Addr ess>(object.get()) - 1)); 1934 EXPECT_NE(info, ThreadState::current()->findGCInfo(reinterpret_cast<Addr ess>(object.get()) - 1));
1952 #endif 1935 #endif
1953 HeapStats afterAllocation; 1936 clearOutOldGarbage();
1954 clearOutOldGarbage(&afterAllocation); 1937 size_t afterAllocation = Heap::allocatedSpace();
1955 { 1938 {
1956 object->set(0, 'a'); 1939 object->set(0, 'a');
1957 EXPECT_EQ('a', object->get(0)); 1940 EXPECT_EQ('a', object->get(0));
1958 object->set(object->length() - 1, 'b'); 1941 object->set(object->length() - 1, 'b');
1959 EXPECT_EQ('b', object->get(object->length() - 1)); 1942 EXPECT_EQ('b', object->get(object->length() - 1));
1960 size_t expectedObjectSpace = sizeof(LargeObject) + sizeof(IntWrapper ); 1943 size_t expectedObjectPayloadSize = sizeof(LargeObject) + sizeof(IntW rapper);
1961 size_t actualObjectSpace = 1944 size_t actualObjectPayloadSize = objectPayloadSize() - initialObject PayloadSize;
1962 afterAllocation.totalObjectSpace() - initialHeapSize.totalObject Space(); 1945 CheckWithSlack(expectedObjectPayloadSize, actualObjectPayloadSize, s lack);
1963 CheckWithSlack(expectedObjectSpace, actualObjectSpace, slack);
1964 // There is probably space for the IntWrapper in a heap page without 1946 // There is probably space for the IntWrapper in a heap page without
1965 // allocating extra pages. However, the IntWrapper allocation might cause 1947 // allocating extra pages. However, the IntWrapper allocation might cause
1966 // the addition of a heap page. 1948 // the addition of a heap page.
1967 size_t largeObjectAllocationSize = 1949 size_t largeObjectAllocationSize =
1968 sizeof(LargeObject) + sizeof(LargeHeapObject<FinalizedHeapObject Header>) + sizeof(FinalizedHeapObjectHeader); 1950 sizeof(LargeObject) + sizeof(LargeHeapObject<FinalizedHeapObject Header>) + sizeof(FinalizedHeapObjectHeader);
1969 size_t allocatedSpaceLowerBound = 1951 size_t allocatedSpaceLowerBound = initialAllocatedSpace + largeObjec tAllocationSize;
1970 initialHeapSize.totalAllocatedSpace() + largeObjectAllocationSiz e;
1971 size_t allocatedSpaceUpperBound = allocatedSpaceLowerBound + slack + blinkPageSize; 1952 size_t allocatedSpaceUpperBound = allocatedSpaceLowerBound + slack + blinkPageSize;
1972 EXPECT_LE(allocatedSpaceLowerBound, afterAllocation.totalAllocatedSp ace()); 1953 EXPECT_LE(allocatedSpaceLowerBound, afterAllocation);
1973 EXPECT_LE(afterAllocation.totalAllocatedSpace(), allocatedSpaceUpper Bound); 1954 EXPECT_LE(afterAllocation, allocatedSpaceUpperBound);
1974 EXPECT_EQ(0, IntWrapper::s_destructorCalls); 1955 EXPECT_EQ(0, IntWrapper::s_destructorCalls);
1975 EXPECT_EQ(0, LargeObject::s_destructorCalls); 1956 EXPECT_EQ(0, LargeObject::s_destructorCalls);
1976 for (int i = 0; i < 10; i++) 1957 for (int i = 0; i < 10; i++)
1977 object = LargeObject::create(); 1958 object = LargeObject::create();
1978 } 1959 }
1979 HeapStats oneLargeObject; 1960 clearOutOldGarbage();
1980 clearOutOldGarbage(&oneLargeObject); 1961 EXPECT_TRUE(Heap::allocatedSpace() == afterAllocation);
1981 EXPECT_TRUE(oneLargeObject == afterAllocation);
1982 EXPECT_EQ(10, IntWrapper::s_destructorCalls); 1962 EXPECT_EQ(10, IntWrapper::s_destructorCalls);
1983 EXPECT_EQ(10, LargeObject::s_destructorCalls); 1963 EXPECT_EQ(10, LargeObject::s_destructorCalls);
1984 } 1964 }
1985 HeapStats backToInitial; 1965 clearOutOldGarbage();
1986 clearOutOldGarbage(&backToInitial); 1966 EXPECT_TRUE(initialObjectPayloadSize == objectPayloadSize());
1987 EXPECT_TRUE(initialHeapSize == backToInitial); 1967 EXPECT_TRUE(initialAllocatedSpace == Heap::allocatedSpace());
1988 EXPECT_EQ(11, IntWrapper::s_destructorCalls); 1968 EXPECT_EQ(11, IntWrapper::s_destructorCalls);
1989 EXPECT_EQ(11, LargeObject::s_destructorCalls); 1969 EXPECT_EQ(11, LargeObject::s_destructorCalls);
1990 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 1970 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1991 } 1971 }
1992 1972
1993 typedef std::pair<Member<IntWrapper>, int> PairWrappedUnwrapped; 1973 typedef std::pair<Member<IntWrapper>, int> PairWrappedUnwrapped;
1994 typedef std::pair<int, Member<IntWrapper> > PairUnwrappedWrapped; 1974 typedef std::pair<int, Member<IntWrapper> > PairUnwrappedWrapped;
1995 typedef std::pair<WeakMember<IntWrapper>, Member<IntWrapper> > PairWeakStrong; 1975 typedef std::pair<WeakMember<IntWrapper>, Member<IntWrapper> > PairWeakStrong;
1996 typedef std::pair<Member<IntWrapper>, WeakMember<IntWrapper> > PairStrongWeak; 1976 typedef std::pair<Member<IntWrapper>, WeakMember<IntWrapper> > PairStrongWeak;
1997 typedef std::pair<WeakMember<IntWrapper>, int> PairWeakUnwrapped; 1977 typedef std::pair<WeakMember<IntWrapper>, int> PairWeakUnwrapped;
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
2177 typedef typename HeapDeque<T, inlineCapacity>::iterator iterator; 2157 typedef typename HeapDeque<T, inlineCapacity>::iterator iterator;
2178 for (iterator it = deque.begin(); it != deque.end(); ++it) { 2158 for (iterator it = deque.begin(); it != deque.end(); ++it) {
2179 if (*it == u) 2159 if (*it == u)
2180 return true; 2160 return true;
2181 } 2161 }
2182 return false; 2162 return false;
2183 } 2163 }
2184 2164
2185 TEST(HeapTest, HeapCollectionTypes) 2165 TEST(HeapTest, HeapCollectionTypes)
2186 { 2166 {
2187 HeapStats initialHeapSize;
2188 IntWrapper::s_destructorCalls = 0; 2167 IntWrapper::s_destructorCalls = 0;
2189 2168
2190 typedef HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > MemberMember; 2169 typedef HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > MemberMember;
2191 typedef HeapHashMap<Member<IntWrapper>, int> MemberPrimitive; 2170 typedef HeapHashMap<Member<IntWrapper>, int> MemberPrimitive;
2192 typedef HeapHashMap<int, Member<IntWrapper> > PrimitiveMember; 2171 typedef HeapHashMap<int, Member<IntWrapper> > PrimitiveMember;
2193 2172
2194 typedef HeapHashSet<Member<IntWrapper> > MemberSet; 2173 typedef HeapHashSet<Member<IntWrapper> > MemberSet;
2195 typedef HeapHashCountedSet<Member<IntWrapper> > MemberCountedSet; 2174 typedef HeapHashCountedSet<Member<IntWrapper> > MemberCountedSet;
2196 2175
2197 typedef HeapVector<Member<IntWrapper>, 2> MemberVector; 2176 typedef HeapVector<Member<IntWrapper>, 2> MemberVector;
(...skipping 19 matching lines...) Expand all
2217 Persistent<VectorUW> vectorUW = new VectorUW(); 2196 Persistent<VectorUW> vectorUW = new VectorUW();
2218 Persistent<VectorUW> vectorUW2 = new VectorUW(); 2197 Persistent<VectorUW> vectorUW2 = new VectorUW();
2219 Persistent<MemberDeque> deque = new MemberDeque(); 2198 Persistent<MemberDeque> deque = new MemberDeque();
2220 Persistent<MemberDeque> deque2 = new MemberDeque(); 2199 Persistent<MemberDeque> deque2 = new MemberDeque();
2221 Persistent<DequeWU> dequeWU = new DequeWU(); 2200 Persistent<DequeWU> dequeWU = new DequeWU();
2222 Persistent<DequeWU> dequeWU2 = new DequeWU(); 2201 Persistent<DequeWU> dequeWU2 = new DequeWU();
2223 Persistent<DequeUW> dequeUW = new DequeUW(); 2202 Persistent<DequeUW> dequeUW = new DequeUW();
2224 Persistent<DequeUW> dequeUW2 = new DequeUW(); 2203 Persistent<DequeUW> dequeUW2 = new DequeUW();
2225 Persistent<Container> container = Container::create(); 2204 Persistent<Container> container = Container::create();
2226 2205
2227 clearOutOldGarbage(&initialHeapSize); 2206 clearOutOldGarbage();
2228 { 2207 {
2229 Persistent<IntWrapper> one(IntWrapper::create(1)); 2208 Persistent<IntWrapper> one(IntWrapper::create(1));
2230 Persistent<IntWrapper> two(IntWrapper::create(2)); 2209 Persistent<IntWrapper> two(IntWrapper::create(2));
2231 Persistent<IntWrapper> oneB(IntWrapper::create(1)); 2210 Persistent<IntWrapper> oneB(IntWrapper::create(1));
2232 Persistent<IntWrapper> twoB(IntWrapper::create(2)); 2211 Persistent<IntWrapper> twoB(IntWrapper::create(2));
2233 Persistent<IntWrapper> oneC(IntWrapper::create(1)); 2212 Persistent<IntWrapper> oneC(IntWrapper::create(1));
2234 Persistent<IntWrapper> oneD(IntWrapper::create(1)); 2213 Persistent<IntWrapper> oneD(IntWrapper::create(1));
2235 Persistent<IntWrapper> oneE(IntWrapper::create(1)); 2214 Persistent<IntWrapper> oneE(IntWrapper::create(1));
2236 Persistent<IntWrapper> oneF(IntWrapper::create(1)); 2215 Persistent<IntWrapper> oneF(IntWrapper::create(1));
2237 { 2216 {
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
2500 found++; 2479 found++;
2501 int value = (*it)->value(); 2480 int value = (*it)->value();
2502 EXPECT_TRUE(value >= 0 && value < 1100); 2481 EXPECT_TRUE(value >= 0 && value < 1100);
2503 ++it; 2482 ++it;
2504 } 2483 }
2505 EXPECT_EQ(expected, found); 2484 EXPECT_EQ(expected, found);
2506 } 2485 }
2507 2486
2508 TEST(HeapTest, HeapWeakCollectionSimple) 2487 TEST(HeapTest, HeapWeakCollectionSimple)
2509 { 2488 {
2510 HeapStats initialHeapStats; 2489 clearOutOldGarbage();
2511 clearOutOldGarbage(&initialHeapStats);
2512 IntWrapper::s_destructorCalls = 0; 2490 IntWrapper::s_destructorCalls = 0;
2513 2491
2514 PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive; 2492 PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive;
2515 2493
2516 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > WeakStrong; 2494 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > WeakStrong;
2517 typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper> > StrongWeak; 2495 typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper> > StrongWeak;
2518 typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper> > WeakWea k; 2496 typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper> > WeakWea k;
2519 typedef HeapHashSet<WeakMember<IntWrapper> > WeakSet; 2497 typedef HeapHashSet<WeakMember<IntWrapper> > WeakSet;
2520 typedef HeapHashCountedSet<WeakMember<IntWrapper> > WeakCountedSet; 2498 typedef HeapHashCountedSet<WeakMember<IntWrapper> > WeakCountedSet;
2521 2499
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2562 EXPECT_EQ(0u, weakStrong->size()); 2540 EXPECT_EQ(0u, weakStrong->size());
2563 EXPECT_EQ(0u, strongWeak->size()); 2541 EXPECT_EQ(0u, strongWeak->size());
2564 EXPECT_EQ(0u, weakWeak->size()); 2542 EXPECT_EQ(0u, weakWeak->size());
2565 EXPECT_EQ(2u, weakSet->size()); 2543 EXPECT_EQ(2u, weakSet->size());
2566 EXPECT_EQ(2u, weakCountedSet->size()); 2544 EXPECT_EQ(2u, weakCountedSet->size());
2567 } 2545 }
2568 2546
2569 template<typename Set> 2547 template<typename Set>
2570 void orderedSetHelper(bool strong) 2548 void orderedSetHelper(bool strong)
2571 { 2549 {
2572 HeapStats initialHeapStats; 2550 clearOutOldGarbage();
2573 clearOutOldGarbage(&initialHeapStats);
2574 IntWrapper::s_destructorCalls = 0; 2551 IntWrapper::s_destructorCalls = 0;
2575 2552
2576 PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive; 2553 PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive;
2577 2554
2578 Persistent<Set> set1 = new Set(); 2555 Persistent<Set> set1 = new Set();
2579 Persistent<Set> set2 = new Set(); 2556 Persistent<Set> set2 = new Set();
2580 2557
2581 const Set& constSet = *set1.get(); 2558 const Set& constSet = *set1.get();
2582 2559
2583 keepNumbersAlive.append(IntWrapper::create(2)); 2560 keepNumbersAlive.append(IntWrapper::create(2));
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
2722 }; 2699 };
2723 2700
2724 int ThingWithDestructor::s_liveThingsWithDestructor; 2701 int ThingWithDestructor::s_liveThingsWithDestructor;
2725 2702
2726 struct ThingWithDestructorTraits : public HashTraits<ThingWithDestructor> { 2703 struct ThingWithDestructorTraits : public HashTraits<ThingWithDestructor> {
2727 static const bool needsDestruction = true; 2704 static const bool needsDestruction = true;
2728 }; 2705 };
2729 2706
2730 static void heapMapDestructorHelper(bool clearMaps) 2707 static void heapMapDestructorHelper(bool clearMaps)
2731 { 2708 {
2732 HeapStats initialHeapStats; 2709 clearOutOldGarbage();
2733 clearOutOldGarbage(&initialHeapStats);
2734 ThingWithDestructor::s_liveThingsWithDestructor = 0; 2710 ThingWithDestructor::s_liveThingsWithDestructor = 0;
2735 2711
2736 typedef HeapHashMap<WeakMember<IntWrapper>, Member<RefCountedAndGarbageColle cted> > RefMap; 2712 typedef HeapHashMap<WeakMember<IntWrapper>, Member<RefCountedAndGarbageColle cted> > RefMap;
2737 2713
2738 typedef HeapHashMap< 2714 typedef HeapHashMap<
2739 WeakMember<IntWrapper>, 2715 WeakMember<IntWrapper>,
2740 ThingWithDestructor, 2716 ThingWithDestructor,
2741 DefaultHash<WeakMember<IntWrapper> >::Hash, 2717 DefaultHash<WeakMember<IntWrapper> >::Hash,
2742 HashTraits<WeakMember<IntWrapper> >, 2718 HashTraits<WeakMember<IntWrapper> >,
2743 ThingWithDestructorTraits> Map; 2719 ThingWithDestructorTraits> Map;
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
2947 typedef HeapLinkedHashSet<PairWeakStrong> WeakStrongSet; 2923 typedef HeapLinkedHashSet<PairWeakStrong> WeakStrongSet;
2948 typedef HeapLinkedHashSet<PairWeakUnwrapped> WeakUnwrappedSet; 2924 typedef HeapLinkedHashSet<PairWeakUnwrapped> WeakUnwrappedSet;
2949 typedef HeapLinkedHashSet<PairStrongWeak> StrongWeakSet; 2925 typedef HeapLinkedHashSet<PairStrongWeak> StrongWeakSet;
2950 typedef HeapLinkedHashSet<PairUnwrappedWeak> UnwrappedWeakSet; 2926 typedef HeapLinkedHashSet<PairUnwrappedWeak> UnwrappedWeakSet;
2951 weakPairsHelper<WeakStrongSet, StrongWeakSet, WeakUnwrappedSet, Unwrappe dWeakSet>(); 2927 weakPairsHelper<WeakStrongSet, StrongWeakSet, WeakUnwrappedSet, Unwrappe dWeakSet>();
2952 } 2928 }
2953 } 2929 }
2954 2930
2955 TEST(HeapTest, HeapWeakCollectionTypes) 2931 TEST(HeapTest, HeapWeakCollectionTypes)
2956 { 2932 {
2957 HeapStats initialHeapSize;
2958 IntWrapper::s_destructorCalls = 0; 2933 IntWrapper::s_destructorCalls = 0;
2959 2934
2960 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > WeakStrong; 2935 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > WeakStrong;
2961 typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper> > StrongWeak; 2936 typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper> > StrongWeak;
2962 typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper> > WeakWea k; 2937 typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper> > WeakWea k;
2963 typedef HeapHashSet<WeakMember<IntWrapper> > WeakSet; 2938 typedef HeapHashSet<WeakMember<IntWrapper> > WeakSet;
2964 typedef HeapLinkedHashSet<WeakMember<IntWrapper> > WeakOrderedSet; 2939 typedef HeapLinkedHashSet<WeakMember<IntWrapper> > WeakOrderedSet;
2965 2940
2966 clearOutOldGarbage(&initialHeapSize); 2941 clearOutOldGarbage();
2967 2942
2968 const int weakStrongIndex = 0; 2943 const int weakStrongIndex = 0;
2969 const int strongWeakIndex = 1; 2944 const int strongWeakIndex = 1;
2970 const int weakWeakIndex = 2; 2945 const int weakWeakIndex = 2;
2971 const int numberOfMapIndices = 3; 2946 const int numberOfMapIndices = 3;
2972 const int weakSetIndex = 3; 2947 const int weakSetIndex = 3;
2973 const int weakOrderedSetIndex = 4; 2948 const int weakOrderedSetIndex = 4;
2974 const int numberOfCollections = 5; 2949 const int numberOfCollections = 5;
2975 2950
2976 for (int testRun = 0; testRun < 4; testRun++) { 2951 for (int testRun = 0; testRun < 4; testRun++) {
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
3342 { 3317 {
3343 Persistent<Bar> barPersistent = Bar::create(); 3318 Persistent<Bar> barPersistent = Bar::create();
3344 Persistent<Foo> fooPersistent = Foo::create(barPersistent); 3319 Persistent<Foo> fooPersistent = Foo::create(barPersistent);
3345 EXPECT_TRUE(barPersistent != fooPersistent); 3320 EXPECT_TRUE(barPersistent != fooPersistent);
3346 barPersistent = fooPersistent; 3321 barPersistent = fooPersistent;
3347 EXPECT_TRUE(barPersistent == fooPersistent); 3322 EXPECT_TRUE(barPersistent == fooPersistent);
3348 } 3323 }
3349 3324
3350 TEST(HeapTest, CheckAndMarkPointer) 3325 TEST(HeapTest, CheckAndMarkPointer)
3351 { 3326 {
3352 HeapStats initialHeapStats; 3327 clearOutOldGarbage();
3353 clearOutOldGarbage(&initialHeapStats);
3354 3328
3355 Vector<Address> objectAddresses; 3329 Vector<Address> objectAddresses;
3356 Vector<Address> endAddresses; 3330 Vector<Address> endAddresses;
3357 Address largeObjectAddress; 3331 Address largeObjectAddress;
3358 Address largeObjectEndAddress; 3332 Address largeObjectEndAddress;
3359 CountingVisitor visitor; 3333 CountingVisitor visitor;
3360 for (int i = 0; i < 10; i++) { 3334 for (int i = 0; i < 10; i++) {
3361 SimpleObject* object = SimpleObject::create(); 3335 SimpleObject* object = SimpleObject::create();
3362 Address objectAddress = reinterpret_cast<Address>(object); 3336 Address objectAddress = reinterpret_cast<Address>(object);
3363 objectAddresses.append(objectAddress); 3337 objectAddresses.append(objectAddress);
(...skipping 22 matching lines...) Expand all
3386 EXPECT_EQ(objectAddresses.size() * 2, visitor.count()); 3360 EXPECT_EQ(objectAddresses.size() * 2, visitor.count());
3387 visitor.reset(); 3361 visitor.reset();
3388 EXPECT_TRUE(Heap::checkAndMarkPointer(&visitor, largeObjectAddress)); 3362 EXPECT_TRUE(Heap::checkAndMarkPointer(&visitor, largeObjectAddress));
3389 EXPECT_TRUE(Heap::checkAndMarkPointer(&visitor, largeObjectEndAddress)); 3363 EXPECT_TRUE(Heap::checkAndMarkPointer(&visitor, largeObjectEndAddress));
3390 EXPECT_EQ(2ul, visitor.count()); 3364 EXPECT_EQ(2ul, visitor.count());
3391 visitor.reset(); 3365 visitor.reset();
3392 } 3366 }
3393 // This forces a GC without stack scanning which results in the objects 3367 // This forces a GC without stack scanning which results in the objects
3394 // being collected. This will also rebuild the above mentioned freelists, 3368 // being collected. This will also rebuild the above mentioned freelists,
3395 // however we don't rely on that below since we don't have any allocations. 3369 // however we don't rely on that below since we don't have any allocations.
3396 clearOutOldGarbage(&initialHeapStats); 3370 clearOutOldGarbage();
3397 { 3371 {
3398 TestGCScope scope(ThreadState::HeapPointersOnStack); 3372 TestGCScope scope(ThreadState::HeapPointersOnStack);
3399 EXPECT_TRUE(scope.allThreadsParked()); 3373 EXPECT_TRUE(scope.allThreadsParked());
3400 Heap::prepareForGC(); 3374 Heap::prepareForGC();
3401 Heap::flushHeapDoesNotContainCache(); 3375 Heap::flushHeapDoesNotContainCache();
3402 for (size_t i = 0; i < objectAddresses.size(); i++) { 3376 for (size_t i = 0; i < objectAddresses.size(); i++) {
3403 // We would like to assert that checkAndMarkPointer returned false 3377 // We would like to assert that checkAndMarkPointer returned false
3404 // here because the pointers no longer point into a valid object 3378 // here because the pointers no longer point into a valid object
3405 // (it's been freed by the GCs. But checkAndMarkPointer will return 3379 // (it's been freed by the GCs. But checkAndMarkPointer will return
3406 // true for any pointer that points into a heap page, regardless of 3380 // true for any pointer that points into a heap page, regardless of
3407 // whether it points at a valid object (this ensures the 3381 // whether it points at a valid object (this ensures the
3408 // correctness of the page-based on-heap address caches), so we 3382 // correctness of the page-based on-heap address caches), so we
3409 // can't make that assert. 3383 // can't make that assert.
3410 Heap::checkAndMarkPointer(&visitor, objectAddresses[i]); 3384 Heap::checkAndMarkPointer(&visitor, objectAddresses[i]);
3411 Heap::checkAndMarkPointer(&visitor, endAddresses[i]); 3385 Heap::checkAndMarkPointer(&visitor, endAddresses[i]);
3412 } 3386 }
3413 EXPECT_EQ(0ul, visitor.count()); 3387 EXPECT_EQ(0ul, visitor.count());
3414 Heap::checkAndMarkPointer(&visitor, largeObjectAddress); 3388 Heap::checkAndMarkPointer(&visitor, largeObjectAddress);
3415 Heap::checkAndMarkPointer(&visitor, largeObjectEndAddress); 3389 Heap::checkAndMarkPointer(&visitor, largeObjectEndAddress);
3416 EXPECT_EQ(0ul, visitor.count()); 3390 EXPECT_EQ(0ul, visitor.count());
3417 } 3391 }
3418 // This round of GC is important to make sure that the object start 3392 // This round of GC is important to make sure that the object start
3419 // bitmap are cleared out and that the free lists are rebuild. 3393 // bitmap are cleared out and that the free lists are rebuild.
3420 clearOutOldGarbage(&initialHeapStats); 3394 clearOutOldGarbage();
3421 } 3395 }
3422 3396
3423 TEST(HeapTest, VisitOffHeapCollections) 3397 TEST(HeapTest, VisitOffHeapCollections)
3424 { 3398 {
3425 HeapStats initialHeapStats; 3399 clearOutOldGarbage();
3426 clearOutOldGarbage(&initialHeapStats);
3427 IntWrapper::s_destructorCalls = 0; 3400 IntWrapper::s_destructorCalls = 0;
3428 Persistent<OffHeapContainer> container = OffHeapContainer::create(); 3401 Persistent<OffHeapContainer> container = OffHeapContainer::create();
3429 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3402 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3430 EXPECT_EQ(0, IntWrapper::s_destructorCalls); 3403 EXPECT_EQ(0, IntWrapper::s_destructorCalls);
3431 container = nullptr; 3404 container = nullptr;
3432 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3405 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3433 EXPECT_EQ(OffHeapContainer::deadWrappers, IntWrapper::s_destructorCalls); 3406 EXPECT_EQ(OffHeapContainer::deadWrappers, IntWrapper::s_destructorCalls);
3434 } 3407 }
3435 3408
3436 TEST(HeapTest, PersistentHeapCollectionTypes) 3409 TEST(HeapTest, PersistentHeapCollectionTypes)
3437 { 3410 {
3438 HeapStats initialHeapSize;
3439 IntWrapper::s_destructorCalls = 0; 3411 IntWrapper::s_destructorCalls = 0;
3440 3412
3441 typedef HeapVector<Member<IntWrapper> > Vec; 3413 typedef HeapVector<Member<IntWrapper> > Vec;
3442 typedef PersistentHeapVector<Member<IntWrapper> > PVec; 3414 typedef PersistentHeapVector<Member<IntWrapper> > PVec;
3443 typedef PersistentHeapHashSet<Member<IntWrapper> > PSet; 3415 typedef PersistentHeapHashSet<Member<IntWrapper> > PSet;
3444 typedef PersistentHeapListHashSet<Member<IntWrapper> > PListSet; 3416 typedef PersistentHeapListHashSet<Member<IntWrapper> > PListSet;
3445 typedef PersistentHeapLinkedHashSet<Member<IntWrapper> > PLinkedSet; 3417 typedef PersistentHeapLinkedHashSet<Member<IntWrapper> > PLinkedSet;
3446 typedef PersistentHeapHashMap<Member<IntWrapper>, Member<IntWrapper> > PMap; 3418 typedef PersistentHeapHashMap<Member<IntWrapper>, Member<IntWrapper> > PMap;
3447 typedef PersistentHeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > W eakPMap; 3419 typedef PersistentHeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > W eakPMap;
3448 typedef PersistentHeapDeque<Member<IntWrapper> > PDeque; 3420 typedef PersistentHeapDeque<Member<IntWrapper> > PDeque;
3449 3421
3450 clearOutOldGarbage(&initialHeapSize); 3422 clearOutOldGarbage();
3451 { 3423 {
3452 PVec pVec; 3424 PVec pVec;
3453 PDeque pDeque; 3425 PDeque pDeque;
3454 PSet pSet; 3426 PSet pSet;
3455 PListSet pListSet; 3427 PListSet pListSet;
3456 PLinkedSet pLinkedSet; 3428 PLinkedSet pLinkedSet;
3457 PMap pMap; 3429 PMap pMap;
3458 WeakPMap wpMap; 3430 WeakPMap wpMap;
3459 3431
3460 IntWrapper* one(IntWrapper::create(1)); 3432 IntWrapper* one(IntWrapper::create(1));
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
3522 EXPECT_EQ(0u, wpMap.size()); 3494 EXPECT_EQ(0u, wpMap.size());
3523 } 3495 }
3524 3496
3525 // Collect previous roots. 3497 // Collect previous roots.
3526 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3498 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3527 EXPECT_EQ(11, IntWrapper::s_destructorCalls); 3499 EXPECT_EQ(11, IntWrapper::s_destructorCalls);
3528 } 3500 }
3529 3501
3530 TEST(HeapTest, CollectionNesting) 3502 TEST(HeapTest, CollectionNesting)
3531 { 3503 {
3532 HeapStats initialStats; 3504 clearOutOldGarbage();
3533 clearOutOldGarbage(&initialStats);
3534 int* key = &IntWrapper::s_destructorCalls; 3505 int* key = &IntWrapper::s_destructorCalls;
3535 IntWrapper::s_destructorCalls = 0; 3506 IntWrapper::s_destructorCalls = 0;
3536 typedef HeapVector<Member<IntWrapper> > IntVector; 3507 typedef HeapVector<Member<IntWrapper> > IntVector;
3537 typedef HeapDeque<Member<IntWrapper> > IntDeque; 3508 typedef HeapDeque<Member<IntWrapper> > IntDeque;
3538 HeapHashMap<void*, IntVector>* map = new HeapHashMap<void*, IntVector>(); 3509 HeapHashMap<void*, IntVector>* map = new HeapHashMap<void*, IntVector>();
3539 HeapHashMap<void*, IntDeque>* map2 = new HeapHashMap<void*, IntDeque>(); 3510 HeapHashMap<void*, IntDeque>* map2 = new HeapHashMap<void*, IntDeque>();
3540 3511
3541 map->add(key, IntVector()); 3512 map->add(key, IntVector());
3542 map2->add(key, IntDeque()); 3513 map2->add(key, IntDeque());
3543 3514
(...skipping 23 matching lines...) Expand all
3567 EXPECT_EQ(1u, map2->get(key).size()); 3538 EXPECT_EQ(1u, map2->get(key).size());
3568 EXPECT_EQ(0, IntWrapper::s_destructorCalls); 3539 EXPECT_EQ(0, IntWrapper::s_destructorCalls);
3569 3540
3570 keepAlive = nullptr; 3541 keepAlive = nullptr;
3571 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3542 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3572 EXPECT_EQ(1, IntWrapper::s_destructorCalls); 3543 EXPECT_EQ(1, IntWrapper::s_destructorCalls);
3573 } 3544 }
3574 3545
3575 TEST(HeapTest, GarbageCollectedMixin) 3546 TEST(HeapTest, GarbageCollectedMixin)
3576 { 3547 {
3577 HeapStats initialHeapStats; 3548 clearOutOldGarbage();
3578 clearOutOldGarbage(&initialHeapStats);
3579 3549
3580 Persistent<UseMixin> usemixin = UseMixin::create(); 3550 Persistent<UseMixin> usemixin = UseMixin::create();
3581 EXPECT_EQ(0, UseMixin::s_traceCount); 3551 EXPECT_EQ(0, UseMixin::s_traceCount);
3582 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3552 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3583 EXPECT_EQ(1, UseMixin::s_traceCount); 3553 EXPECT_EQ(1, UseMixin::s_traceCount);
3584 3554
3585 Persistent<Mixin> mixin = usemixin; 3555 Persistent<Mixin> mixin = usemixin;
3586 usemixin = nullptr; 3556 usemixin = nullptr;
3587 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3557 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3588 EXPECT_EQ(2, UseMixin::s_traceCount); 3558 EXPECT_EQ(2, UseMixin::s_traceCount);
3589 3559
3590 PersistentHeapHashSet<WeakMember<Mixin> > weakMap; 3560 PersistentHeapHashSet<WeakMember<Mixin> > weakMap;
3591 weakMap.add(UseMixin::create()); 3561 weakMap.add(UseMixin::create());
3592 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3562 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3593 EXPECT_EQ(0u, weakMap.size()); 3563 EXPECT_EQ(0u, weakMap.size());
3594 } 3564 }
3595 3565
3596 TEST(HeapTest, CollectionNesting2) 3566 TEST(HeapTest, CollectionNesting2)
3597 { 3567 {
3598 HeapStats initialStats; 3568 clearOutOldGarbage();
3599 clearOutOldGarbage(&initialStats);
3600 void* key = &IntWrapper::s_destructorCalls; 3569 void* key = &IntWrapper::s_destructorCalls;
3601 IntWrapper::s_destructorCalls = 0; 3570 IntWrapper::s_destructorCalls = 0;
3602 typedef HeapHashSet<Member<IntWrapper> > IntSet; 3571 typedef HeapHashSet<Member<IntWrapper> > IntSet;
3603 HeapHashMap<void*, IntSet>* map = new HeapHashMap<void*, IntSet>(); 3572 HeapHashMap<void*, IntSet>* map = new HeapHashMap<void*, IntSet>();
3604 3573
3605 map->add(key, IntSet()); 3574 map->add(key, IntSet());
3606 3575
3607 HeapHashMap<void*, IntSet>::iterator it = map->find(key); 3576 HeapHashMap<void*, IntSet>::iterator it = map->find(key);
3608 EXPECT_EQ(0u, map->get(key).size()); 3577 EXPECT_EQ(0u, map->get(key).size());
3609 3578
3610 it->value.add(IntWrapper::create(42)); 3579 it->value.add(IntWrapper::create(42));
3611 EXPECT_EQ(1u, map->get(key).size()); 3580 EXPECT_EQ(1u, map->get(key).size());
3612 3581
3613 Persistent<HeapHashMap<void*, IntSet> > keepAlive(map); 3582 Persistent<HeapHashMap<void*, IntSet> > keepAlive(map);
3614 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3583 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3615 EXPECT_EQ(1u, map->get(key).size()); 3584 EXPECT_EQ(1u, map->get(key).size());
3616 EXPECT_EQ(0, IntWrapper::s_destructorCalls); 3585 EXPECT_EQ(0, IntWrapper::s_destructorCalls);
3617 } 3586 }
3618 3587
3619 TEST(HeapTest, CollectionNesting3) 3588 TEST(HeapTest, CollectionNesting3)
3620 { 3589 {
3621 HeapStats initialStats; 3590 clearOutOldGarbage();
3622 clearOutOldGarbage(&initialStats);
3623 IntWrapper::s_destructorCalls = 0; 3591 IntWrapper::s_destructorCalls = 0;
3624 typedef HeapVector<Member<IntWrapper> > IntVector; 3592 typedef HeapVector<Member<IntWrapper> > IntVector;
3625 typedef HeapDeque<Member<IntWrapper> > IntDeque; 3593 typedef HeapDeque<Member<IntWrapper> > IntDeque;
3626 HeapVector<IntVector>* vector = new HeapVector<IntVector>(); 3594 HeapVector<IntVector>* vector = new HeapVector<IntVector>();
3627 HeapDeque<IntDeque>* deque = new HeapDeque<IntDeque>(); 3595 HeapDeque<IntDeque>* deque = new HeapDeque<IntDeque>();
3628 3596
3629 vector->append(IntVector()); 3597 vector->append(IntVector());
3630 deque->append(IntDeque()); 3598 deque->append(IntDeque());
3631 3599
3632 HeapVector<IntVector>::iterator it = vector->begin(); 3600 HeapVector<IntVector>::iterator it = vector->begin();
3633 HeapDeque<IntDeque>::iterator it2 = deque->begin(); 3601 HeapDeque<IntDeque>::iterator it2 = deque->begin();
3634 EXPECT_EQ(0u, it->size()); 3602 EXPECT_EQ(0u, it->size());
3635 EXPECT_EQ(0u, it2->size()); 3603 EXPECT_EQ(0u, it2->size());
3636 3604
3637 it->append(IntWrapper::create(42)); 3605 it->append(IntWrapper::create(42));
3638 it2->append(IntWrapper::create(42)); 3606 it2->append(IntWrapper::create(42));
3639 EXPECT_EQ(1u, it->size()); 3607 EXPECT_EQ(1u, it->size());
3640 EXPECT_EQ(1u, it2->size()); 3608 EXPECT_EQ(1u, it2->size());
3641 3609
3642 Persistent<HeapVector<IntVector> > keepAlive(vector); 3610 Persistent<HeapVector<IntVector> > keepAlive(vector);
3643 Persistent<HeapDeque<IntDeque> > keepAlive2(deque); 3611 Persistent<HeapDeque<IntDeque> > keepAlive2(deque);
3644 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3612 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3645 EXPECT_EQ(1u, it->size()); 3613 EXPECT_EQ(1u, it->size());
3646 EXPECT_EQ(1u, it2->size()); 3614 EXPECT_EQ(1u, it2->size());
3647 EXPECT_EQ(0, IntWrapper::s_destructorCalls); 3615 EXPECT_EQ(0, IntWrapper::s_destructorCalls);
3648 } 3616 }
3649 3617
3650 TEST(HeapTest, EmbeddedInVector) 3618 TEST(HeapTest, EmbeddedInVector)
3651 { 3619 {
3652 HeapStats initialStats; 3620 clearOutOldGarbage();
3653 clearOutOldGarbage(&initialStats);
3654 SimpleFinalizedObject::s_destructorCalls = 0; 3621 SimpleFinalizedObject::s_destructorCalls = 0;
3655 { 3622 {
3656 PersistentHeapVector<VectorObject, 2> inlineVector; 3623 PersistentHeapVector<VectorObject, 2> inlineVector;
3657 PersistentHeapVector<VectorObject> outlineVector; 3624 PersistentHeapVector<VectorObject> outlineVector;
3658 VectorObject i1, i2; 3625 VectorObject i1, i2;
3659 inlineVector.append(i1); 3626 inlineVector.append(i1);
3660 inlineVector.append(i2); 3627 inlineVector.append(i2);
3661 3628
3662 VectorObject o1, o2; 3629 VectorObject o1, o2;
3663 outlineVector.append(o1); 3630 outlineVector.append(o1);
(...skipping 18 matching lines...) Expand all
3682 vectorNoTrace.append(n2); 3649 vectorNoTrace.append(n2);
3683 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3650 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3684 EXPECT_EQ(2, SimpleFinalizedObject::s_destructorCalls); 3651 EXPECT_EQ(2, SimpleFinalizedObject::s_destructorCalls);
3685 } 3652 }
3686 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3653 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3687 EXPECT_EQ(8, SimpleFinalizedObject::s_destructorCalls); 3654 EXPECT_EQ(8, SimpleFinalizedObject::s_destructorCalls);
3688 } 3655 }
3689 3656
3690 TEST(HeapTest, EmbeddedInDeque) 3657 TEST(HeapTest, EmbeddedInDeque)
3691 { 3658 {
3692 HeapStats initialStats; 3659 clearOutOldGarbage();
3693 clearOutOldGarbage(&initialStats);
3694 SimpleFinalizedObject::s_destructorCalls = 0; 3660 SimpleFinalizedObject::s_destructorCalls = 0;
3695 { 3661 {
3696 PersistentHeapDeque<VectorObject, 2> inlineDeque; 3662 PersistentHeapDeque<VectorObject, 2> inlineDeque;
3697 PersistentHeapDeque<VectorObject> outlineDeque; 3663 PersistentHeapDeque<VectorObject> outlineDeque;
3698 VectorObject i1, i2; 3664 VectorObject i1, i2;
3699 inlineDeque.append(i1); 3665 inlineDeque.append(i1);
3700 inlineDeque.append(i2); 3666 inlineDeque.append(i2);
3701 3667
3702 VectorObject o1, o2; 3668 VectorObject o1, o2;
3703 outlineDeque.append(o1); 3669 outlineDeque.append(o1);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
3742 3708
3743 TEST(HeapTest, RawPtrInHash) 3709 TEST(HeapTest, RawPtrInHash)
3744 { 3710 {
3745 rawPtrInHashHelper<HashSet<RawPtr<int> > >(); 3711 rawPtrInHashHelper<HashSet<RawPtr<int> > >();
3746 rawPtrInHashHelper<ListHashSet<RawPtr<int> > >(); 3712 rawPtrInHashHelper<ListHashSet<RawPtr<int> > >();
3747 rawPtrInHashHelper<LinkedHashSet<RawPtr<int> > >(); 3713 rawPtrInHashHelper<LinkedHashSet<RawPtr<int> > >();
3748 } 3714 }
3749 3715
3750 TEST(HeapTest, HeapTerminatedArray) 3716 TEST(HeapTest, HeapTerminatedArray)
3751 { 3717 {
3752 HeapStats initialHeapSize; 3718 clearOutOldGarbage();
3753 clearOutOldGarbage(&initialHeapSize);
3754 IntWrapper::s_destructorCalls = 0; 3719 IntWrapper::s_destructorCalls = 0;
3755 3720
3756 HeapTerminatedArray<TerminatedArrayItem>* arr = 0; 3721 HeapTerminatedArray<TerminatedArrayItem>* arr = 0;
3757 3722
3758 const size_t prefixSize = 4; 3723 const size_t prefixSize = 4;
3759 const size_t suffixSize = 4; 3724 const size_t suffixSize = 4;
3760 3725
3761 { 3726 {
3762 HeapTerminatedArrayBuilder<TerminatedArrayItem> builder(arr); 3727 HeapTerminatedArrayBuilder<TerminatedArrayItem> builder(arr);
3763 builder.grow(prefixSize); 3728 builder.grow(prefixSize);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
3797 EXPECT_EQ(i, static_cast<size_t>(arr->at(i).payload()->value())); 3762 EXPECT_EQ(i, static_cast<size_t>(arr->at(i).payload()->value()));
3798 } 3763 }
3799 3764
3800 arr = 0; 3765 arr = 0;
3801 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3766 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3802 EXPECT_EQ(8, IntWrapper::s_destructorCalls); 3767 EXPECT_EQ(8, IntWrapper::s_destructorCalls);
3803 } 3768 }
3804 3769
3805 TEST(HeapTest, HeapLinkedStack) 3770 TEST(HeapTest, HeapLinkedStack)
3806 { 3771 {
3807 HeapStats initialHeapSize; 3772 clearOutOldGarbage();
3808 clearOutOldGarbage(&initialHeapSize);
3809 IntWrapper::s_destructorCalls = 0; 3773 IntWrapper::s_destructorCalls = 0;
3810 3774
3811 HeapLinkedStack<TerminatedArrayItem>* stack = new HeapLinkedStack<Terminated ArrayItem>(); 3775 HeapLinkedStack<TerminatedArrayItem>* stack = new HeapLinkedStack<Terminated ArrayItem>();
3812 3776
3813 const size_t stackSize = 10; 3777 const size_t stackSize = 10;
3814 3778
3815 for (size_t i = 0; i < stackSize; i++) 3779 for (size_t i = 0; i < stackSize; i++)
3816 stack->push(TerminatedArrayItem(IntWrapper::create(i))); 3780 stack->push(TerminatedArrayItem(IntWrapper::create(i)));
3817 3781
3818 Heap::collectGarbage(ThreadState::HeapPointersOnStack); 3782 Heap::collectGarbage(ThreadState::HeapPointersOnStack);
3819 EXPECT_EQ(0, IntWrapper::s_destructorCalls); 3783 EXPECT_EQ(0, IntWrapper::s_destructorCalls);
3820 EXPECT_EQ(stackSize, stack->size()); 3784 EXPECT_EQ(stackSize, stack->size());
3821 while (!stack->isEmpty()) { 3785 while (!stack->isEmpty()) {
3822 EXPECT_EQ(stack->size() - 1, static_cast<size_t>(stack->peek().payload() ->value())); 3786 EXPECT_EQ(stack->size() - 1, static_cast<size_t>(stack->peek().payload() ->value()));
3823 stack->pop(); 3787 stack->pop();
3824 } 3788 }
3825 3789
3826 Persistent<HeapLinkedStack<TerminatedArrayItem> > pStack = stack; 3790 Persistent<HeapLinkedStack<TerminatedArrayItem> > pStack = stack;
3827 3791
3828 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3792 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3829 EXPECT_EQ(stackSize, static_cast<size_t>(IntWrapper::s_destructorCalls)); 3793 EXPECT_EQ(stackSize, static_cast<size_t>(IntWrapper::s_destructorCalls));
3830 EXPECT_EQ(0u, pStack->size()); 3794 EXPECT_EQ(0u, pStack->size());
3831 } 3795 }
3832 3796
3833 TEST(HeapTest, AllocationDuringFinalization) 3797 TEST(HeapTest, AllocationDuringFinalization)
3834 { 3798 {
3835 HeapStats initialHeapSize; 3799 clearOutOldGarbage();
3836 clearOutOldGarbage(&initialHeapSize);
3837 IntWrapper::s_destructorCalls = 0; 3800 IntWrapper::s_destructorCalls = 0;
3838 OneKiloByteObject::s_destructorCalls = 0; 3801 OneKiloByteObject::s_destructorCalls = 0;
3839 3802
3840 Persistent<IntWrapper> wrapper; 3803 Persistent<IntWrapper> wrapper;
3841 new FinalizationAllocator(&wrapper); 3804 new FinalizationAllocator(&wrapper);
3842 3805
3843 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3806 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3844 EXPECT_EQ(0, IntWrapper::s_destructorCalls); 3807 EXPECT_EQ(0, IntWrapper::s_destructorCalls);
3845 // Check that the wrapper allocated during finalization is not 3808 // Check that the wrapper allocated during finalization is not
3846 // swept away and zapped later in the same sweeping phase. 3809 // swept away and zapped later in the same sweeping phase.
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
3982 }; 3945 };
3983 3946
3984 static const bool s_isMixinTrue = IsGarbageCollectedMixin<MultipleMixins>::value ; 3947 static const bool s_isMixinTrue = IsGarbageCollectedMixin<MultipleMixins>::value ;
3985 static const bool s_isMixinFalse = IsGarbageCollectedMixin<IntWrapper>::value; 3948 static const bool s_isMixinFalse = IsGarbageCollectedMixin<IntWrapper>::value;
3986 3949
3987 TEST(HeapTest, MultipleMixins) 3950 TEST(HeapTest, MultipleMixins)
3988 { 3951 {
3989 EXPECT_TRUE(s_isMixinTrue); 3952 EXPECT_TRUE(s_isMixinTrue);
3990 EXPECT_FALSE(s_isMixinFalse); 3953 EXPECT_FALSE(s_isMixinFalse);
3991 3954
3992 HeapStats initialHeapSize; 3955 clearOutOldGarbage();
3993 clearOutOldGarbage(&initialHeapSize);
3994 IntWrapper::s_destructorCalls = 0; 3956 IntWrapper::s_destructorCalls = 0;
3995 MultipleMixins* obj = new MultipleMixins(); 3957 MultipleMixins* obj = new MultipleMixins();
3996 { 3958 {
3997 Persistent<MixinA> a = obj; 3959 Persistent<MixinA> a = obj;
3998 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3960 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3999 EXPECT_EQ(0, IntWrapper::s_destructorCalls); 3961 EXPECT_EQ(0, IntWrapper::s_destructorCalls);
4000 } 3962 }
4001 { 3963 {
4002 Persistent<MixinB> b = obj; 3964 Persistent<MixinB> b = obj;
4003 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3965 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
4138 TEST(HeapTest, SetWithCustomWeaknessHandling) 4100 TEST(HeapTest, SetWithCustomWeaknessHandling)
4139 { 4101 {
4140 setWithCustomWeaknessHandling<HeapHashSet<PairWithWeakHandling> >(); 4102 setWithCustomWeaknessHandling<HeapHashSet<PairWithWeakHandling> >();
4141 setWithCustomWeaknessHandling<HeapLinkedHashSet<PairWithWeakHandling> >(); 4103 setWithCustomWeaknessHandling<HeapLinkedHashSet<PairWithWeakHandling> >();
4142 } 4104 }
4143 4105
4144 TEST(HeapTest, MapWithCustomWeaknessHandling) 4106 TEST(HeapTest, MapWithCustomWeaknessHandling)
4145 { 4107 {
4146 typedef HeapHashMap<PairWithWeakHandling, RefPtr<OffHeapInt> > Map; 4108 typedef HeapHashMap<PairWithWeakHandling, RefPtr<OffHeapInt> > Map;
4147 typedef Map::iterator Iterator; 4109 typedef Map::iterator Iterator;
4148 HeapStats initialHeapSize; 4110 clearOutOldGarbage();
4149 clearOutOldGarbage(&initialHeapSize);
4150 OffHeapInt::s_destructorCalls = 0; 4111 OffHeapInt::s_destructorCalls = 0;
4151 4112
4152 Persistent<Map> map1(new Map()); 4113 Persistent<Map> map1(new Map());
4153 Persistent<IntWrapper> livingInt(IntWrapper::create(42)); 4114 Persistent<IntWrapper> livingInt(IntWrapper::create(42));
4154 { 4115 {
4155 Map map2; 4116 Map map2;
4156 Map* map3 = new Map(); 4117 Map* map3 = new Map();
4157 map2.add(PairWithWeakHandling(IntWrapper::create(0), IntWrapper::create( 1)), OffHeapInt::create(1001)); 4118 map2.add(PairWithWeakHandling(IntWrapper::create(0), IntWrapper::create( 1)), OffHeapInt::create(1001));
4158 map3->add(PairWithWeakHandling(IntWrapper::create(2), IntWrapper::create (3)), OffHeapInt::create(1002)); 4119 map3->add(PairWithWeakHandling(IntWrapper::create(2), IntWrapper::create (3)), OffHeapInt::create(1002));
4159 map1->add(PairWithWeakHandling(IntWrapper::create(4), IntWrapper::create (5)), OffHeapInt::create(1003)); 4120 map1->add(PairWithWeakHandling(IntWrapper::create(4), IntWrapper::create (5)), OffHeapInt::create(1003));
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
4208 EXPECT_EQ(livingInt, i1->key.second); 4169 EXPECT_EQ(livingInt, i1->key.second);
4209 ++i1; 4170 ++i1;
4210 EXPECT_TRUE(i1->key.first->value() == 103 || i1->key.first == livingInt); 4171 EXPECT_TRUE(i1->key.first->value() == 103 || i1->key.first == livingInt);
4211 EXPECT_EQ(livingInt, i1->key.second); 4172 EXPECT_EQ(livingInt, i1->key.second);
4212 } 4173 }
4213 4174
4214 TEST(HeapTest, MapWithCustomWeaknessHandling2) 4175 TEST(HeapTest, MapWithCustomWeaknessHandling2)
4215 { 4176 {
4216 typedef HeapHashMap<RefPtr<OffHeapInt>, PairWithWeakHandling> Map; 4177 typedef HeapHashMap<RefPtr<OffHeapInt>, PairWithWeakHandling> Map;
4217 typedef Map::iterator Iterator; 4178 typedef Map::iterator Iterator;
4218 HeapStats initialHeapSize; 4179 clearOutOldGarbage();
4219 clearOutOldGarbage(&initialHeapSize);
4220 OffHeapInt::s_destructorCalls = 0; 4180 OffHeapInt::s_destructorCalls = 0;
4221 4181
4222 Persistent<Map> map1(new Map()); 4182 Persistent<Map> map1(new Map());
4223 Persistent<IntWrapper> livingInt(IntWrapper::create(42)); 4183 Persistent<IntWrapper> livingInt(IntWrapper::create(42));
4224 4184
4225 { 4185 {
4226 Map map2; 4186 Map map2;
4227 Map* map3 = new Map(); 4187 Map* map3 = new Map();
4228 map2.add(OffHeapInt::create(1001), PairWithWeakHandling(IntWrapper::crea te(0), IntWrapper::create(1))); 4188 map2.add(OffHeapInt::create(1001), PairWithWeakHandling(IntWrapper::crea te(0), IntWrapper::create(1)));
4229 map3->add(OffHeapInt::create(1002), PairWithWeakHandling(IntWrapper::cre ate(2), IntWrapper::create(3))); 4189 map3->add(OffHeapInt::create(1002), PairWithWeakHandling(IntWrapper::cre ate(2), IntWrapper::create(3)));
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
4353 // 1) We can't just override the HashTrait for the type since this would affect 4313 // 1) We can't just override the HashTrait for the type since this would affect
4354 // all collections that use this kind of weak set. Instead we have our own 4314 // all collections that use this kind of weak set. Instead we have our own
4355 // traits and use a map with custom traits for the value type. These traits 4315 // traits and use a map with custom traits for the value type. These traits
4356 // are the 5th template parameter, so we have to supply default values for 4316 // are the 5th template parameter, so we have to supply default values for
4357 // the 3rd and 4th template parameters 4317 // the 3rd and 4th template parameters
4358 // 2) We can't just inherit from WeakHandlingHashTraits, since that trait 4318 // 2) We can't just inherit from WeakHandlingHashTraits, since that trait
4359 // assumes we can add methods to the type, but we can't add methods to 4319 // assumes we can add methods to the type, but we can't add methods to
4360 // HeapHashSet. 4320 // HeapHashSet.
4361 TEST(HeapTest, RemoveEmptySets) 4321 TEST(HeapTest, RemoveEmptySets)
4362 { 4322 {
4363 HeapStats initialHeapSize; 4323 clearOutOldGarbage();
4364 clearOutOldGarbage(&initialHeapSize);
4365 OffHeapInt::s_destructorCalls = 0; 4324 OffHeapInt::s_destructorCalls = 0;
4366 4325
4367 Persistent<IntWrapper> livingInt(IntWrapper::create(42)); 4326 Persistent<IntWrapper> livingInt(IntWrapper::create(42));
4368 4327
4369 typedef RefPtr<OffHeapInt> Key; 4328 typedef RefPtr<OffHeapInt> Key;
4370 typedef HeapHashMap<Key, WeakSet, WTF::DefaultHash<Key>::Hash, HashTraits<Ke y>, EmptyClearingHashSetTraits> Map; 4329 typedef HeapHashMap<Key, WeakSet, WTF::DefaultHash<Key>::Hash, HashTraits<Ke y>, EmptyClearingHashSetTraits> Map;
4371 Persistent<Map> map(new Map()); 4330 Persistent<Map> map(new Map());
4372 map->add(OffHeapInt::create(1), WeakSet()); 4331 map->add(OffHeapInt::create(1), WeakSet());
4373 { 4332 {
4374 WeakSet& set = map->begin()->value; 4333 WeakSet& set = map->begin()->value;
(...skipping 1015 matching lines...) Expand 10 before | Expand all | Expand 10 after
5390 TEST(HeapTest, NonNodeAllocatingNodeInDestructor) 5349 TEST(HeapTest, NonNodeAllocatingNodeInDestructor)
5391 { 5350 {
5392 new NonNodeAllocatingNodeInDestructor(); 5351 new NonNodeAllocatingNodeInDestructor();
5393 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 5352 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
5394 EXPECT_EQ(10, (*NonNodeAllocatingNodeInDestructor::s_node)->value()); 5353 EXPECT_EQ(10, (*NonNodeAllocatingNodeInDestructor::s_node)->value());
5395 delete NonNodeAllocatingNodeInDestructor::s_node; 5354 delete NonNodeAllocatingNodeInDestructor::s_node;
5396 NonNodeAllocatingNodeInDestructor::s_node = 0; 5355 NonNodeAllocatingNodeInDestructor::s_node = 0;
5397 } 5356 }
5398 5357
5399 } // namespace blink 5358 } // namespace blink
OLDNEW
« no previous file with comments | « Source/platform/heap/Heap.cpp ('k') | Source/platform/heap/ThreadState.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698