Chromium Code Reviews| Index: src/global-handles.h |
| diff --git a/src/global-handles.h b/src/global-handles.h |
| index ffec6c20445f4abe9258b5c95024d17e2e9ea7f1..3ce685c3cd64646c693e0c1e2337c122c155e205 100644 |
| --- a/src/global-handles.h |
| +++ b/src/global-handles.h |
| @@ -42,10 +42,16 @@ namespace internal { |
| // At GC the destroyed global handles are removed from the free list |
| // and deallocated. |
| +// Data structures for tracking object groups and implicit references. |
| + |
| // An object group is treated like a single JS object: if one of object in |
| // the group is alive, all objects in the same group are considered alive. |
| // An object group is used to simulate object relationship in a DOM tree. |
| +// An implicit references group consists of two parts: a parent object and a |
| +// list of children objects. If the parent is alive, all the children are alive |
| +// too. |
| + |
| struct ObjectGroupConnection { |
| ObjectGroupConnection(UniqueId id, Object** object) |
| : id(id), object(object) {} |
| @@ -80,36 +86,21 @@ struct ObjectGroupRetainerInfo { |
| }; |
| -// An implicit references group consists of two parts: a parent object and |
| -// a list of children objects. If the parent is alive, all the children |
| -// are alive too. |
| -class ImplicitRefGroup { |
| - public: |
| - static ImplicitRefGroup* New(HeapObject** parent, |
| - Object*** children, |
| - size_t length) { |
| - ASSERT(length > 0); |
| - ImplicitRefGroup* group = reinterpret_cast<ImplicitRefGroup*>( |
| - malloc(OFFSET_OF(ImplicitRefGroup, children_[length]))); |
| - group->parent_ = parent; |
| - group->length_ = length; |
| - CopyWords(group->children_, children, static_cast<int>(length)); |
| - return group; |
| - } |
| +struct ObjectGroupRepresentativeObject { |
|
Michael Starzinger
2013/04/16 10:42:16
Let's just call this structure "ObjectGroupReprese
marja
2013/04/16 12:28:37
Done.
|
| + ObjectGroupRepresentativeObject(UniqueId id, |
| + HeapObject** object) |
| + : id(id), object(object) {} |
| - void Dispose() { |
| - free(this); |
| + bool operator==(const ObjectGroupRepresentativeObject& other) const { |
| + return id == other.id; |
| } |
| - HeapObject** parent_; |
| - size_t length_; |
| - Object** children_[1]; // Variable sized array. |
| + bool operator<(const ObjectGroupRepresentativeObject& other) const { |
| + return id < other.id; |
| + } |
| - private: |
| - void* operator new(size_t size); |
| - void operator delete(void* p); |
| - ~ImplicitRefGroup(); |
| - DISALLOW_IMPLICIT_CONSTRUCTORS(ImplicitRefGroup); |
| + UniqueId id; |
| + HeapObject** object; |
| }; |
| @@ -223,7 +214,15 @@ class GlobalHandles { |
| // All groups are destroyed after a garbage collection. |
| void SetObjectGroupId(Object** handle, UniqueId id); |
| - void SetRetainedObjectInfo(UniqueId id, RetainedObjectInfo* info = NULL); |
| + // Set RetainedObjectInfo for an object group. Should not be called more than |
| + // once for a group. Should not be called for a group which contains no |
| + // handles. |
| + void SetRetainedObjectInfo(UniqueId id, RetainedObjectInfo* info); |
| + |
| + // Sets a representative object for an object group. Should not be called more |
| + // than once for a group. Should not be called for a group which contains no |
| + // handles. |
| + void SetRepresentativeObject(UniqueId id, HeapObject** representative_object); |
| // Add an implicit references' group. |
| // Should be only used in GC callback function before a collection. |
| @@ -232,6 +231,12 @@ class GlobalHandles { |
| Object*** children, |
| size_t length); |
| + // Adds an implicit reference from a group (representative object of that |
| + // group) to an object. Should be only used in GC callback function before a |
| + // collection. All implicit references are destroyed after a mark-compact |
| + // collection. |
| + void AddImplicitReference(UniqueId id, Object** child); |
| + |
| List<ObjectGroupConnection>* object_groups() { |
| return &object_groups_; |
| } |
| @@ -240,11 +245,14 @@ class GlobalHandles { |
| return &retainer_infos_; |
| } |
| - // Returns the implicit references' groups. |
| - List<ImplicitRefGroup*>* implicit_ref_groups() { |
| + List<ObjectGroupConnection>* implicit_ref_groups() { |
| return &implicit_ref_groups_; |
| } |
| + List<ObjectGroupRepresentativeObject>* representative_objects() { |
| + return &representative_objects_; |
| + } |
| + |
| // Remove bags, this should only happen after GC. |
| void RemoveObjectGroups(); |
| void RemoveImplicitRefGroups(); |
| @@ -287,9 +295,13 @@ class GlobalHandles { |
| int post_gc_processing_count_; |
| + // Object groups. |
| List<ObjectGroupConnection> object_groups_; |
| List<ObjectGroupRetainerInfo> retainer_infos_; |
| - List<ImplicitRefGroup*> implicit_ref_groups_; |
| + List<ObjectGroupRepresentativeObject> representative_objects_; |
| + |
| + // Implicit references. |
| + List<ObjectGroupConnection> implicit_ref_groups_; |
| friend class Isolate; |