Author: [email protected]
Date: Tue May 5 02:26:06 2009
New Revision: 1856
Modified:
branches/bleeding_edge/src/global-handles.cc
branches/bleeding_edge/src/global-handles.h
branches/bleeding_edge/src/mark-compact.cc
branches/bleeding_edge/src/mark-compact.h
Log:
Some cleanup of the mark-sweep/compact collector following the symbol
table debacle.
Review URL: http://codereview.chromium.org/109012
Modified: branches/bleeding_edge/src/global-handles.cc
==============================================================================
--- branches/bleeding_edge/src/global-handles.cc (original)
+++ branches/bleeding_edge/src/global-handles.cc Tue May 5 02:26:06 2009
@@ -258,7 +258,7 @@
}
-void GlobalHandles::MarkWeakRoots(WeakSlotCallback f) {
+void GlobalHandles::IdentifyWeakHandles(WeakSlotCallback f) {
for (Node* current = head_; current != NULL; current = current->next()) {
if (current->state_ == Node::WEAK) {
if (f(¤t->object_)) {
Modified: branches/bleeding_edge/src/global-handles.h
==============================================================================
--- branches/bleeding_edge/src/global-handles.h (original)
+++ branches/bleeding_edge/src/global-handles.h Tue May 5 02:26:06 2009
@@ -98,8 +98,9 @@
// Iterates over all weak roots in heap.
static void IterateWeakRoots(ObjectVisitor* v);
- // Mark the weak pointers based on the callback.
- static void MarkWeakRoots(WeakSlotCallback f);
+ // Find all weak handles satisfying the callback predicate, mark
+ // them as pending.
+ static void IdentifyWeakHandles(WeakSlotCallback f);
// Add an object group.
// Should only used in GC callback function before a collection.
Modified: branches/bleeding_edge/src/mark-compact.cc
==============================================================================
--- branches/bleeding_edge/src/mark-compact.cc (original)
+++ branches/bleeding_edge/src/mark-compact.cc Tue May 5 02:26:06 2009
@@ -555,10 +555,8 @@
}
-bool MarkCompactCollector::MustBeMarked(Object** p) {
- // Check whether *p is a HeapObject pointer.
- if (!(*p)->IsHeapObject()) return false;
- return !HeapObject::cast(*p)->IsMarked();
+bool MarkCompactCollector::IsUnmarkedHeapObject(Object** p) {
+ return (*p)->IsHeapObject() && !HeapObject::cast(*p)->IsMarked();
}
@@ -756,19 +754,20 @@
RootMarkingVisitor root_visitor;
MarkRoots(&root_visitor);
- // The objects reachable from the roots are marked black, unreachable
- // objects are white. Mark objects reachable from object groups with at
- // least one marked object, and continue until no new objects are
- // reachable from the object groups.
+ // The objects reachable from the roots are marked, yet unreachable
+ // objects are unmarked. Mark objects reachable from object groups
+ // containing at least one marked object, and continue until no new
+ // objects are reachable from the object groups.
ProcessObjectGroups(root_visitor.stack_visitor());
- // The objects reachable from the roots or object groups are marked
black,
- // unreachable objects are white. Process objects reachable only from
- // weak global handles.
+ // The objects reachable from the roots or object groups are marked,
+ // yet unreachable objects are unmarked. Mark objects reachable
+ // only from weak global handles.
//
- // First we mark weak pointers not yet reachable.
- GlobalHandles::MarkWeakRoots(&MustBeMarked);
- // Then we process weak pointers and process the transitive closure.
+ // First we identify nonlive weak handles and mark them as pending
+ // destruction.
+ GlobalHandles::IdentifyWeakHandles(&IsUnmarkedHeapObject);
+ // Then we mark the objects and process the transitive closure.
GlobalHandles::IterateWeakRoots(&root_visitor);
while (marking_stack.overflowed()) {
RefillMarkingStack();
@@ -801,22 +800,21 @@
#ifdef DEBUG
-void MarkCompactCollector::UpdateLiveObjectCount(HeapObject* obj, int
scale) {
- ASSERT(scale == -1 || scale == 1);
- live_bytes_ += obj->Size() * scale;
+void MarkCompactCollector::UpdateLiveObjectCount(HeapObject* obj) {
+ live_bytes_ += obj->Size();
if (Heap::new_space()->Contains(obj)) {
- live_young_objects_ += scale;
+ live_young_objects_++;
} else if (Heap::map_space()->Contains(obj)) {
ASSERT(obj->IsMap());
- live_map_objects_ += scale;
+ live_map_objects_ ++;
} else if (Heap::old_pointer_space()->Contains(obj)) {
- live_old_pointer_objects_ += scale;
+ live_old_pointer_objects_++;
} else if (Heap::old_data_space()->Contains(obj)) {
- live_old_data_objects_ += scale;
+ live_old_data_objects_++;
} else if (Heap::code_space()->Contains(obj)) {
- live_code_objects_ += scale;
+ live_code_objects_++;
} else if (Heap::lo_space()->Contains(obj)) {
- live_lo_objects_ +=scale;
+ live_lo_objects_++;
} else {
UNREACHABLE();
}
Modified: branches/bleeding_edge/src/mark-compact.h
==============================================================================
--- branches/bleeding_edge/src/mark-compact.h (original)
+++ branches/bleeding_edge/src/mark-compact.h Tue May 5 02:26:06 2009
@@ -142,7 +142,6 @@
friend class RootMarkingVisitor;
friend class MarkingVisitor;
- friend class UnmarkingVisitor;
// Marking operations for objects reachable from roots.
static void MarkLiveObjects();
@@ -156,7 +155,7 @@
static inline void SetMark(HeapObject* obj) {
tracer_->increment_marked_count();
#ifdef DEBUG
- UpdateLiveObjectCount(obj, 1);
+ UpdateLiveObjectCount(obj);
#endif
obj->SetMark();
}
@@ -203,14 +202,12 @@
// flag on the marking stack.
static void RefillMarkingStack();
- // Callback function for telling whether the object *p must be marked.
- static bool MustBeMarked(Object** p);
+ // Callback function for telling whether the object *p is an unmarked
+ // heap object.
+ static bool IsUnmarkedHeapObject(Object** p);
#ifdef DEBUG
- // The scale argument is positive 1 if we are marking an object and
- // -1 if we are clearing the mark bit of an object that we didn't
- // actually want marked.
- static void UpdateLiveObjectCount(HeapObject* obj, int scale);
+ static void UpdateLiveObjectCount(HeapObject* obj);
#endif
// We sweep the large object space in the same way whether we are
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---