v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
gc-callbacks.h
Go to the documentation of this file.
1// Copyright 2020 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_GC_CALLBACKS_H_
6#define V8_HEAP_GC_CALLBACKS_H_
7
8#include <algorithm>
9#include <tuple>
10#include <vector>
11
13#include "src/base/logging.h"
15
16namespace v8::internal {
17
18class GCCallbacks final {
19 public:
20 using CallbackType = void (*)(v8::Isolate*, GCType, GCCallbackFlags, void*);
21
22 void Add(CallbackType callback, v8::Isolate* isolate, GCType gc_type,
23 void* data) {
26 callbacks_.emplace_back(callback, isolate, gc_type, data);
27 }
28
29 void Remove(CallbackType callback, void* data) {
30 auto it = FindCallback(callback, data);
31 DCHECK_NE(callbacks_.end(), it);
32 *it = callbacks_.back();
33 callbacks_.pop_back();
34 }
35
36 void Invoke(GCType gc_type, GCCallbackFlags gc_callback_flags) const {
38 for (const CallbackData& callback_data : callbacks_) {
39 if (gc_type & callback_data.gc_type) {
40 callback_data.callback(callback_data.isolate, gc_type,
41 gc_callback_flags, callback_data.user_data);
42 }
43 }
44 }
45
46 bool IsEmpty() const { return callbacks_.empty(); }
47
48 private:
62
63 std::vector<CallbackData>::iterator FindCallback(CallbackType callback,
64 void* data) {
65 return std::find_if(callbacks_.begin(), callbacks_.end(),
66 [callback, data](CallbackData& callback_data) {
67 return callback_data.callback == callback &&
68 callback_data.user_data == data;
69 });
70 }
71
72 std::vector<CallbackData> callbacks_;
73};
74
76 public:
77 using CallbackType = void (*)(void*);
78
79 enum GCType { kLocal = 1 << 0, kShared = 1 << 1, kAll = kLocal | kShared };
80
81 void Add(CallbackType callback, void* data, GCType gc_type) {
84 callbacks_.emplace_back(callback, data, gc_type);
85 }
86
87 void Remove(CallbackType callback, void* data) {
88 auto it = FindCallback(callback, data);
89 DCHECK_NE(callbacks_.end(), it);
90 *it = callbacks_.back();
91 callbacks_.pop_back();
92 }
93
94 void Invoke(GCType gc_type) const {
96 for (const CallbackData& callback_data : callbacks_) {
97 if (callback_data.gc_type_ & gc_type)
98 callback_data.callback(callback_data.user_data);
99 }
100 }
101
102 bool IsEmpty() const { return callbacks_.empty(); }
103
104 private:
113
114 std::vector<CallbackData>::iterator FindCallback(CallbackType callback,
115 void* data) {
116 return std::find_if(callbacks_.begin(), callbacks_.end(),
117 [callback, data](CallbackData& callback_data) {
118 return callback_data.callback == callback &&
119 callback_data.user_data == data;
120 });
121 }
122
123 std::vector<CallbackData> callbacks_;
124};
125
126} // namespace v8::internal
127
128#endif // V8_HEAP_GC_CALLBACKS_H_
void Remove(CallbackType callback, void *data)
std::vector< CallbackData > callbacks_
void Invoke(GCType gc_type) const
void Add(CallbackType callback, void *data, GCType gc_type)
std::vector< CallbackData >::iterator FindCallback(CallbackType callback, void *data)
void(*)(v8::Isolate *, GCType, GCCallbackFlags, void *) CallbackType
void Remove(CallbackType callback, void *data)
std::vector< CallbackData > callbacks_
void Invoke(GCType gc_type, GCCallbackFlags gc_callback_flags) const
void Add(CallbackType callback, v8::Isolate *isolate, GCType gc_type, void *data)
std::vector< CallbackData >::iterator FindCallback(CallbackType callback, void *data)
TNode< Object > callback
GCCallbackFlags
#define DCHECK_NOT_NULL(val)
Definition logging.h:492
#define DCHECK_NE(v1, v2)
Definition logging.h:486
#define DCHECK_EQ(v1, v2)
Definition logging.h:485
CallbackData(CallbackType callback, void *user_data, GCType gc_type)
CallbackData(CallbackType callback, v8::Isolate *isolate, GCType gc_type, void *user_data)