libv8-node 15.14.0.1-aarch64-linux-musl → 18.8.0.0-aarch64-linux-musl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libv8-node/location.rb +1 -1
  3. data/ext/libv8-node/paths.rb +5 -1
  4. data/lib/libv8/node/version.rb +3 -3
  5. data/vendor/v8/{out.gn → aarch64-linux-musl}/libv8/obj/libv8_monolith.a +0 -0
  6. data/vendor/v8/include/cppgc/allocation.h +184 -47
  7. data/vendor/v8/include/cppgc/common.h +9 -6
  8. data/vendor/v8/include/cppgc/cross-thread-persistent.h +465 -0
  9. data/vendor/v8/include/cppgc/custom-space.h +37 -2
  10. data/vendor/v8/include/cppgc/default-platform.h +40 -49
  11. data/vendor/v8/include/cppgc/ephemeron-pair.h +30 -0
  12. data/vendor/v8/include/cppgc/explicit-management.h +100 -0
  13. data/vendor/v8/include/cppgc/garbage-collected.h +19 -29
  14. data/vendor/v8/include/cppgc/heap-consistency.h +266 -0
  15. data/vendor/v8/include/cppgc/heap-state.h +82 -0
  16. data/vendor/v8/include/cppgc/heap-statistics.h +120 -0
  17. data/vendor/v8/include/cppgc/heap.h +73 -6
  18. data/vendor/v8/include/cppgc/internal/api-constants.h +11 -3
  19. data/vendor/v8/include/cppgc/internal/caged-heap-local-data.h +27 -15
  20. data/vendor/v8/include/cppgc/internal/compiler-specific.h +2 -2
  21. data/vendor/v8/include/cppgc/internal/finalizer-trait.h +4 -1
  22. data/vendor/v8/include/cppgc/internal/gc-info.h +124 -13
  23. data/vendor/v8/include/cppgc/internal/logging.h +3 -3
  24. data/vendor/v8/include/cppgc/internal/name-trait.h +122 -0
  25. data/vendor/v8/include/cppgc/internal/persistent-node.h +116 -16
  26. data/vendor/v8/include/cppgc/internal/pointer-policies.h +84 -32
  27. data/vendor/v8/include/cppgc/internal/write-barrier.h +392 -35
  28. data/vendor/v8/include/cppgc/liveness-broker.h +11 -2
  29. data/vendor/v8/include/cppgc/macros.h +2 -0
  30. data/vendor/v8/include/cppgc/member.h +91 -26
  31. data/vendor/v8/include/cppgc/name-provider.h +65 -0
  32. data/vendor/v8/include/cppgc/object-size-trait.h +58 -0
  33. data/vendor/v8/include/cppgc/persistent.h +70 -41
  34. data/vendor/v8/include/cppgc/platform.h +52 -26
  35. data/vendor/v8/include/cppgc/prefinalizer.h +36 -13
  36. data/vendor/v8/include/cppgc/process-heap-statistics.h +36 -0
  37. data/vendor/v8/include/cppgc/sentinel-pointer.h +32 -0
  38. data/vendor/v8/include/cppgc/source-location.h +2 -1
  39. data/vendor/v8/include/cppgc/testing.h +106 -0
  40. data/vendor/v8/include/cppgc/trace-trait.h +8 -3
  41. data/vendor/v8/include/cppgc/type-traits.h +163 -32
  42. data/vendor/v8/include/cppgc/visitor.h +194 -28
  43. data/vendor/v8/include/libplatform/libplatform.h +11 -11
  44. data/vendor/v8/include/libplatform/v8-tracing.h +2 -1
  45. data/vendor/v8/include/v8-array-buffer.h +445 -0
  46. data/vendor/v8/include/v8-callbacks.h +397 -0
  47. data/vendor/v8/include/v8-container.h +129 -0
  48. data/vendor/v8/include/v8-context.h +407 -0
  49. data/vendor/v8/include/v8-cppgc.h +151 -159
  50. data/vendor/v8/include/v8-data.h +80 -0
  51. data/vendor/v8/include/v8-date.h +43 -0
  52. data/vendor/v8/include/v8-debug.h +168 -0
  53. data/vendor/v8/include/v8-embedder-heap.h +218 -0
  54. data/vendor/v8/include/v8-embedder-state-scope.h +51 -0
  55. data/vendor/v8/include/v8-exception.h +217 -0
  56. data/vendor/v8/include/v8-extension.h +62 -0
  57. data/vendor/v8/include/v8-external.h +37 -0
  58. data/vendor/v8/include/v8-fast-api-calls.h +703 -152
  59. data/vendor/v8/include/v8-forward.h +81 -0
  60. data/vendor/v8/include/v8-function-callback.h +475 -0
  61. data/vendor/v8/include/v8-function.h +125 -0
  62. data/vendor/v8/include/v8-initialization.h +315 -0
  63. data/vendor/v8/include/v8-inspector.h +76 -27
  64. data/vendor/v8/include/v8-internal.h +285 -51
  65. data/vendor/v8/include/v8-isolate.h +1709 -0
  66. data/vendor/v8/include/v8-json.h +47 -0
  67. data/vendor/v8/include/v8-local-handle.h +455 -0
  68. data/vendor/v8/include/v8-locker.h +149 -0
  69. data/vendor/v8/include/v8-maybe.h +137 -0
  70. data/vendor/v8/include/v8-memory-span.h +43 -0
  71. data/vendor/v8/include/v8-message.h +216 -0
  72. data/vendor/v8/include/v8-metrics.h +131 -9
  73. data/vendor/v8/include/v8-microtask-queue.h +152 -0
  74. data/vendor/v8/include/v8-microtask.h +28 -0
  75. data/vendor/v8/include/v8-object.h +775 -0
  76. data/vendor/v8/include/v8-persistent-handle.h +590 -0
  77. data/vendor/v8/include/v8-platform.h +433 -25
  78. data/vendor/v8/include/v8-primitive-object.h +118 -0
  79. data/vendor/v8/include/v8-primitive.h +866 -0
  80. data/vendor/v8/include/v8-profiler.h +149 -10
  81. data/vendor/v8/include/v8-promise.h +174 -0
  82. data/vendor/v8/include/v8-proxy.h +50 -0
  83. data/vendor/v8/include/v8-regexp.h +105 -0
  84. data/vendor/v8/include/v8-script.h +747 -0
  85. data/vendor/v8/include/v8-snapshot.h +196 -0
  86. data/vendor/v8/include/v8-statistics.h +217 -0
  87. data/vendor/v8/include/v8-template.h +1079 -0
  88. data/vendor/v8/include/v8-traced-handle.h +420 -0
  89. data/vendor/v8/include/v8-typed-array.h +282 -0
  90. data/vendor/v8/include/v8-unwinder-state.h +31 -0
  91. data/vendor/v8/include/v8-unwinder.h +132 -0
  92. data/vendor/v8/include/v8-util.h +8 -2
  93. data/vendor/v8/include/v8-value-serializer-version.h +1 -1
  94. data/vendor/v8/include/v8-value-serializer.h +279 -0
  95. data/vendor/v8/include/v8-value.h +526 -0
  96. data/vendor/v8/include/v8-version.h +4 -4
  97. data/vendor/v8/include/v8-wasm.h +257 -0
  98. data/vendor/v8/include/v8-weak-callback-info.h +87 -0
  99. data/vendor/v8/include/v8.h +41 -12051
  100. data/vendor/v8/include/v8config.h +142 -21
  101. metadata +64 -10
  102. data/vendor/v8/include/cppgc/internal/prefinalizer-handler.h +0 -30
  103. data/vendor/v8/include/cppgc/internal/process-heap.h +0 -34
@@ -0,0 +1,100 @@
1
+ // Copyright 2021 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 INCLUDE_CPPGC_EXPLICIT_MANAGEMENT_H_
6
+ #define INCLUDE_CPPGC_EXPLICIT_MANAGEMENT_H_
7
+
8
+ #include <cstddef>
9
+
10
+ #include "cppgc/allocation.h"
11
+ #include "cppgc/internal/logging.h"
12
+ #include "cppgc/type-traits.h"
13
+
14
+ namespace cppgc {
15
+
16
+ class HeapHandle;
17
+
18
+ namespace subtle {
19
+
20
+ template <typename T>
21
+ void FreeUnreferencedObject(HeapHandle& heap_handle, T& object);
22
+ template <typename T>
23
+ bool Resize(T& object, AdditionalBytes additional_bytes);
24
+
25
+ } // namespace subtle
26
+
27
+ namespace internal {
28
+
29
+ class ExplicitManagementImpl final {
30
+ private:
31
+ V8_EXPORT static void FreeUnreferencedObject(HeapHandle&, void*);
32
+ V8_EXPORT static bool Resize(void*, size_t);
33
+
34
+ template <typename T>
35
+ friend void subtle::FreeUnreferencedObject(HeapHandle&, T&);
36
+ template <typename T>
37
+ friend bool subtle::Resize(T&, AdditionalBytes);
38
+ };
39
+ } // namespace internal
40
+
41
+ namespace subtle {
42
+
43
+ /**
44
+ * Informs the garbage collector that `object` can be immediately reclaimed. The
45
+ * destructor may not be invoked immediately but only on next garbage
46
+ * collection.
47
+ *
48
+ * It is up to the embedder to guarantee that no other object holds a reference
49
+ * to `object` after calling `FreeUnreferencedObject()`. In case such a
50
+ * reference exists, it's use results in a use-after-free.
51
+ *
52
+ * To aid in using the API, `FreeUnreferencedObject()` may be called from
53
+ * destructors on objects that would be reclaimed in the same garbage collection
54
+ * cycle.
55
+ *
56
+ * \param heap_handle The corresponding heap.
57
+ * \param object Reference to an object that is of type `GarbageCollected` and
58
+ * should be immediately reclaimed.
59
+ */
60
+ template <typename T>
61
+ void FreeUnreferencedObject(HeapHandle& heap_handle, T& object) {
62
+ static_assert(IsGarbageCollectedTypeV<T>,
63
+ "Object must be of type GarbageCollected.");
64
+ internal::ExplicitManagementImpl::FreeUnreferencedObject(heap_handle,
65
+ &object);
66
+ }
67
+
68
+ /**
69
+ * Tries to resize `object` of type `T` with additional bytes on top of
70
+ * sizeof(T). Resizing is only useful with trailing inlined storage, see e.g.
71
+ * `MakeGarbageCollected(AllocationHandle&, AdditionalBytes)`.
72
+ *
73
+ * `Resize()` performs growing or shrinking as needed and may skip the operation
74
+ * for internal reasons, see return value.
75
+ *
76
+ * It is up to the embedder to guarantee that in case of shrinking a larger
77
+ * object down, the reclaimed area is not used anymore. Any subsequent use
78
+ * results in a use-after-free.
79
+ *
80
+ * The `object` must be live when calling `Resize()`.
81
+ *
82
+ * \param object Reference to an object that is of type `GarbageCollected` and
83
+ * should be resized.
84
+ * \param additional_bytes Bytes in addition to sizeof(T) that the object should
85
+ * provide.
86
+ * \returns true when the operation was successful and the result can be relied
87
+ * on, and false otherwise.
88
+ */
89
+ template <typename T>
90
+ bool Resize(T& object, AdditionalBytes additional_bytes) {
91
+ static_assert(IsGarbageCollectedTypeV<T>,
92
+ "Object must be of type GarbageCollected.");
93
+ return internal::ExplicitManagementImpl::Resize(
94
+ &object, sizeof(T) + additional_bytes.value);
95
+ }
96
+
97
+ } // namespace subtle
98
+ } // namespace cppgc
99
+
100
+ #endif // INCLUDE_CPPGC_EXPLICIT_MANAGEMENT_H_
@@ -5,8 +5,6 @@
5
5
  #ifndef INCLUDE_CPPGC_GARBAGE_COLLECTED_H_
6
6
  #define INCLUDE_CPPGC_GARBAGE_COLLECTED_H_
7
7
 
8
- #include <type_traits>
9
-
10
8
  #include "cppgc/internal/api-constants.h"
11
9
  #include "cppgc/platform.h"
12
10
  #include "cppgc/trace-trait.h"
@@ -16,31 +14,9 @@ namespace cppgc {
16
14
 
17
15
  class Visitor;
18
16
 
19
- namespace internal {
20
-
21
- class GarbageCollectedBase {
22
- public:
23
- // Must use MakeGarbageCollected.
24
- void* operator new(size_t) = delete;
25
- void* operator new[](size_t) = delete;
26
- // The garbage collector is taking care of reclaiming the object. Also,
27
- // virtual destructor requires an unambiguous, accessible 'operator delete'.
28
- void operator delete(void*) {
29
- #ifdef V8_ENABLE_CHECKS
30
- internal::Abort();
31
- #endif // V8_ENABLE_CHECKS
32
- }
33
- void operator delete[](void*) = delete;
34
-
35
- protected:
36
- GarbageCollectedBase() = default;
37
- };
38
-
39
- } // namespace internal
40
-
41
17
  /**
42
- * Base class for managed objects. Only descendent types of GarbageCollected
43
- * can be constructed using MakeGarbageCollected. Must be inherited from as
18
+ * Base class for managed objects. Only descendent types of `GarbageCollected`
19
+ * can be constructed using `MakeGarbageCollected()`. Must be inherited from as
44
20
  * left-most base class.
45
21
  *
46
22
  * Types inheriting from GarbageCollected must provide a method of
@@ -73,10 +49,24 @@ class GarbageCollectedBase {
73
49
  * };
74
50
  * \endcode
75
51
  */
76
- template <typename>
77
- class GarbageCollected : public internal::GarbageCollectedBase {
52
+ template <typename T>
53
+ class GarbageCollected {
78
54
  public:
79
55
  using IsGarbageCollectedTypeMarker = void;
56
+ using ParentMostGarbageCollectedType = T;
57
+
58
+ // Must use MakeGarbageCollected.
59
+ void* operator new(size_t) = delete;
60
+ void* operator new[](size_t) = delete;
61
+ // The garbage collector is taking care of reclaiming the object. Also,
62
+ // virtual destructor requires an unambiguous, accessible 'operator delete'.
63
+ void operator delete(void*) {
64
+ #ifdef V8_ENABLE_CHECKS
65
+ internal::Fatal(
66
+ "Manually deleting a garbage collected object is not allowed");
67
+ #endif // V8_ENABLE_CHECKS
68
+ }
69
+ void operator delete[](void*) = delete;
80
70
 
81
71
  protected:
82
72
  GarbageCollected() = default;
@@ -100,7 +90,7 @@ class GarbageCollected : public internal::GarbageCollectedBase {
100
90
  * };
101
91
  * \endcode
102
92
  */
103
- class GarbageCollectedMixin : public internal::GarbageCollectedBase {
93
+ class GarbageCollectedMixin {
104
94
  public:
105
95
  using IsGarbageCollectedMixinTypeMarker = void;
106
96
 
@@ -0,0 +1,266 @@
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 INCLUDE_CPPGC_HEAP_CONSISTENCY_H_
6
+ #define INCLUDE_CPPGC_HEAP_CONSISTENCY_H_
7
+
8
+ #include <cstddef>
9
+
10
+ #include "cppgc/internal/write-barrier.h"
11
+ #include "cppgc/macros.h"
12
+ #include "cppgc/trace-trait.h"
13
+ #include "v8config.h" // NOLINT(build/include_directory)
14
+
15
+ namespace cppgc {
16
+
17
+ class HeapHandle;
18
+
19
+ namespace subtle {
20
+
21
+ /**
22
+ * **DO NOT USE: Use the appropriate managed types.**
23
+ *
24
+ * Consistency helpers that aid in maintaining a consistent internal state of
25
+ * the garbage collector.
26
+ */
27
+ class HeapConsistency final {
28
+ public:
29
+ using WriteBarrierParams = internal::WriteBarrier::Params;
30
+ using WriteBarrierType = internal::WriteBarrier::Type;
31
+
32
+ /**
33
+ * Gets the required write barrier type for a specific write.
34
+ *
35
+ * \param slot Slot containing the pointer to the object. The slot itself
36
+ * must reside in an object that has been allocated using
37
+ * `MakeGarbageCollected()`.
38
+ * \param value The pointer to the object. May be an interior pointer to an
39
+ * interface of the actual object.
40
+ * \param params Parameters that may be used for actual write barrier calls.
41
+ * Only filled if return value indicates that a write barrier is needed. The
42
+ * contents of the `params` are an implementation detail.
43
+ * \returns whether a write barrier is needed and which barrier to invoke.
44
+ */
45
+ static V8_INLINE WriteBarrierType GetWriteBarrierType(
46
+ const void* slot, const void* value, WriteBarrierParams& params) {
47
+ return internal::WriteBarrier::GetWriteBarrierType(slot, value, params);
48
+ }
49
+
50
+ /**
51
+ * Gets the required write barrier type for a specific write.
52
+ *
53
+ * \param slot Slot to some part of an object. The object must not necessarily
54
+ have been allocated using `MakeGarbageCollected()` but can also live
55
+ off-heap or on stack.
56
+ * \param params Parameters that may be used for actual write barrier calls.
57
+ * Only filled if return value indicates that a write barrier is needed. The
58
+ * contents of the `params` are an implementation detail.
59
+ * \param callback Callback returning the corresponding heap handle. The
60
+ * callback is only invoked if the heap cannot otherwise be figured out. The
61
+ * callback must not allocate.
62
+ * \returns whether a write barrier is needed and which barrier to invoke.
63
+ */
64
+ template <typename HeapHandleCallback>
65
+ static V8_INLINE WriteBarrierType
66
+ GetWriteBarrierType(const void* slot, WriteBarrierParams& params,
67
+ HeapHandleCallback callback) {
68
+ return internal::WriteBarrier::GetWriteBarrierType(slot, params, callback);
69
+ }
70
+
71
+ /**
72
+ * Gets the required write barrier type for a specific write.
73
+ * This version is meant to be used in conjunction with with a marking write
74
+ * barrier barrier which doesn't consider the slot.
75
+ *
76
+ * \param value The pointer to the object. May be an interior pointer to an
77
+ * interface of the actual object.
78
+ * \param params Parameters that may be used for actual write barrier calls.
79
+ * Only filled if return value indicates that a write barrier is needed. The
80
+ * contents of the `params` are an implementation detail.
81
+ * \returns whether a write barrier is needed and which barrier to invoke.
82
+ */
83
+ static V8_INLINE WriteBarrierType
84
+ GetWriteBarrierType(const void* value, WriteBarrierParams& params) {
85
+ return internal::WriteBarrier::GetWriteBarrierType(value, params);
86
+ }
87
+
88
+ /**
89
+ * Conservative Dijkstra-style write barrier that processes an object if it
90
+ * has not yet been processed.
91
+ *
92
+ * \param params The parameters retrieved from `GetWriteBarrierType()`.
93
+ * \param object The pointer to the object. May be an interior pointer to a
94
+ * an interface of the actual object.
95
+ */
96
+ static V8_INLINE void DijkstraWriteBarrier(const WriteBarrierParams& params,
97
+ const void* object) {
98
+ internal::WriteBarrier::DijkstraMarkingBarrier(params, object);
99
+ }
100
+
101
+ /**
102
+ * Conservative Dijkstra-style write barrier that processes a range of
103
+ * elements if they have not yet been processed.
104
+ *
105
+ * \param params The parameters retrieved from `GetWriteBarrierType()`.
106
+ * \param first_element Pointer to the first element that should be processed.
107
+ * The slot itself must reside in an object that has been allocated using
108
+ * `MakeGarbageCollected()`.
109
+ * \param element_size Size of the element in bytes.
110
+ * \param number_of_elements Number of elements that should be processed,
111
+ * starting with `first_element`.
112
+ * \param trace_callback The trace callback that should be invoked for each
113
+ * element if necessary.
114
+ */
115
+ static V8_INLINE void DijkstraWriteBarrierRange(
116
+ const WriteBarrierParams& params, const void* first_element,
117
+ size_t element_size, size_t number_of_elements,
118
+ TraceCallback trace_callback) {
119
+ internal::WriteBarrier::DijkstraMarkingBarrierRange(
120
+ params, first_element, element_size, number_of_elements,
121
+ trace_callback);
122
+ }
123
+
124
+ /**
125
+ * Steele-style write barrier that re-processes an object if it has already
126
+ * been processed.
127
+ *
128
+ * \param params The parameters retrieved from `GetWriteBarrierType()`.
129
+ * \param object The pointer to the object which must point to an object that
130
+ * has been allocated using `MakeGarbageCollected()`. Interior pointers are
131
+ * not supported.
132
+ */
133
+ static V8_INLINE void SteeleWriteBarrier(const WriteBarrierParams& params,
134
+ const void* object) {
135
+ internal::WriteBarrier::SteeleMarkingBarrier(params, object);
136
+ }
137
+
138
+ /**
139
+ * Generational barrier for maintaining consistency when running with multiple
140
+ * generations.
141
+ *
142
+ * \param params The parameters retrieved from `GetWriteBarrierType()`.
143
+ * \param slot Slot containing the pointer to the object. The slot itself
144
+ * must reside in an object that has been allocated using
145
+ * `MakeGarbageCollected()`.
146
+ */
147
+ static V8_INLINE void GenerationalBarrier(const WriteBarrierParams& params,
148
+ const void* slot) {
149
+ internal::WriteBarrier::GenerationalBarrier(params, slot);
150
+ }
151
+
152
+ /**
153
+ * Generational barrier for source object that may contain outgoing pointers
154
+ * to objects in young generation.
155
+ *
156
+ * \param params The parameters retrieved from `GetWriteBarrierType()`.
157
+ * \param inner_pointer Pointer to the source object.
158
+ */
159
+ static V8_INLINE void GenerationalBarrierForSourceObject(
160
+ const WriteBarrierParams& params, const void* inner_pointer) {
161
+ internal::WriteBarrier::GenerationalBarrierForSourceObject(params,
162
+ inner_pointer);
163
+ }
164
+
165
+ private:
166
+ HeapConsistency() = delete;
167
+ };
168
+
169
+ /**
170
+ * Disallows garbage collection finalizations. Any garbage collection triggers
171
+ * result in a crash when in this scope.
172
+ *
173
+ * Note that the garbage collector already covers paths that can lead to garbage
174
+ * collections, so user code does not require checking
175
+ * `IsGarbageCollectionAllowed()` before allocations.
176
+ */
177
+ class V8_EXPORT V8_NODISCARD DisallowGarbageCollectionScope final {
178
+ CPPGC_STACK_ALLOCATED();
179
+
180
+ public:
181
+ /**
182
+ * \returns whether garbage collections are currently allowed.
183
+ */
184
+ static bool IsGarbageCollectionAllowed(HeapHandle& heap_handle);
185
+
186
+ /**
187
+ * Enters a disallow garbage collection scope. Must be paired with `Leave()`.
188
+ * Prefer a scope instance of `DisallowGarbageCollectionScope`.
189
+ *
190
+ * \param heap_handle The corresponding heap.
191
+ */
192
+ static void Enter(HeapHandle& heap_handle);
193
+
194
+ /**
195
+ * Leaves a disallow garbage collection scope. Must be paired with `Enter()`.
196
+ * Prefer a scope instance of `DisallowGarbageCollectionScope`.
197
+ *
198
+ * \param heap_handle The corresponding heap.
199
+ */
200
+ static void Leave(HeapHandle& heap_handle);
201
+
202
+ /**
203
+ * Constructs a scoped object that automatically enters and leaves a disallow
204
+ * garbage collection scope based on its lifetime.
205
+ *
206
+ * \param heap_handle The corresponding heap.
207
+ */
208
+ explicit DisallowGarbageCollectionScope(HeapHandle& heap_handle);
209
+ ~DisallowGarbageCollectionScope();
210
+
211
+ DisallowGarbageCollectionScope(const DisallowGarbageCollectionScope&) =
212
+ delete;
213
+ DisallowGarbageCollectionScope& operator=(
214
+ const DisallowGarbageCollectionScope&) = delete;
215
+
216
+ private:
217
+ HeapHandle& heap_handle_;
218
+ };
219
+
220
+ /**
221
+ * Avoids invoking garbage collection finalizations. Already running garbage
222
+ * collection phase are unaffected by this scope.
223
+ *
224
+ * Should only be used temporarily as the scope has an impact on memory usage
225
+ * and follow up garbage collections.
226
+ */
227
+ class V8_EXPORT V8_NODISCARD NoGarbageCollectionScope final {
228
+ CPPGC_STACK_ALLOCATED();
229
+
230
+ public:
231
+ /**
232
+ * Enters a no garbage collection scope. Must be paired with `Leave()`. Prefer
233
+ * a scope instance of `NoGarbageCollectionScope`.
234
+ *
235
+ * \param heap_handle The corresponding heap.
236
+ */
237
+ static void Enter(HeapHandle& heap_handle);
238
+
239
+ /**
240
+ * Leaves a no garbage collection scope. Must be paired with `Enter()`. Prefer
241
+ * a scope instance of `NoGarbageCollectionScope`.
242
+ *
243
+ * \param heap_handle The corresponding heap.
244
+ */
245
+ static void Leave(HeapHandle& heap_handle);
246
+
247
+ /**
248
+ * Constructs a scoped object that automatically enters and leaves a no
249
+ * garbage collection scope based on its lifetime.
250
+ *
251
+ * \param heap_handle The corresponding heap.
252
+ */
253
+ explicit NoGarbageCollectionScope(HeapHandle& heap_handle);
254
+ ~NoGarbageCollectionScope();
255
+
256
+ NoGarbageCollectionScope(const NoGarbageCollectionScope&) = delete;
257
+ NoGarbageCollectionScope& operator=(const NoGarbageCollectionScope&) = delete;
258
+
259
+ private:
260
+ HeapHandle& heap_handle_;
261
+ };
262
+
263
+ } // namespace subtle
264
+ } // namespace cppgc
265
+
266
+ #endif // INCLUDE_CPPGC_HEAP_CONSISTENCY_H_
@@ -0,0 +1,82 @@
1
+ // Copyright 2021 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 INCLUDE_CPPGC_HEAP_STATE_H_
6
+ #define INCLUDE_CPPGC_HEAP_STATE_H_
7
+
8
+ #include "v8config.h" // NOLINT(build/include_directory)
9
+
10
+ namespace cppgc {
11
+
12
+ class HeapHandle;
13
+
14
+ namespace subtle {
15
+
16
+ /**
17
+ * Helpers to peek into heap-internal state.
18
+ */
19
+ class V8_EXPORT HeapState final {
20
+ public:
21
+ /**
22
+ * Returns whether the garbage collector is marking. This API is experimental
23
+ * and is expected to be removed in future.
24
+ *
25
+ * \param heap_handle The corresponding heap.
26
+ * \returns true if the garbage collector is currently marking, and false
27
+ * otherwise.
28
+ */
29
+ static bool IsMarking(const HeapHandle& heap_handle);
30
+
31
+ /*
32
+ * Returns whether the garbage collector is sweeping. This API is experimental
33
+ * and is expected to be removed in future.
34
+ *
35
+ * \param heap_handle The corresponding heap.
36
+ * \returns true if the garbage collector is currently sweeping, and false
37
+ * otherwise.
38
+ */
39
+ static bool IsSweeping(const HeapHandle& heap_handle);
40
+
41
+ /*
42
+ * Returns whether the garbage collector is currently sweeping on the thread
43
+ * owning this heap. This API allows the caller to determine whether it has
44
+ * been called from a destructor of a managed object. This API is experimental
45
+ * and may be removed in future.
46
+ *
47
+ * \param heap_handle The corresponding heap.
48
+ * \returns true if the garbage collector is currently sweeping on this
49
+ * thread, and false otherwise.
50
+ */
51
+ static bool IsSweepingOnOwningThread(const HeapHandle& heap_handle);
52
+
53
+ /**
54
+ * Returns whether the garbage collector is in the atomic pause, i.e., the
55
+ * mutator is stopped from running. This API is experimental and is expected
56
+ * to be removed in future.
57
+ *
58
+ * \param heap_handle The corresponding heap.
59
+ * \returns true if the garbage collector is currently in the atomic pause,
60
+ * and false otherwise.
61
+ */
62
+ static bool IsInAtomicPause(const HeapHandle& heap_handle);
63
+
64
+ /**
65
+ * Returns whether the last garbage collection was finalized conservatively
66
+ * (i.e., with a non-empty stack). This API is experimental and is expected to
67
+ * be removed in future.
68
+ *
69
+ * \param heap_handle The corresponding heap.
70
+ * \returns true if the last garbage collection was finalized conservatively,
71
+ * and false otherwise.
72
+ */
73
+ static bool PreviousGCWasConservative(const HeapHandle& heap_handle);
74
+
75
+ private:
76
+ HeapState() = delete;
77
+ };
78
+
79
+ } // namespace subtle
80
+ } // namespace cppgc
81
+
82
+ #endif // INCLUDE_CPPGC_HEAP_STATE_H_
@@ -0,0 +1,120 @@
1
+ // Copyright 2021 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 INCLUDE_CPPGC_HEAP_STATISTICS_H_
6
+ #define INCLUDE_CPPGC_HEAP_STATISTICS_H_
7
+
8
+ #include <cstddef>
9
+ #include <cstdint>
10
+ #include <string>
11
+ #include <vector>
12
+
13
+ namespace cppgc {
14
+
15
+ /**
16
+ * `HeapStatistics` contains memory consumption and utilization statistics for a
17
+ * cppgc heap.
18
+ */
19
+ struct HeapStatistics final {
20
+ /**
21
+ * Specifies the detail level of the heap statistics. Brief statistics contain
22
+ * only the top-level allocated and used memory statistics for the entire
23
+ * heap. Detailed statistics also contain a break down per space and page, as
24
+ * well as freelist statistics and object type histograms. Note that used
25
+ * memory reported by brief statistics and detailed statistics might differ
26
+ * slightly.
27
+ */
28
+ enum DetailLevel : uint8_t {
29
+ kBrief,
30
+ kDetailed,
31
+ };
32
+
33
+ /**
34
+ * Object statistics for a single type.
35
+ */
36
+ struct ObjectStatsEntry {
37
+ /**
38
+ * Number of allocated bytes.
39
+ */
40
+ size_t allocated_bytes;
41
+ /**
42
+ * Number of allocated objects.
43
+ */
44
+ size_t object_count;
45
+ };
46
+
47
+ /**
48
+ * Page granularity statistics. For each page the statistics record the
49
+ * allocated memory size and overall used memory size for the page.
50
+ */
51
+ struct PageStatistics {
52
+ /** Overall committed amount of memory for the page. */
53
+ size_t committed_size_bytes = 0;
54
+ /** Resident amount of memory held by the page. */
55
+ size_t resident_size_bytes = 0;
56
+ /** Amount of memory actually used on the page. */
57
+ size_t used_size_bytes = 0;
58
+ /** Statistics for object allocated on the page. Filled only when
59
+ * NameProvider::HideInternalNames() is false. */
60
+ std::vector<ObjectStatsEntry> object_statistics;
61
+ };
62
+
63
+ /**
64
+ * Statistics of the freelist (used only in non-large object spaces). For
65
+ * each bucket in the freelist the statistics record the bucket size, the
66
+ * number of freelist entries in the bucket, and the overall allocated memory
67
+ * consumed by these freelist entries.
68
+ */
69
+ struct FreeListStatistics {
70
+ /** bucket sizes in the freelist. */
71
+ std::vector<size_t> bucket_size;
72
+ /** number of freelist entries per bucket. */
73
+ std::vector<size_t> free_count;
74
+ /** memory size consumed by freelist entries per size. */
75
+ std::vector<size_t> free_size;
76
+ };
77
+
78
+ /**
79
+ * Space granularity statistics. For each space the statistics record the
80
+ * space name, the amount of allocated memory and overall used memory for the
81
+ * space. The statistics also contain statistics for each of the space's
82
+ * pages, its freelist and the objects allocated on the space.
83
+ */
84
+ struct SpaceStatistics {
85
+ /** The space name */
86
+ std::string name;
87
+ /** Overall committed amount of memory for the heap. */
88
+ size_t committed_size_bytes = 0;
89
+ /** Resident amount of memory held by the heap. */
90
+ size_t resident_size_bytes = 0;
91
+ /** Amount of memory actually used on the space. */
92
+ size_t used_size_bytes = 0;
93
+ /** Statistics for each of the pages in the space. */
94
+ std::vector<PageStatistics> page_stats;
95
+ /** Statistics for the freelist of the space. */
96
+ FreeListStatistics free_list_stats;
97
+ };
98
+
99
+ /** Overall committed amount of memory for the heap. */
100
+ size_t committed_size_bytes = 0;
101
+ /** Resident amount of memory help by the heap. */
102
+ size_t resident_size_bytes = 0;
103
+ /** Amount of memory actually used on the heap. */
104
+ size_t used_size_bytes = 0;
105
+ /** Detail level of this HeapStatistics. */
106
+ DetailLevel detail_level;
107
+
108
+ /** Statistics for each of the spaces in the heap. Filled only when
109
+ * `detail_level` is `DetailLevel::kDetailed`. */
110
+ std::vector<SpaceStatistics> space_stats;
111
+
112
+ /**
113
+ * Vector of `cppgc::GarbageCollected` type names.
114
+ */
115
+ std::vector<std::string> type_names;
116
+ };
117
+
118
+ } // namespace cppgc
119
+
120
+ #endif // INCLUDE_CPPGC_HEAP_STATISTICS_H_