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

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: completely disjoint sets Created 5 years, 3 months 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
« 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...) Expand 10 before | Expand all | Expand 10 after
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,
1740 void* data, size_t length) {
1741 live_buffers[data] = length;
1742 }
1743
1744
1745 void Heap::UnregisterArrayBufferHelper(
1746 std::map<void*, size_t>& live_buffers,
1747 std::map<void*, size_t>& not_yet_discovered_buffers, void* data) {
1748 DCHECK(live_buffers.count(data) > 0);
1749 live_buffers.erase(data);
1750 not_yet_discovered_buffers.erase(data);
1751 }
1752
1753
1754 void Heap::RegisterLiveArrayBufferHelper(
1755 std::map<void*, size_t>& not_yet_discovered_buffers, void* data) {
1756 not_yet_discovered_buffers.erase(data);
1757 }
1758
1759
1760 size_t Heap::FreeDeadArrayBuffersHelper(
1761 Isolate* isolate, std::map<void*, size_t>& live_buffers,
1762 std::map<void*, size_t>& not_yet_discovered_buffers) {
1763 size_t freed_memory = 0;
1764 for (auto buffer = not_yet_discovered_buffers.begin();
1765 buffer != not_yet_discovered_buffers.end(); ++buffer) {
1766 isolate->array_buffer_allocator()->Free(buffer->first, buffer->second);
1767 freed_memory += buffer->second;
1768 live_buffers.erase(buffer->first);
1769 }
1770 not_yet_discovered_buffers = live_buffers;
1771 return freed_memory;
1772 }
1773
1774
1775 void Heap::TearDownArrayBuffersHelper(
1776 Isolate* isolate, std::map<void*, size_t>& live_buffers,
1777 std::map<void*, size_t>& not_yet_discovered_buffers) {
1778 for (auto buffer = live_buffers.begin(); buffer != live_buffers.end();
1779 ++buffer) {
1780 isolate->array_buffer_allocator()->Free(buffer->first, buffer->second);
1781 }
1782 live_buffers.clear();
1783 not_yet_discovered_buffers.clear();
1784 }
1785
1786
1787 void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data, 1739 void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data,
1788 size_t length) { 1740 size_t length) {
1789 if (!data) return; 1741 if (!data) return;
1790 RegisterNewArrayBufferHelper(live_array_buffers_, data, length);
1791 if (in_new_space) { 1742 if (in_new_space) {
1792 RegisterNewArrayBufferHelper(live_array_buffers_for_scavenge_, data, 1743 live_array_buffers_for_scavenge_[data] = length;
1793 length); 1744 } else {
1745 live_array_buffers_[data] = length;
1794 } 1746 }
1795 reinterpret_cast<v8::Isolate*>(isolate_) 1747 reinterpret_cast<v8::Isolate*>(isolate_)
1796 ->AdjustAmountOfExternalAllocatedMemory(length); 1748 ->AdjustAmountOfExternalAllocatedMemory(length);
1797 } 1749 }
1798 1750
1799 1751
1800 void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) { 1752 void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) {
1801 if (!data) return; 1753 if (!data) return;
1802 UnregisterArrayBufferHelper(live_array_buffers_, 1754
1803 not_yet_discovered_array_buffers_, data); 1755 std::map<void*, size_t>* live_buffers =
1804 if (in_new_space) { 1756 in_new_space ? &live_array_buffers_for_scavenge_ : &live_array_buffers_;
1805 UnregisterArrayBufferHelper(live_array_buffers_for_scavenge_, 1757 std::map<void*, size_t>* not_yet_discovered_buffers =
1806 not_yet_discovered_array_buffers_for_scavenge_, 1758 in_new_space ? &not_yet_discovered_array_buffers_for_scavenge_
1807 data); 1759 : &not_yet_discovered_array_buffers_;
1808 } 1760
1761 DCHECK(live->buffers->count(data) > 0);
1762 live_buffers->erase(data);
1763 not_yet_discovered_buffers->erase(data);
1809 } 1764 }
1810 1765
1811 1766
1812 void Heap::RegisterLiveArrayBuffer(bool from_scavenge, void* data) { 1767 void Heap::RegisterLiveArrayBuffer(bool from_scavenge, void* data) {
1813 // ArrayBuffer might be in the middle of being constructed. 1768 // ArrayBuffer might be in the middle of being constructed.
1814 if (data == undefined_value()) return; 1769 if (data == undefined_value()) return;
1815 RegisterLiveArrayBufferHelper( 1770 if (from_scavenge) {
1816 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ 1771 not_yet_discovered_array_buffers_for_scavenge_.erase(data);
1817 : not_yet_discovered_array_buffers_, 1772 } else if (!not_yet_discovered_array_buffers_.erase(data)) {
1818 data); 1773 not_yet_discovered_array_buffers_for_scavenge_.erase(data);
1774 }
1819 } 1775 }
1820 1776
1821 1777
1822 void Heap::FreeDeadArrayBuffers(bool from_scavenge) { 1778 void Heap::FreeDeadArrayBuffers(bool from_scavenge) {
1779 std::map<void*, size_t> not_yet_discovered_buffers;
1823 if (from_scavenge) { 1780 if (from_scavenge) {
1824 for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) { 1781 not_yet_discovered_buffers = not_yet_discovered_array_buffers_for_scavenge_;
1825 not_yet_discovered_array_buffers_.erase(buffer.first); 1782 } else {
1783 not_yet_discovered_buffers = not_yet_discovered_array_buffers_;
1784 }
1785
1786 size_t freed_memory = 0;
1787 for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) {
1788 isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
1789 freed_memory += buffer.second;
1790 live_array_buffers_for_scavenge_.erase(buffer.first);
1791 }
1792
1793 if (!from_scavenge) {
1794 for (auto& buffer : not_yet_discovered_array_buffers_) {
1795 isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
1796 freed_memory += buffer.second;
1826 live_array_buffers_.erase(buffer.first); 1797 live_array_buffers_.erase(buffer.first);
1827 } 1798 }
1828 } else {
1829 for (auto& buffer : not_yet_discovered_array_buffers_) {
1830 // Scavenge can't happend during evacuation, so we only need to update
1831 // live_array_buffers_for_scavenge_.
1832 // not_yet_discovered_array_buffers_for_scanvenge_ will be reset before
1833 // the next scavenge run in PrepareArrayBufferDiscoveryInNewSpace.
1834 live_array_buffers_for_scavenge_.erase(buffer.first);
1835 }
1836 } 1799 }
1837 size_t freed_memory = FreeDeadArrayBuffersHelper( 1800
1838 isolate_, 1801 not_yet_discovered_array_buffers_for_scavenge_ =
1839 from_scavenge ? live_array_buffers_for_scavenge_ : live_array_buffers_, 1802 live_array_buffers_for_scavenge_;
1840 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ 1803 if (!from_scavenge) not_yet_discovered_array_buffers_ = live_array_buffers_;
1841 : not_yet_discovered_array_buffers_); 1804
1842 if (freed_memory) { 1805 if (freed_memory) {
Michael Lippautz 2015/08/31 06:33:45 Let's make this explcit, i.e., freed_memory > 0
fedor.indutny 2015/09/01 08:50:08 Acknowledged.
1843 reinterpret_cast<v8::Isolate*>(isolate_) 1806 reinterpret_cast<v8::Isolate*>(isolate_)
1844 ->AdjustAmountOfExternalAllocatedMemory( 1807 ->AdjustAmountOfExternalAllocatedMemory(
1845 -static_cast<int64_t>(freed_memory)); 1808 -static_cast<int64_t>(freed_memory));
1846 } 1809 }
1847 } 1810 }
1848 1811
1849 1812
1850 void Heap::TearDownArrayBuffers() { 1813 void Heap::TearDownArrayBuffers() {
1851 TearDownArrayBuffersHelper(isolate_, live_array_buffers_, 1814 size_t freed_memory = 0;
1852 not_yet_discovered_array_buffers_); 1815 for (auto& buffer : live_array_buffers_) {
1816 isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
1817 freed_memory += buffer.second;
1818 }
1819 for (auto& buffer : live_array_buffers_for_scavenge_) {
1820 isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
1821 freed_memory += buffer.second;
1822 }
1823 live_array_buffers_.clear();
1824 live_array_buffers_for_scavenge_.clear();
1825 not_yet_discovered_array_buffers_.clear();
1826 not_yet_discovered_array_buffers_for_scavenge_.clear();
1827
1828 if (freed_memory) {
Michael Lippautz 2015/08/31 06:33:45 Ditto here.
fedor.indutny 2015/09/01 08:50:08 Acknowledged.
1829 reinterpret_cast<v8::Isolate*>(isolate_)
1830 ->AdjustAmountOfExternalAllocatedMemory(
1831 -static_cast<int64_t>(freed_memory));
1832 }
1853 } 1833 }
1854 1834
1855 1835
1856 void Heap::PrepareArrayBufferDiscoveryInNewSpace() { 1836 void Heap::PrepareArrayBufferDiscoveryInNewSpace() {
1857 not_yet_discovered_array_buffers_for_scavenge_ = 1837 not_yet_discovered_array_buffers_for_scavenge_ =
1858 live_array_buffers_for_scavenge_; 1838 live_array_buffers_for_scavenge_;
1859 } 1839 }
1860 1840
1861 1841
1862 void Heap::PromoteArrayBuffer(Object* obj) { 1842 void Heap::PromoteArrayBuffer(Object* obj) {
1863 JSArrayBuffer* buffer = JSArrayBuffer::cast(obj); 1843 JSArrayBuffer* buffer = JSArrayBuffer::cast(obj);
1864 if (buffer->is_external()) return; 1844 if (buffer->is_external()) return;
1865 void* data = buffer->backing_store(); 1845 void* data = buffer->backing_store();
1866 if (!data) return; 1846 if (!data) return;
1867 // ArrayBuffer might be in the middle of being constructed. 1847 // ArrayBuffer might be in the middle of being constructed.
1868 if (data == undefined_value()) return; 1848 if (data == undefined_value()) return;
1869 DCHECK(live_array_buffers_for_scavenge_.count(data) > 0); 1849 DCHECK(live_array_buffers_for_scavenge_.count(data) > 0);
1870 DCHECK(live_array_buffers_.count(data) > 0); 1850 live_array_buffers_[data] = live_array_buffers_for_scavenge_[data];
1871 live_array_buffers_for_scavenge_.erase(data); 1851 live_array_buffers_for_scavenge_.erase(data);
1872 not_yet_discovered_array_buffers_for_scavenge_.erase(data); 1852 not_yet_discovered_array_buffers_for_scavenge_.erase(data);
1873 } 1853 }
1874 1854
1875 1855
1876 void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) { 1856 void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) {
1877 Object* allocation_site_obj = 1857 Object* allocation_site_obj =
1878 VisitWeakList<AllocationSite>(this, allocation_sites_list(), retainer); 1858 VisitWeakList<AllocationSite>(this, allocation_sites_list(), retainer);
1879 set_allocation_sites_list(allocation_site_obj); 1859 set_allocation_sites_list(allocation_site_obj);
1880 } 1860 }
(...skipping 4894 matching lines...) Expand 10 before | Expand all | Expand 10 after
6775 *object_type = "CODE_TYPE"; \ 6755 *object_type = "CODE_TYPE"; \
6776 *object_sub_type = "CODE_AGE/" #name; \ 6756 *object_sub_type = "CODE_AGE/" #name; \
6777 return true; 6757 return true;
6778 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) 6758 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME)
6779 #undef COMPARE_AND_RETURN_NAME 6759 #undef COMPARE_AND_RETURN_NAME
6780 } 6760 }
6781 return false; 6761 return false;
6782 } 6762 }
6783 } // namespace internal 6763 } // namespace internal
6784 } // namespace v8 6764 } // 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
This is Rietveld 408576698