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

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: adjust on unregister 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
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
1774 size_t length = live_buffers->at(data);
1775 live_buffers->erase(data);
1776 not_yet_discovered_buffers->erase(data);
1777
1778 reinterpret_cast<v8::Isolate*>(isolate_)
Michael Lippautz 2015/09/02 07:22:59 amount_of_external_allocated_memory_ -= length;
fedor.indutny 2015/09/02 08:56:08 Acknowledged.
1779 ->AdjustAmountOfExternalAllocatedMemory(length);
1780 }
1781
1782
1783 void Heap::RegisterLiveArrayBuffer(bool in_new_space, void* data) {
1784 // ArrayBuffer might be in the middle of being constructed.
1785 if (data == undefined_value()) return;
1815 if (in_new_space) { 1786 if (in_new_space) {
1816 UnregisterArrayBufferHelper(live_array_buffers_for_scavenge_, 1787 not_yet_discovered_array_buffers_for_scavenge_.erase(data);
1817 not_yet_discovered_array_buffers_for_scavenge_, 1788 } else {
1818 data); 1789 not_yet_discovered_array_buffers_.erase(data);
1819 } 1790 }
1820 } 1791 }
1821 1792
1822 1793
1823 void Heap::RegisterLiveArrayBuffer(bool from_scavenge, void* data) { 1794 void Heap::FreeDeadArrayBuffers(bool from_scavenge) {
1824 // ArrayBuffer might be in the middle of being constructed. 1795 size_t freed_memory = 0;
1825 if (data == undefined_value()) return; 1796 for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) {
1826 RegisterLiveArrayBufferHelper( 1797 isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
1827 from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_ 1798 freed_memory += buffer.second;
1828 : not_yet_discovered_array_buffers_, 1799 live_array_buffers_for_scavenge_.erase(buffer.first);
1829 data); 1800 }
1830 }
1831 1801
1832 1802 if (!from_scavenge) {
1833 void Heap::FreeDeadArrayBuffers(bool from_scavenge) { 1803 for (auto& buffer : not_yet_discovered_array_buffers_) {
1834 if (from_scavenge) { 1804 isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
1835 for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) { 1805 freed_memory += buffer.second;
1836 not_yet_discovered_array_buffers_.erase(buffer.first);
1837 live_array_buffers_.erase(buffer.first); 1806 live_array_buffers_.erase(buffer.first);
1838 } 1807 }
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 } 1808 }
1848 1809
1810 not_yet_discovered_array_buffers_for_scavenge_ =
1811 live_array_buffers_for_scavenge_;
1812 if (!from_scavenge) not_yet_discovered_array_buffers_ = live_array_buffers_;
1813
1849 // Do not call through the api as this code is triggered while doing a GC. 1814 // Do not call through the api as this code is triggered while doing a GC.
1850 amount_of_external_allocated_memory_ -= FreeDeadArrayBuffersHelper( 1815 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 } 1816 }
1856 1817
1857 1818
1858 void Heap::TearDownArrayBuffers() { 1819 void Heap::TearDownArrayBuffers() {
1859 TearDownArrayBuffersHelper(isolate_, live_array_buffers_, 1820 size_t freed_memory = 0;
1860 not_yet_discovered_array_buffers_); 1821 for (auto& buffer : live_array_buffers_) {
1822 isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
1823 freed_memory += buffer.second;
1824 }
1825 for (auto& buffer : live_array_buffers_for_scavenge_) {
1826 isolate()->array_buffer_allocator()->Free(buffer.first, buffer.second);
1827 freed_memory += buffer.second;
1828 }
1829 live_array_buffers_.clear();
1830 live_array_buffers_for_scavenge_.clear();
1831 not_yet_discovered_array_buffers_.clear();
1832 not_yet_discovered_array_buffers_for_scavenge_.clear();
1833
1834 if (freed_memory > 0) {
1835 reinterpret_cast<v8::Isolate*>(isolate_)
1836 ->AdjustAmountOfExternalAllocatedMemory(
1837 -static_cast<int64_t>(freed_memory));
1838 }
1861 } 1839 }
1862 1840
1863 1841
1864 void Heap::PrepareArrayBufferDiscoveryInNewSpace() { 1842 void Heap::PrepareArrayBufferDiscoveryInNewSpace() {
1865 not_yet_discovered_array_buffers_for_scavenge_ = 1843 not_yet_discovered_array_buffers_for_scavenge_ =
1866 live_array_buffers_for_scavenge_; 1844 live_array_buffers_for_scavenge_;
1867 } 1845 }
1868 1846
1869 1847
1870 void Heap::PromoteArrayBuffer(Object* obj) { 1848 void Heap::PromoteArrayBuffer(Object* obj) {
1871 JSArrayBuffer* buffer = JSArrayBuffer::cast(obj); 1849 JSArrayBuffer* buffer = JSArrayBuffer::cast(obj);
1872 if (buffer->is_external()) return; 1850 if (buffer->is_external()) return;
1873 void* data = buffer->backing_store(); 1851 void* data = buffer->backing_store();
1874 if (!data) return; 1852 if (!data) return;
1875 // ArrayBuffer might be in the middle of being constructed. 1853 // ArrayBuffer might be in the middle of being constructed.
1876 if (data == undefined_value()) return; 1854 if (data == undefined_value()) return;
1877 DCHECK(live_array_buffers_for_scavenge_.count(data) > 0); 1855 DCHECK(live_array_buffers_for_scavenge_.count(data) > 0);
1878 DCHECK(live_array_buffers_.count(data) > 0); 1856 live_array_buffers_[data] = live_array_buffers_for_scavenge_[data];
1879 live_array_buffers_for_scavenge_.erase(data); 1857 live_array_buffers_for_scavenge_.erase(data);
1880 not_yet_discovered_array_buffers_for_scavenge_.erase(data); 1858 not_yet_discovered_array_buffers_for_scavenge_.erase(data);
1881 } 1859 }
1882 1860
1883 1861
1884 void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) { 1862 void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) {
1885 Object* allocation_site_obj = 1863 Object* allocation_site_obj =
1886 VisitWeakList<AllocationSite>(this, allocation_sites_list(), retainer); 1864 VisitWeakList<AllocationSite>(this, allocation_sites_list(), retainer);
1887 set_allocation_sites_list(allocation_site_obj); 1865 set_allocation_sites_list(allocation_site_obj);
1888 } 1866 }
(...skipping 4885 matching lines...) Expand 10 before | Expand all | Expand 10 after
6774 *object_type = "CODE_TYPE"; \ 6752 *object_type = "CODE_TYPE"; \
6775 *object_sub_type = "CODE_AGE/" #name; \ 6753 *object_sub_type = "CODE_AGE/" #name; \
6776 return true; 6754 return true;
6777 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) 6755 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME)
6778 #undef COMPARE_AND_RETURN_NAME 6756 #undef COMPARE_AND_RETURN_NAME
6779 } 6757 }
6780 return false; 6758 return false;
6781 } 6759 }
6782 } // namespace internal 6760 } // namespace internal
6783 } // namespace v8 6761 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/mark-compact.cc » ('j') | src/heap/mark-compact.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698