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

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

Issue 1326613002: heap: make array buffer maps disjoint (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: simplify RegisterLiveArrayBuffer 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') | src/heap/mark-compact.cc » ('j') | 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 1726 matching lines...) Expand 10 before | Expand all | Expand 10 after
1737 } 1737 }
1738 1738
1739 1739
1740 void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) { 1740 void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) {
1741 Object* head = VisitWeakList<Context>(this, native_contexts_list(), retainer); 1741 Object* head = VisitWeakList<Context>(this, native_contexts_list(), retainer);
1742 // Update the head of the list of contexts. 1742 // Update the head of the list of contexts.
1743 set_native_contexts_list(head); 1743 set_native_contexts_list(head);
1744 } 1744 }
1745 1745
1746 1746
1747 void Heap::RegisterNewArrayBufferHelper(std::map<void*, size_t>& live_buffers,
1748 void* data, size_t length) {
1749 live_buffers[data] = length;
1750 }
1751
1752
1753 void Heap::UnregisterArrayBufferHelper(
1754 std::map<void*, size_t>& live_buffers,
1755 std::map<void*, size_t>& not_yet_discovered_buffers, void* data) {
1756 DCHECK(live_buffers.count(data) > 0);
1757 live_buffers.erase(data);
1758 not_yet_discovered_buffers.erase(data);
1759 }
1760
1761
1762 void Heap::RegisterLiveArrayBufferHelper(
1763 std::map<void*, size_t>& not_yet_discovered_buffers, void* data) {
1764 not_yet_discovered_buffers.erase(data);
1765 }
1766
1767
1768 size_t Heap::FreeDeadArrayBuffersHelper(
1769 Isolate* isolate, std::map<void*, size_t>& live_buffers,
1770 std::map<void*, size_t>& not_yet_discovered_buffers) {
1771 size_t freed_memory = 0;
1772 for (auto buffer = not_yet_discovered_buffers.begin();
1773 buffer != not_yet_discovered_buffers.end(); ++buffer) {
1774 isolate->array_buffer_allocator()->Free(buffer->first, buffer->second);
1775 freed_memory += buffer->second;
1776 live_buffers.erase(buffer->first);
1777 }
1778 not_yet_discovered_buffers = live_buffers;
1779 return freed_memory;
1780 }
1781
1782
1783 void Heap::TearDownArrayBuffersHelper(
1784 Isolate* isolate, std::map<void*, size_t>& live_buffers,
1785 std::map<void*, size_t>& not_yet_discovered_buffers) {
1786 for (auto buffer = live_buffers.begin(); buffer != live_buffers.end();
1787 ++buffer) {
1788 isolate->array_buffer_allocator()->Free(buffer->first, buffer->second);
1789 }
1790 live_buffers.clear();
1791 not_yet_discovered_buffers.clear();
1792 }
1793
1794
1795 void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data, 1747 void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data,
1796 size_t length) { 1748 size_t length) {
1797 if (!data) return; 1749 if (!data) return;
1798 RegisterNewArrayBufferHelper(live_array_buffers_, data, length);
1799 if (in_new_space) { 1750 if (in_new_space) {
1800 RegisterNewArrayBufferHelper(live_array_buffers_for_scavenge_, data, 1751 live_array_buffers_for_scavenge_[data] = length;
1801 length); 1752 } else {
1753 live_array_buffers_[data] = length;
1802 } 1754 }
1803 1755
1804 // We may go over the limit of externally allocated memory here. We call the 1756 // We may go over the limit of externally allocated memory here. We call the
1805 // api function to trigger a GC in this case. 1757 // api function to trigger a GC in this case.
1806 reinterpret_cast<v8::Isolate*>(isolate_) 1758 reinterpret_cast<v8::Isolate*>(isolate_)
1807 ->AdjustAmountOfExternalAllocatedMemory(length); 1759 ->AdjustAmountOfExternalAllocatedMemory(length);
1808 } 1760 }
1809 1761
1810 1762
1811 void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) { 1763 void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) {
1812 if (!data) return; 1764 if (!data) return;
1813 UnregisterArrayBufferHelper(live_array_buffers_, 1765
1814 not_yet_discovered_array_buffers_, data); 1766 std::map<void*, size_t>* live_buffers =
1767 in_new_space ? &live_array_buffers_for_scavenge_ : &live_array_buffers_;
1768 std::map<void*, size_t>* not_yet_discovered_buffers =
1769 in_new_space ? &not_yet_discovered_array_buffers_for_scavenge_
1770 : &not_yet_discovered_array_buffers_;
1771
1772 DCHECK(live_buffers->count(data) > 0);
1773 live_buffers->erase(data);
1774 not_yet_discovered_buffers->erase(data);
Michael Lippautz 2015/09/02 06:16:14 Adjust the amount of recorded external memory.
fedor.indutny 2015/09/02 06:25:47 Acknowledged.
1775 }
1776
1777
1778 void Heap::RegisterLiveArrayBuffer(bool in_new_space, void* data) {
1779 // ArrayBuffer might be in the middle of being constructed.
1780 if (data == undefined_value()) return;
1815 if (in_new_space) { 1781 if (in_new_space) {
1816 UnregisterArrayBufferHelper(live_array_buffers_for_scavenge_, 1782 not_yet_discovered_array_buffers_for_scavenge_.erase(data);
1817 not_yet_discovered_array_buffers_for_scavenge_, 1783 } else {
1818 data); 1784 not_yet_discovered_array_buffers_.erase(data);
1819 } 1785 }
1820 } 1786 }
1821 1787
1822 1788
1823 void Heap::RegisterLiveArrayBuffer(bool from_scavenge, void* data) { 1789 void Heap::FreeDeadArrayBuffers(bool from_scavenge) {
1824 // ArrayBuffer might be in the middle of being constructed. 1790 size_t freed_memory = 0;
1825 if (data == undefined_value()) return; 1791 for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) {
1826 RegisterLiveArrayBufferHelper( 1792 isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
1827 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ 1793 freed_memory += buffer.second;
1828 : not_yet_discovered_array_buffers_, 1794 live_array_buffers_for_scavenge_.erase(buffer.first);
1829 data); 1795 }
1830 }
1831 1796
1832 1797 if (!from_scavenge) {
1833 void Heap::FreeDeadArrayBuffers(bool from_scavenge) { 1798 for (auto& buffer : not_yet_discovered_array_buffers_) {
1834 if (from_scavenge) { 1799 isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
1835 for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) { 1800 freed_memory += buffer.second;
1836 not_yet_discovered_array_buffers_.erase(buffer.first);
1837 live_array_buffers_.erase(buffer.first); 1801 live_array_buffers_.erase(buffer.first);
1838 } 1802 }
1839 } else {
1840 for (auto& buffer : not_yet_discovered_array_buffers_) {
1841 // Scavenge can't happend during evacuation, so we only need to update
1842 // live_array_buffers_for_scavenge_.
1843 // not_yet_discovered_array_buffers_for_scanvenge_ will be reset before
1844 // the next scavenge run in PrepareArrayBufferDiscoveryInNewSpace.
1845 live_array_buffers_for_scavenge_.erase(buffer.first);
1846 }
1847 } 1803 }
1848 1804
1805 not_yet_discovered_array_buffers_for_scavenge_ =
1806 live_array_buffers_for_scavenge_;
1807 if (!from_scavenge) not_yet_discovered_array_buffers_ = live_array_buffers_;
1808
1849 // Do not call through the api as this code is triggered while doing a GC. 1809 // Do not call through the api as this code is triggered while doing a GC.
1850 amount_of_external_allocated_memory_ -= FreeDeadArrayBuffersHelper( 1810 amount_of_external_allocated_memory_ -= freed_memory;
1851 isolate_,
1852 from_scavenge ? live_array_buffers_for_scavenge_ : live_array_buffers_,
1853 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_
1854 : not_yet_discovered_array_buffers_);
1855 } 1811 }
1856 1812
1857 1813
1858 void Heap::TearDownArrayBuffers() { 1814 void Heap::TearDownArrayBuffers() {
1859 TearDownArrayBuffersHelper(isolate_, live_array_buffers_, 1815 size_t freed_memory = 0;
1860 not_yet_discovered_array_buffers_); 1816 for (auto& buffer : live_array_buffers_) {
1817 isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
1818 freed_memory += buffer.second;
1819 }
1820 for (auto& buffer : live_array_buffers_for_scavenge_) {
1821 isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
1822 freed_memory += buffer.second;
1823 }
1824 live_array_buffers_.clear();
1825 live_array_buffers_for_scavenge_.clear();
1826 not_yet_discovered_array_buffers_.clear();
1827 not_yet_discovered_array_buffers_for_scavenge_.clear();
1828
1829 if (freed_memory > 0) {
1830 reinterpret_cast<v8::Isolate*>(isolate_)
1831 ->AdjustAmountOfExternalAllocatedMemory(
1832 -static_cast<int64_t>(freed_memory));
1833 }
1861 } 1834 }
1862 1835
1863 1836
1864 void Heap::PrepareArrayBufferDiscoveryInNewSpace() { 1837 void Heap::PrepareArrayBufferDiscoveryInNewSpace() {
1865 not_yet_discovered_array_buffers_for_scavenge_ = 1838 not_yet_discovered_array_buffers_for_scavenge_ =
1866 live_array_buffers_for_scavenge_; 1839 live_array_buffers_for_scavenge_;
1867 } 1840 }
1868 1841
1869 1842
1870 void Heap::PromoteArrayBuffer(Object* obj) { 1843 void Heap::PromoteArrayBuffer(Object* obj) {
1871 JSArrayBuffer* buffer = JSArrayBuffer::cast(obj); 1844 JSArrayBuffer* buffer = JSArrayBuffer::cast(obj);
1872 if (buffer->is_external()) return; 1845 if (buffer->is_external()) return;
1873 void* data = buffer->backing_store(); 1846 void* data = buffer->backing_store();
1874 if (!data) return; 1847 if (!data) return;
1875 // ArrayBuffer might be in the middle of being constructed. 1848 // ArrayBuffer might be in the middle of being constructed.
1876 if (data == undefined_value()) return; 1849 if (data == undefined_value()) return;
1877 DCHECK(live_array_buffers_for_scavenge_.count(data) > 0); 1850 DCHECK(live_array_buffers_for_scavenge_.count(data) > 0);
1878 DCHECK(live_array_buffers_.count(data) > 0); 1851 live_array_buffers_[data] = live_array_buffers_for_scavenge_[data];
1879 live_array_buffers_for_scavenge_.erase(data); 1852 live_array_buffers_for_scavenge_.erase(data);
1880 not_yet_discovered_array_buffers_for_scavenge_.erase(data); 1853 not_yet_discovered_array_buffers_for_scavenge_.erase(data);
1881 } 1854 }
1882 1855
1883 1856
1884 void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) { 1857 void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) {
1885 Object* allocation_site_obj = 1858 Object* allocation_site_obj =
1886 VisitWeakList<AllocationSite>(this, allocation_sites_list(), retainer); 1859 VisitWeakList<AllocationSite>(this, allocation_sites_list(), retainer);
1887 set_allocation_sites_list(allocation_site_obj); 1860 set_allocation_sites_list(allocation_site_obj);
1888 } 1861 }
(...skipping 4885 matching lines...) Expand 10 before | Expand all | Expand 10 after
6774 *object_type = "CODE_TYPE"; \ 6747 *object_type = "CODE_TYPE"; \
6775 *object_sub_type = "CODE_AGE/" #name; \ 6748 *object_sub_type = "CODE_AGE/" #name; \
6776 return true; 6749 return true;
6777 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) 6750 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME)
6778 #undef COMPARE_AND_RETURN_NAME 6751 #undef COMPARE_AND_RETURN_NAME
6779 } 6752 }
6780 return false; 6753 return false;
6781 } 6754 }
6782 } // namespace internal 6755 } // namespace internal
6783 } // namespace v8 6756 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/mark-compact.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698