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

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

Issue 2210263002: [heap] Improve size profiling for ArrayBuffer tracking (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Added tests and some more fixes Created 4 years, 4 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 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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 #ifndef V8_HEAP_ARRAY_BUFFER_TRACKER_H_ 5 #ifndef V8_HEAP_ARRAY_BUFFER_TRACKER_H_
6 #define V8_HEAP_ARRAY_BUFFER_TRACKER_H_ 6 #define V8_HEAP_ARRAY_BUFFER_TRACKER_H_
7 7
8 #include <unordered_map> 8 #include <unordered_map>
9 9
10 #include "src/allocation.h" 10 #include "src/allocation.h"
11 #include "src/base/atomic-utils.h"
11 #include "src/base/platform/mutex.h" 12 #include "src/base/platform/mutex.h"
12 #include "src/globals.h" 13 #include "src/globals.h"
13 14
14 namespace v8 { 15 namespace v8 {
15 namespace internal { 16 namespace internal {
16 17
17 class Heap; 18 class Heap;
18 class JSArrayBuffer; 19 class JSArrayBuffer;
19 class Page; 20 class Page;
20 21
21 class ArrayBufferTracker : public AllStatic { 22 class ArrayBufferTracker {
22 public: 23 public:
23 enum ProcessingMode { 24 enum ProcessingMode {
24 kUpdateForwardedRemoveOthers, 25 kUpdateForwardedRemoveOthers,
25 kUpdateForwardedKeepOthers, 26 kUpdateForwardedKeepOthers,
26 }; 27 };
27 28
29 // Returns whether a buffer is currently tracked.
30 static bool IsTracked(JSArrayBuffer* buffer);
31
32 explicit ArrayBufferTracker(Heap* heap)
33 : heap_(heap),
34 concurrently_freed_(0),
35 retained_from_new_space_(0),
36 retained_from_old_space_(0) {}
37
28 // The following methods are used to track raw C++ pointers to externally 38 // The following methods are used to track raw C++ pointers to externally
29 // allocated memory used as backing store in live array buffers. 39 // allocated memory used as backing store in live array buffers.
30 40
31 // Register/unregister a new JSArrayBuffer |buffer| for tracking. Guards all 41 // Register/unregister a new JSArrayBuffer |buffer| for tracking. Guards all
32 // access to the tracker by taking the page lock for the corresponding page. 42 // access to the tracker by taking the page lock for the corresponding page.
33 inline static void RegisterNew(Heap* heap, JSArrayBuffer* buffer); 43 inline void RegisterNew(Heap* heap, JSArrayBuffer* buffer);
34 inline static void Unregister(Heap* heap, JSArrayBuffer* buffer); 44 inline void Unregister(Heap* heap, JSArrayBuffer* buffer);
35 45
36 // Frees all backing store pointers for dead JSArrayBuffers in new space. 46 // Frees all backing store pointers for dead JSArrayBuffers in new space.
37 // Does not take any locks and can only be called during Scavenge. 47 // Does not take any locks and can only be called during Scavenge.
38 static void FreeDeadInNewSpace(Heap* heap); 48 void FreeDeadInNewSpace(Heap* heap);
39 49
40 // Frees all backing store pointers for dead JSArrayBuffer on a given page. 50 // Frees all backing store pointers for dead JSArrayBuffer on a given page.
41 // Requires marking information to be present. Requires the page lock to be 51 // Requires marking information to be present. Requires the page lock to be
42 // taken by the caller. 52 // taken by the caller.
43 static void FreeDead(Page* page); 53 void FreeDead(Page* page);
44 54
45 // Frees all remaining, live or dead, array buffers on a page. Only useful 55 // Frees all remaining, live or dead, array buffers on a page. Only useful
46 // during tear down. 56 // during tear down.
47 static void FreeAll(Page* page); 57 void FreeAll(Page* page);
48 58
49 // Processes all array buffers on a given page. |mode| specifies the action 59 // Processes all array buffers on a given page. |mode| specifies the action
50 // to perform on the buffers. Returns whether the tracker is empty or not. 60 // to perform on the buffers. Returns whether the tracker is empty or not.
51 static bool ProcessBuffers(Page* page, ProcessingMode mode); 61 bool ProcessBuffers(Page* page, ProcessingMode mode);
52 62
53 // Returns whether a buffer is currently tracked. 63 void AccountForConcurrentlyFreedMemory();
54 static bool IsTracked(JSArrayBuffer* buffer); 64
65 size_t retained_from_new_space() {
66 return static_cast<size_t>(retained_from_new_space_.Value());
67 }
68
69 size_t retained_from_old_space() {
70 return static_cast<size_t>(retained_from_old_space_.Value());
71 }
72
73 private:
74 Heap* heap_;
75
76 base::AtomicNumber<intptr_t> concurrently_freed_;
77
78 // Number of bytes retained from new space.
79 base::AtomicNumber<intptr_t> retained_from_new_space_;
80 // Number of bytes retained from old space.
81 base::AtomicNumber<intptr_t> retained_from_old_space_;
55 }; 82 };
56 83
57 // LocalArrayBufferTracker tracks internalized array buffers. 84 // LocalArrayBufferTracker tracks internalized array buffers.
58 // 85 //
59 // Never use directly but instead always call through |ArrayBufferTracker|. 86 // Never use directly but instead always call through |ArrayBufferTracker|.
60 class LocalArrayBufferTracker { 87 class LocalArrayBufferTracker {
61 public: 88 public:
62 typedef JSArrayBuffer* Key; 89 typedef JSArrayBuffer* Key;
63 typedef size_t Value; 90 typedef size_t Value;
64 91
65 enum CallbackResult { kKeepEntry, kUpdateEntry, kRemoveEntry }; 92 enum CallbackResult { kKeepEntry, kUpdateEntry, kRemoveEntry };
66 enum FreeMode { kFreeDead, kFreeAll }; 93 enum FreeMode { kFreeDead, kFreeAll };
67 94
95 struct ProcessResult {
96 ProcessResult(size_t freed, size_t live, size_t promoted)
97 : freed(freed), live(live), promoted(promoted) {}
98
99 size_t freed;
100 size_t live;
101 size_t promoted;
102 };
103
68 explicit LocalArrayBufferTracker(Heap* heap) : heap_(heap) {} 104 explicit LocalArrayBufferTracker(Heap* heap) : heap_(heap) {}
69 ~LocalArrayBufferTracker(); 105 ~LocalArrayBufferTracker();
70 106
71 inline void Add(Key key, const Value& value); 107 inline void Add(Key key, const Value& value);
72 inline Value Remove(Key key); 108 inline Value Remove(Key key);
73 109
74 // Frees up array buffers determined by |free_mode|. 110 // Frees up array buffers determined by |free_mode|. Returns statistics in
111 // ProcessResult.
75 template <FreeMode free_mode> 112 template <FreeMode free_mode>
76 void Free(); 113 ProcessResult Free();
77 114
78 // Processes buffers one by one. The CallbackResult of the callback decides 115 // Processes buffers one by one. The CallbackResult of the callback decides
79 // what action to take on the buffer. 116 // what action to take on the buffer. Returns statistics in ProcessResult.
80 // 117 //
81 // Callback should be of type: 118 // Callback should be of type:
82 // CallbackResult fn(JSArrayBuffer* buffer, JSArrayBuffer** new_buffer); 119 // CallbackResult fn(JSArrayBuffer* buffer, JSArrayBuffer** new_buffer);
83 template <typename Callback> 120 template <typename Callback>
84 void Process(Callback callback); 121 ProcessResult Process(Callback callback);
85 122
86 bool IsEmpty() { return array_buffers_.empty(); } 123 bool IsEmpty() { return array_buffers_.empty(); }
87 124
88 bool IsTracked(Key key) { 125 bool IsTracked(Key key) {
89 return array_buffers_.find(key) != array_buffers_.end(); 126 return array_buffers_.find(key) != array_buffers_.end();
90 } 127 }
91 128
92 private: 129 private:
93 typedef std::unordered_map<Key, Value> TrackingData; 130 typedef std::unordered_map<Key, Value> TrackingData;
94 131
95 Heap* heap_; 132 Heap* heap_;
96 TrackingData array_buffers_; 133 TrackingData array_buffers_;
97 }; 134 };
98 135
99 } // namespace internal 136 } // namespace internal
100 } // namespace v8 137 } // namespace v8
101 #endif // V8_HEAP_ARRAY_BUFFER_TRACKER_H_ 138 #endif // V8_HEAP_ARRAY_BUFFER_TRACKER_H_
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/heap/array-buffer-tracker.cc » ('j') | src/heap/array-buffer-tracker.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698