blob: 6130003d15263fff94d56070d44a4713858ab9da [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
8#include <map>
9
Ben Murdoch097c5b22016-05-18 11:27:45 +010010#include "src/base/platform/mutex.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000011#include "src/globals.h"
12
13namespace v8 {
14namespace internal {
15
16// Forward declarations.
17class Heap;
18class JSArrayBuffer;
19
20class ArrayBufferTracker {
21 public:
22 explicit ArrayBufferTracker(Heap* heap) : heap_(heap) {}
23 ~ArrayBufferTracker();
24
25 inline Heap* heap() { return heap_; }
26
27 // The following methods are used to track raw C++ pointers to externally
28 // allocated memory used as backing store in live array buffers.
29
30 // A new ArrayBuffer was created with |data| as backing store.
31 void RegisterNew(JSArrayBuffer* buffer);
32
33 // The backing store |data| is no longer owned by V8.
34 void Unregister(JSArrayBuffer* buffer);
35
36 // A live ArrayBuffer was discovered during marking/scavenge.
37 void MarkLive(JSArrayBuffer* buffer);
38
39 // Frees all backing store pointers that weren't discovered in the previous
40 // marking or scavenge phase.
41 void FreeDead(bool from_scavenge);
42
43 // Prepare for a new scavenge phase. A new marking phase is implicitly
44 // prepared by finishing the previous one.
45 void PrepareDiscoveryInNewSpace();
46
47 // An ArrayBuffer moved from new space to old space.
48 void Promote(JSArrayBuffer* buffer);
49
50 private:
Ben Murdoch097c5b22016-05-18 11:27:45 +010051 base::Mutex mutex_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000052 Heap* heap_;
53
54 // |live_array_buffers_| maps externally allocated memory used as backing
55 // store for ArrayBuffers to the length of the respective memory blocks.
56 //
57 // At the beginning of mark/compact, |not_yet_discovered_array_buffers_| is
58 // a copy of |live_array_buffers_| and we remove pointers as we discover live
59 // ArrayBuffer objects during marking. At the end of mark/compact, the
60 // remaining memory blocks can be freed.
61 std::map<void*, size_t> live_array_buffers_;
62 std::map<void*, size_t> not_yet_discovered_array_buffers_;
63
64 // To be able to free memory held by ArrayBuffers during scavenge as well, we
65 // have a separate list of allocated memory held by ArrayBuffers in new space.
66 //
67 // Since mark/compact also evacuates the new space, all pointers in the
68 // |live_array_buffers_for_scavenge_| list are also in the
69 // |live_array_buffers_| list.
70 std::map<void*, size_t> live_array_buffers_for_scavenge_;
71 std::map<void*, size_t> not_yet_discovered_array_buffers_for_scavenge_;
72};
73} // namespace internal
74} // namespace v8
75#endif // V8_HEAP_ARRAY_BUFFER_TRACKER_H_