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(&current->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
-~----------~----~----~----~------~----~------~--~---

Reply via email to