blob: b015aa0d4bcf4f2d1715523e1381bbee5a82c69e [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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
3// found in the LICENSE file.
4
5#ifndef V8_HEAP_ARRAY_BUFFER_TRACKER_H_
6#define V8_HEAP_ARRAY_BUFFER_TRACKER_H_
7
Ben Murdoch61f157c2016-09-16 13:49:30 +01008#include <unordered_map>
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00009
Ben Murdoch61f157c2016-09-16 13:49:30 +010010#include "src/allocation.h"
Ben Murdoch097c5b22016-05-18 11:27:45 +010011#include "src/base/platform/mutex.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000012#include "src/globals.h"
13
14namespace v8 {
15namespace internal {
16
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000017class Heap;
18class JSArrayBuffer;
Ben Murdoch61f157c2016-09-16 13:49:30 +010019class Page;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000020
Ben Murdoch61f157c2016-09-16 13:49:30 +010021class ArrayBufferTracker : public AllStatic {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000022 public:
Ben Murdoch61f157c2016-09-16 13:49:30 +010023 enum ProcessingMode {
24 kUpdateForwardedRemoveOthers,
25 kUpdateForwardedKeepOthers,
26 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000027
28 // The following methods are used to track raw C++ pointers to externally
29 // allocated memory used as backing store in live array buffers.
30
Ben Murdoch61f157c2016-09-16 13:49:30 +010031 // Register/unregister a new JSArrayBuffer |buffer| for tracking. Guards all
32 // access to the tracker by taking the page lock for the corresponding page.
33 inline static void RegisterNew(Heap* heap, JSArrayBuffer* buffer);
34 inline static void Unregister(Heap* heap, JSArrayBuffer* buffer);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000035
Ben Murdoch61f157c2016-09-16 13:49:30 +010036 // Frees all backing store pointers for dead JSArrayBuffers in new space.
37 // Does not take any locks and can only be called during Scavenge.
38 static void FreeDeadInNewSpace(Heap* heap);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000039
Ben Murdoch61f157c2016-09-16 13:49:30 +010040 // 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
42 // taken by the caller.
43 static void FreeDead(Page* page);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000044
Ben Murdoch61f157c2016-09-16 13:49:30 +010045 // Frees all remaining, live or dead, array buffers on a page. Only useful
46 // during tear down.
47 static void FreeAll(Page* page);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000048
Ben Murdoch61f157c2016-09-16 13:49:30 +010049 // 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.
51 static bool ProcessBuffers(Page* page, ProcessingMode mode);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000052
Ben Murdoch61f157c2016-09-16 13:49:30 +010053 // Returns whether a buffer is currently tracked.
54 static bool IsTracked(JSArrayBuffer* buffer);
55};
56
57// LocalArrayBufferTracker tracks internalized array buffers.
58//
59// Never use directly but instead always call through |ArrayBufferTracker|.
60class LocalArrayBufferTracker {
61 public:
62 typedef std::pair<void*, size_t> Value;
63 typedef JSArrayBuffer* Key;
64
65 enum CallbackResult { kKeepEntry, kUpdateEntry, kRemoveEntry };
66 enum FreeMode { kFreeDead, kFreeAll };
67
68 explicit LocalArrayBufferTracker(Heap* heap) : heap_(heap) {}
69 ~LocalArrayBufferTracker();
70
71 inline void Add(Key key, const Value& value);
72 inline Value Remove(Key key);
73
74 // Frees up array buffers determined by |free_mode|.
75 template <FreeMode free_mode>
76 void Free();
77
78 // Processes buffers one by one. The CallbackResult of the callback decides
79 // what action to take on the buffer.
80 //
81 // Callback should be of type:
82 // CallbackResult fn(JSArrayBuffer* buffer, JSArrayBuffer** new_buffer);
83 template <typename Callback>
84 inline void Process(Callback callback);
85
86 bool IsEmpty() { return array_buffers_.empty(); }
87
88 bool IsTracked(Key key) {
89 return array_buffers_.find(key) != array_buffers_.end();
90 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000091
92 private:
Ben Murdoch61f157c2016-09-16 13:49:30 +010093 typedef std::unordered_map<Key, Value> TrackingMap;
94
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000095 Heap* heap_;
Ben Murdoch61f157c2016-09-16 13:49:30 +010096 TrackingMap array_buffers_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000097};
Ben Murdoch61f157c2016-09-16 13:49:30 +010098
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000099} // namespace internal
100} // namespace v8
101#endif // V8_HEAP_ARRAY_BUFFER_TRACKER_H_