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

Side by Side Diff: src/heap/array-buffer-tracker-inl.h

Issue 2028503003: Revert of Reland "[heap] Fine-grained JSArrayBuffer tracking" (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 6 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/array-buffer-tracker.cc ('k') | src/heap/heap.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "src/heap/array-buffer-tracker.h"
6 #include "src/heap/heap.h"
7 #include "src/heap/mark-compact.h"
8 #include "src/isolate.h"
9
10 namespace v8 {
11 namespace internal {
12
13 template <typename Callback>
14 void LocalArrayBufferTracker::Process(Callback callback) {
15 JSArrayBuffer* new_buffer = nullptr;
16 size_t freed_memory = 0;
17 for (TrackingMap::iterator it = live_.begin(); it != live_.end();) {
18 switch (callback(it->first, &new_buffer)) {
19 case kKeepEntry:
20 it++;
21 break;
22 case kKeepAndUpdateEntry:
23 DCHECK_NOT_NULL(new_buffer);
24 if (Marking::IsBlack(Marking::MarkBitFrom(new_buffer))) {
25 Page::FromAddress(new_buffer->address())
26 ->local_tracker<Page::kCreateIfNotPresent>()
27 ->AddLive(new_buffer, it->second);
28 } else {
29 Page::FromAddress(new_buffer->address())
30 ->local_tracker<Page::kCreateIfNotPresent>()
31 ->Add(new_buffer, it->second);
32 }
33 live_.erase(it++);
34 break;
35 case kRemoveEntry:
36 heap_->isolate()->array_buffer_allocator()->Free(it->second.first,
37 it->second.second);
38 freed_memory += it->second.second;
39 live_.erase(it++);
40 break;
41 default:
42 UNREACHABLE();
43 }
44 }
45 if (freed_memory > 0) {
46 heap_->update_amount_of_external_allocated_freed_memory(
47 static_cast<intptr_t>(freed_memory));
48 }
49 not_yet_discovered_.clear();
50 started_ = false;
51 }
52
53 template <LocalArrayBufferTracker::LivenessIndicator liveness_indicator>
54 void LocalArrayBufferTracker::ScanAndFreeDead() {
55 switch (liveness_indicator) {
56 case kForwardingPointer:
57 Process([](JSArrayBuffer* old_buffer, JSArrayBuffer** new_buffer) {
58 MapWord map_word = old_buffer->map_word();
59 if (map_word.IsForwardingAddress()) {
60 *new_buffer = JSArrayBuffer::cast(map_word.ToForwardingAddress());
61 return LocalArrayBufferTracker::kKeepAndUpdateEntry;
62 }
63 return LocalArrayBufferTracker::kRemoveEntry;
64 });
65 break;
66 case kMarkBit:
67 Process([](JSArrayBuffer* old_buffer, JSArrayBuffer**) {
68 if (Marking::IsBlackOrGrey(Marking::MarkBitFrom(old_buffer))) {
69 return LocalArrayBufferTracker::kKeepEntry;
70 }
71 return LocalArrayBufferTracker::kRemoveEntry;
72 });
73 break;
74 case kForwardingPointerOrMarkBit:
75 Process([](JSArrayBuffer* old_buffer, JSArrayBuffer** new_buffer) {
76 if (Marking::IsBlackOrGrey(Marking::MarkBitFrom(old_buffer))) {
77 return LocalArrayBufferTracker::kKeepEntry;
78 }
79 MapWord map_word = old_buffer->map_word();
80 if (map_word.IsForwardingAddress()) {
81 *new_buffer = JSArrayBuffer::cast(map_word.ToForwardingAddress());
82 return LocalArrayBufferTracker::kKeepAndUpdateEntry;
83 }
84 return LocalArrayBufferTracker::kRemoveEntry;
85 });
86 break;
87 default:
88 UNREACHABLE();
89 }
90 }
91
92 } // namespace internal
93 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/array-buffer-tracker.cc ('k') | src/heap/heap.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698