1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #ifndef V8_GLOBAL_HANDLES_H_
29 #define V8_GLOBAL_HANDLES_H_
31 #include "../include/v8-profiler.h"
38 // Structure for tracking global handles.
39 // A single list keeps all the allocated global handles.
40 // Destroyed handles stay in the list but is added to the free list.
41 // At GC the destroyed global handles are removed from the free list
44 // An object group is treated like a single JS object: if one of object in
45 // the group is alive, all objects in the same group are considered alive.
46 // An object group is used to simulate object relationship in a DOM tree.
49 static ObjectGroup* New(Object*** handles,
51 v8::RetainedObjectInfo* info) {
53 ObjectGroup* group = reinterpret_cast<ObjectGroup*>(
54 malloc(OFFSET_OF(ObjectGroup, objects_[length])));
55 group->length_ = length;
57 CopyWords(group->objects_, handles, static_cast<int>(length));
62 if (info_ != NULL) info_->Dispose();
67 v8::RetainedObjectInfo* info_;
68 Object** objects_[1]; // Variable sized array.
71 void* operator new(size_t size);
72 void operator delete(void* p);
74 DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectGroup);
78 // An implicit references group consists of two parts: a parent object and
79 // a list of children objects. If the parent is alive, all the children
81 class ImplicitRefGroup {
83 static ImplicitRefGroup* New(HeapObject** parent,
87 ImplicitRefGroup* group = reinterpret_cast<ImplicitRefGroup*>(
88 malloc(OFFSET_OF(ImplicitRefGroup, children_[length])));
89 group->parent_ = parent;
90 group->length_ = length;
91 CopyWords(group->children_, children, static_cast<int>(length));
101 Object** children_[1]; // Variable sized array.
104 void* operator new(size_t size);
105 void operator delete(void* p);
107 DISALLOW_IMPLICIT_CONSTRUCTORS(ImplicitRefGroup);
111 typedef void (*WeakReferenceGuest)(Object* object, void* parameter);
113 class GlobalHandles {
117 // Creates a new global handle that is alive until Destroy is called.
118 Handle<Object> Create(Object* value);
120 // Destroy a global handle.
121 void Destroy(Object** location);
123 // Make the global handle weak and set the callback parameter for the
124 // handle. When the garbage collector recognizes that only weak global
125 // handles point to an object the handles are cleared and the callback
126 // function is invoked (for each handle) with the handle and corresponding
127 // parameter as arguments. Note: cleared means set to Smi::FromInt(0). The
128 // reason is that Smi::FromInt(0) does not change during garage collection.
129 void MakeWeak(Object** location,
131 WeakReferenceCallback callback);
133 static void SetWrapperClassId(Object** location, uint16_t class_id);
135 // Returns the current number of weak handles.
136 int NumberOfWeakHandles() { return number_of_weak_handles_; }
138 void RecordStats(HeapStats* stats);
140 // Returns the current number of weak handles to global objects.
141 // These handles are also included in NumberOfWeakHandles().
142 int NumberOfGlobalObjectWeakHandles() {
143 return number_of_global_object_weak_handles_;
146 // Returns the current number of handles to global objects.
147 int NumberOfGlobalHandles() {
148 return number_of_global_handles_;
151 // Clear the weakness of a global handle.
152 void ClearWeakness(Object** location);
154 // Clear the weakness of a global handle.
155 void MarkIndependent(Object** location);
157 // Tells whether global handle is near death.
158 static bool IsNearDeath(Object** location);
160 // Tells whether global handle is weak.
161 static bool IsWeak(Object** location);
163 // Process pending weak handles.
164 // Returns true if next major GC is likely to collect more garbage.
165 bool PostGarbageCollectionProcessing(GarbageCollector collector);
167 // Iterates over all strong handles.
168 void IterateStrongRoots(ObjectVisitor* v);
170 // Iterates over all handles.
171 void IterateAllRoots(ObjectVisitor* v);
173 // Iterates over all handles that have embedder-assigned class ID.
174 void IterateAllRootsWithClassIds(ObjectVisitor* v);
176 // Iterates over all weak roots in heap.
177 void IterateWeakRoots(ObjectVisitor* v);
179 // Iterates over weak roots that are bound to a given callback.
180 void IterateWeakRoots(WeakReferenceGuest f,
181 WeakReferenceCallback callback);
183 // Find all weak handles satisfying the callback predicate, mark
185 void IdentifyWeakHandles(WeakSlotCallback f);
187 // NOTE: Three ...NewSpace... functions below are used during
188 // scavenge collections and iterate over sets of handles that are
189 // guaranteed to contain all handles holding new space objects (but
190 // may also include old space objects).
192 // Iterates over strong and dependent handles. See the node above.
193 void IterateNewSpaceStrongAndDependentRoots(ObjectVisitor* v);
195 // Finds weak independent handles satisfying the callback predicate
196 // and marks them as pending. See the note above.
197 void IdentifyNewSpaceWeakIndependentHandles(WeakSlotCallbackWithHeap f);
199 // Iterates over weak independent handles. See the note above.
200 void IterateNewSpaceWeakIndependentRoots(ObjectVisitor* v);
202 // Add an object group.
203 // Should be only used in GC callback function before a collection.
204 // All groups are destroyed after a mark-compact collection.
205 void AddObjectGroup(Object*** handles,
207 v8::RetainedObjectInfo* info);
209 // Add an implicit references' group.
210 // Should be only used in GC callback function before a collection.
211 // All groups are destroyed after a mark-compact collection.
212 void AddImplicitReferences(HeapObject** parent,
216 // Returns the object groups.
217 List<ObjectGroup*>* object_groups() { return &object_groups_; }
219 // Returns the implicit references' groups.
220 List<ImplicitRefGroup*>* implicit_ref_groups() {
221 return &implicit_ref_groups_;
224 // Remove bags, this should only happen after GC.
225 void RemoveObjectGroups();
226 void RemoveImplicitRefGroups();
228 // Tear down the global handle structure.
231 Isolate* isolate() { return isolate_; }
239 explicit GlobalHandles(Isolate* isolate);
241 // Internal node structures.
248 // Field always containing the number of weak and near-death handles.
249 int number_of_weak_handles_;
251 // Field always containing the number of weak and near-death handles
252 // to global objects. These objects are also included in
253 // number_of_weak_handles_.
254 int number_of_global_object_weak_handles_;
256 // Field always containing the number of handles to global objects.
257 int number_of_global_handles_;
259 // List of all allocated node blocks.
260 NodeBlock* first_block_;
262 // List of node blocks with used nodes.
263 NodeBlock* first_used_block_;
265 // Free list of nodes.
268 // Contains all nodes holding new space objects. Note: when the list
269 // is accessed, some of the objects may have been promoted already.
270 List<Node*> new_space_nodes_;
272 int post_gc_processing_count_;
274 List<ObjectGroup*> object_groups_;
275 List<ImplicitRefGroup*> implicit_ref_groups_;
277 friend class Isolate;
279 DISALLOW_COPY_AND_ASSIGN(GlobalHandles);
283 } } // namespace v8::internal
285 #endif // V8_GLOBAL_HANDLES_H_