Chromium Code Reviews

Side by Side Diff: src/heap/heap.cc

Issue 1316873004: heap: make array buffer maps disjoint (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
« no previous file with comments | « src/heap/heap.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/heap/heap.h" 5 #include "src/heap/heap.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 1718 matching lines...)
1729 } 1729 }
1730 1730
1731 1731
1732 void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) { 1732 void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) {
1733 Object* head = VisitWeakList<Context>(this, native_contexts_list(), retainer); 1733 Object* head = VisitWeakList<Context>(this, native_contexts_list(), retainer);
1734 // Update the head of the list of contexts. 1734 // Update the head of the list of contexts.
1735 set_native_contexts_list(head); 1735 set_native_contexts_list(head);
1736 } 1736 }
1737 1737
1738 1738
1739 void Heap::RegisterNewArrayBufferHelper(std::map<void*, size_t>& live_buffers, 1739 void Heap::RegisterNewArrayBufferHelper(std::map<void*, size_t>& live_buffers,
Michael Lippautz 2015/08/28 08:05:02 Please get rid of this function and inline it into
fedor.indutny 2015/08/28 11:03:34 Acknowledged.
1740 void* data, size_t length) { 1740 void* data, size_t length) {
1741 live_buffers[data] = length; 1741 live_buffers[data] = length;
1742 } 1742 }
1743 1743
1744 1744
1745 void Heap::UnregisterArrayBufferHelper( 1745 void Heap::UnregisterArrayBufferHelper(
Michael Lippautz 2015/08/28 08:05:02 Ditto, please inline the call manually.
fedor.indutny 2015/08/28 11:03:34 Acknowledged.
1746 std::map<void*, size_t>& live_buffers, 1746 std::map<void*, size_t>& live_buffers,
1747 std::map<void*, size_t>& not_yet_discovered_buffers, void* data) { 1747 std::map<void*, size_t>& not_yet_discovered_buffers, void* data) {
1748 DCHECK(live_buffers.count(data) > 0); 1748 DCHECK(live_buffers.count(data) > 0);
1749 live_buffers.erase(data); 1749 live_buffers.erase(data);
1750 not_yet_discovered_buffers.erase(data); 1750 not_yet_discovered_buffers.erase(data);
1751 } 1751 }
1752 1752
1753 1753
1754 void Heap::RegisterLiveArrayBufferHelper( 1754 void Heap::RegisterLiveArrayBufferHelper(
Michael Lippautz 2015/08/28 08:05:02 Please get rid of this function and inline it into
fedor.indutny 2015/08/28 11:03:34 Acknowledged.
1755 std::map<void*, size_t>& not_yet_discovered_buffers, void* data) { 1755 std::map<void*, size_t>& not_yet_discovered_buffers, void* data) {
1756 not_yet_discovered_buffers.erase(data); 1756 not_yet_discovered_buffers.erase(data);
1757 } 1757 }
1758 1758
1759 1759
1760 size_t Heap::FreeDeadArrayBuffersHelper( 1760 size_t Heap::FreeDeadArrayBuffersHelper(
Michael Lippautz 2015/08/28 08:05:02 We should get rid of this one. See below.
fedor.indutny 2015/08/28 11:03:34 Acknowledged.
1761 Isolate* isolate, std::map<void*, size_t>& live_buffers, 1761 Isolate* isolate, bool from_scavenge,
1762 std::map<void*, size_t>& not_yet_discovered_buffers) { 1762 std::map<void*, size_t>& not_yet_discovered_buffers) {
1763 size_t freed_memory = 0; 1763 size_t freed_memory = 0;
1764 for (auto buffer = not_yet_discovered_buffers.begin(); 1764 for (auto buffer = not_yet_discovered_buffers.begin();
1765 buffer != not_yet_discovered_buffers.end(); ++buffer) { 1765 buffer != not_yet_discovered_buffers.end(); ++buffer) {
1766 isolate->array_buffer_allocator()->Free(buffer->first, buffer->second); 1766 isolate->array_buffer_allocator()->Free(buffer->first, buffer->second);
1767 freed_memory += buffer->second; 1767 freed_memory += buffer->second;
1768 live_buffers.erase(buffer->first); 1768 if (!from_scavenge) {
1769 live_array_buffers_.erase(buffer->first);
1770 }
1771 live_array_buffers_for_scavenge_.erase(buffer->first);
1769 } 1772 }
1770 not_yet_discovered_buffers = live_buffers; 1773 if (from_scavenge) {
1774 not_yet_discovered_buffers = live_array_buffers_for_scavenge_;
1775 } else {
1776 not_yet_discovered_buffers = live_array_buffers_;
1777 not_yet_discovered_buffers.insert(live_array_buffers_for_scavenge_.begin(),
1778 live_array_buffers_for_scavenge_.end());
1779 }
1771 return freed_memory; 1780 return freed_memory;
1772 } 1781 }
1773 1782
1774 1783
1775 void Heap::TearDownArrayBuffersHelper( 1784 void Heap::TearDownArrayBuffersHelper(
Michael Lippautz 2015/08/28 08:05:02 Also inline please.
fedor.indutny 2015/08/28 10:02:37 This one is going to result in duplicated code, is
fedor.indutny 2015/08/28 11:03:34 Acknowledged.
1776 Isolate* isolate, std::map<void*, size_t>& live_buffers, 1785 Isolate* isolate, std::map<void*, size_t>& live_buffers,
1777 std::map<void*, size_t>& not_yet_discovered_buffers) { 1786 std::map<void*, size_t>& not_yet_discovered_buffers) {
1778 for (auto buffer = live_buffers.begin(); buffer != live_buffers.end(); 1787 for (auto buffer = live_buffers.begin(); buffer != live_buffers.end();
1779 ++buffer) { 1788 ++buffer) {
1780 isolate->array_buffer_allocator()->Free(buffer->first, buffer->second); 1789 isolate->array_buffer_allocator()->Free(buffer->first, buffer->second);
1781 } 1790 }
1782 live_buffers.clear(); 1791 live_buffers.clear();
1783 not_yet_discovered_buffers.clear(); 1792 not_yet_discovered_buffers.clear();
1784 } 1793 }
1785 1794
1786 1795
1787 void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data, 1796 void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data,
1788 size_t length) { 1797 size_t length) {
1789 if (!data) return; 1798 if (!data) return;
1790 RegisterNewArrayBufferHelper(live_array_buffers_, data, length);
1791 if (in_new_space) { 1799 if (in_new_space) {
1792 RegisterNewArrayBufferHelper(live_array_buffers_for_scavenge_, data, 1800 RegisterNewArrayBufferHelper(live_array_buffers_for_scavenge_, data,
1793 length); 1801 length);
1802 } else {
1803 RegisterNewArrayBufferHelper(live_array_buffers_, data, length);
1794 } 1804 }
1795 reinterpret_cast<v8::Isolate*>(isolate_) 1805 reinterpret_cast<v8::Isolate*>(isolate_)
1796 ->AdjustAmountOfExternalAllocatedMemory(length); 1806 ->AdjustAmountOfExternalAllocatedMemory(length);
1797 } 1807 }
1798 1808
1799 1809
1800 void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) { 1810 void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) {
1801 if (!data) return; 1811 if (!data) return;
1802 UnregisterArrayBufferHelper(live_array_buffers_,
1803 not_yet_discovered_array_buffers_, data);
1804 if (in_new_space) { 1812 if (in_new_space) {
1805 UnregisterArrayBufferHelper(live_array_buffers_for_scavenge_, 1813 UnregisterArrayBufferHelper(live_array_buffers_for_scavenge_,
1806 not_yet_discovered_array_buffers_for_scavenge_, 1814 not_yet_discovered_array_buffers_for_scavenge_,
1807 data); 1815 data);
1816 not_yet_discovered_array_buffers_.erase(data);
1817 } else {
1818 UnregisterArrayBufferHelper(live_array_buffers_,
1819 not_yet_discovered_array_buffers_, data);
1808 } 1820 }
1809 } 1821 }
1810 1822
1811 1823
1812 void Heap::RegisterLiveArrayBuffer(bool from_scavenge, void* data) { 1824 void Heap::RegisterLiveArrayBuffer(bool from_scavenge, void* data) {
1813 // ArrayBuffer might be in the middle of being constructed. 1825 // ArrayBuffer might be in the middle of being constructed.
1814 if (data == undefined_value()) return; 1826 if (data == undefined_value()) return;
1815 RegisterLiveArrayBufferHelper( 1827 RegisterLiveArrayBufferHelper(
1816 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ 1828 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_
1817 : not_yet_discovered_array_buffers_, 1829 : not_yet_discovered_array_buffers_,
1818 data); 1830 data);
1819 } 1831 }
1820 1832
1821 1833
1822 void Heap::FreeDeadArrayBuffers(bool from_scavenge) { 1834 void Heap::FreeDeadArrayBuffers(bool from_scavenge) {
Michael Lippautz 2015/08/28 08:05:02 The logic here is way too complicated as the seman
fedor.indutny 2015/08/28 11:03:34 Acknowledged.
1823 if (from_scavenge) { 1835 if (from_scavenge) {
1824 for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) { 1836 for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) {
1825 not_yet_discovered_array_buffers_.erase(buffer.first); 1837 not_yet_discovered_array_buffers_.erase(buffer.first);
1826 live_array_buffers_.erase(buffer.first);
1827 } 1838 }
1828 } else { 1839 } else {
1829 for (auto& buffer : not_yet_discovered_array_buffers_) { 1840 for (auto& buffer : not_yet_discovered_array_buffers_) {
1830 // Scavenge can't happend during evacuation, so we only need to update 1841 // Scavenge can't happend during evacuation, so we only need to update
1831 // live_array_buffers_for_scavenge_. 1842 // live_array_buffers_for_scavenge_.
1832 // not_yet_discovered_array_buffers_for_scanvenge_ will be reset before 1843 // not_yet_discovered_array_buffers_for_scanvenge_ will be reset before
1833 // the next scavenge run in PrepareArrayBufferDiscoveryInNewSpace. 1844 // the next scavenge run in PrepareArrayBufferDiscoveryInNewSpace.
1834 live_array_buffers_for_scavenge_.erase(buffer.first); 1845 live_array_buffers_for_scavenge_.erase(buffer.first);
1835 } 1846 }
1836 } 1847 }
1837 size_t freed_memory = FreeDeadArrayBuffersHelper( 1848 size_t freed_memory = FreeDeadArrayBuffersHelper(
1838 isolate_, 1849 isolate_,
1839 from_scavenge ? live_array_buffers_for_scavenge_ : live_array_buffers_, 1850 from_scavenge,
1840 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ 1851 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_
1841 : not_yet_discovered_array_buffers_); 1852 : not_yet_discovered_array_buffers_);
1842 if (freed_memory) { 1853 if (freed_memory) {
1843 reinterpret_cast<v8::Isolate*>(isolate_) 1854 reinterpret_cast<v8::Isolate*>(isolate_)
1844 ->AdjustAmountOfExternalAllocatedMemory( 1855 ->AdjustAmountOfExternalAllocatedMemory(
1845 -static_cast<int64_t>(freed_memory)); 1856 -static_cast<int64_t>(freed_memory));
1846 } 1857 }
1847 } 1858 }
1848 1859
1849 1860
1850 void Heap::TearDownArrayBuffers() { 1861 void Heap::TearDownArrayBuffers() {
1851 TearDownArrayBuffersHelper(isolate_, live_array_buffers_, 1862 TearDownArrayBuffersHelper(isolate_, live_array_buffers_,
1852 not_yet_discovered_array_buffers_); 1863 not_yet_discovered_array_buffers_);
1864 TearDownArrayBuffersHelper(isolate_, live_array_buffers_for_scavenge_,
1865 not_yet_discovered_array_buffers_for_scavenge_);
1853 } 1866 }
1854 1867
1855 1868
1856 void Heap::PrepareArrayBufferDiscoveryInNewSpace() { 1869 void Heap::PrepareArrayBufferDiscoveryInNewSpace() {
1857 not_yet_discovered_array_buffers_for_scavenge_ = 1870 not_yet_discovered_array_buffers_for_scavenge_ =
1858 live_array_buffers_for_scavenge_; 1871 live_array_buffers_for_scavenge_;
1859 } 1872 }
1860 1873
1861 1874
1862 void Heap::PromoteArrayBuffer(Object* obj) { 1875 void Heap::PromoteArrayBuffer(Object* obj) {
1863 JSArrayBuffer* buffer = JSArrayBuffer::cast(obj); 1876 JSArrayBuffer* buffer = JSArrayBuffer::cast(obj);
1864 if (buffer->is_external()) return; 1877 if (buffer->is_external()) return;
1865 void* data = buffer->backing_store(); 1878 void* data = buffer->backing_store();
1866 if (!data) return; 1879 if (!data) return;
1867 // ArrayBuffer might be in the middle of being constructed. 1880 // ArrayBuffer might be in the middle of being constructed.
1868 if (data == undefined_value()) return; 1881 if (data == undefined_value()) return;
1869 DCHECK(live_array_buffers_for_scavenge_.count(data) > 0); 1882 DCHECK(live_array_buffers_for_scavenge_.count(data) > 0);
1870 DCHECK(live_array_buffers_.count(data) > 0); 1883 live_array_buffers_[data] = live_array_buffers_for_scavenge_[data];
1871 live_array_buffers_for_scavenge_.erase(data); 1884 live_array_buffers_for_scavenge_.erase(data);
1872 not_yet_discovered_array_buffers_for_scavenge_.erase(data); 1885 not_yet_discovered_array_buffers_for_scavenge_.erase(data);
1873 } 1886 }
1874 1887
1875 1888
1876 void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) { 1889 void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) {
1877 Object* allocation_site_obj = 1890 Object* allocation_site_obj =
1878 VisitWeakList<AllocationSite>(this, allocation_sites_list(), retainer); 1891 VisitWeakList<AllocationSite>(this, allocation_sites_list(), retainer);
1879 set_allocation_sites_list(allocation_site_obj); 1892 set_allocation_sites_list(allocation_site_obj);
1880 } 1893 }
(...skipping 4894 matching lines...)
6775 *object_type = "CODE_TYPE"; \ 6788 *object_type = "CODE_TYPE"; \
6776 *object_sub_type = "CODE_AGE/" #name; \ 6789 *object_sub_type = "CODE_AGE/" #name; \
6777 return true; 6790 return true;
6778 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) 6791 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME)
6779 #undef COMPARE_AND_RETURN_NAME 6792 #undef COMPARE_AND_RETURN_NAME
6780 } 6793 }
6781 return false; 6794 return false;
6782 } 6795 }
6783 } // namespace internal 6796 } // namespace internal
6784 } // namespace v8 6797 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine