Revision: 21991
Author:   [email protected]
Date:     Wed Jun 25 06:29:36 2014 UTC
Log:      Update survival statistics correctly in the Scavenger.

BUG=
[email protected]

Review URL: https://codereview.chromium.org/351893003
http://code.google.com/p/v8/source/detail?r=21991

Modified:
 /branches/bleeding_edge/src/heap.cc

=======================================
--- /branches/bleeding_edge/src/heap.cc Tue Jun 24 14:30:22 2014 UTC
+++ /branches/bleeding_edge/src/heap.cc Wed Jun 25 06:29:36 2014 UTC
@@ -1986,17 +1986,14 @@
     }

     Heap* heap = map->GetHeap();
-    if (heap->ShouldBePromoted(object->address(), object_size)) {
-      AllocationResult allocation;
+    AllocationResult allocation;

-      if (object_contents == DATA_OBJECT) {
-        ASSERT(heap->AllowedToBeMigrated(object, OLD_DATA_SPACE));
-        allocation = heap->old_data_space()->AllocateRaw(allocation_size);
-      } else {
-        ASSERT(heap->AllowedToBeMigrated(object, OLD_POINTER_SPACE));
- allocation = heap->old_pointer_space()->AllocateRaw(allocation_size);
-      }
+    if (!heap->ShouldBePromoted(object->address(), object_size)) {
+      ASSERT(heap->AllowedToBeMigrated(object, NEW_SPACE));
+      allocation = heap->new_space()->AllocateRaw(allocation_size);

+      // Allocation in the other semi-space may fail due to fragmentation.
+      // In that case we allocate in the old generation.
       HeapObject* target = NULL;  // Initialization to please compiler.
       if (allocation.To(&target)) {
         if (alignment != kObjectAlignment) {
@@ -2009,49 +2006,48 @@
         *slot = target;
         MigrateObject(heap, object, target, object_size);

-        if (object_contents == POINTER_OBJECT) {
-          if (map->instance_type() == JS_FUNCTION_TYPE) {
-            heap->promotion_queue()->insert(
-                target, JSFunction::kNonWeakFieldsEndOffset);
-          } else {
-            heap->promotion_queue()->insert(target, object_size);
-          }
-        }
-
-        heap->IncrementPromotedObjectsSize(object_size);
+        heap->promotion_queue()->SetNewLimit(heap->new_space()->top());
+        heap->IncrementSemiSpaceCopiedObjectSize(object_size);
         return;
       }
     }
-    ASSERT(heap->AllowedToBeMigrated(object, NEW_SPACE));
-    AllocationResult allocation =
-        heap->new_space()->AllocateRaw(allocation_size);
-    heap->promotion_queue()->SetNewLimit(heap->new_space()->top());

-    // Allocation in the other semi-space may fail due to fragmentation.
-    // In that case we allocate in the old generation.
-    if (allocation.IsRetry()) {
-      if (object_contents == DATA_OBJECT) {
-        ASSERT(heap->AllowedToBeMigrated(object, OLD_DATA_SPACE));
-        allocation = heap->old_data_space()->AllocateRaw(allocation_size);
-      } else {
-        ASSERT(heap->AllowedToBeMigrated(object, OLD_POINTER_SPACE));
- allocation = heap->old_pointer_space()->AllocateRaw(allocation_size);
-      }
+    if (object_contents == DATA_OBJECT) {
+      ASSERT(heap->AllowedToBeMigrated(object, OLD_DATA_SPACE));
+      allocation = heap->old_data_space()->AllocateRaw(allocation_size);
+    } else {
+      ASSERT(heap->AllowedToBeMigrated(object, OLD_POINTER_SPACE));
+      allocation = heap->old_pointer_space()->AllocateRaw(allocation_size);
     }

-    HeapObject* target = HeapObject::cast(allocation.ToObjectChecked());
+    HeapObject* target = NULL;  // Initialization to please compiler.
+    if (allocation.To(&target)) {
+      if (alignment != kObjectAlignment) {
+        target = EnsureDoubleAligned(heap, target, allocation_size);
+      }
+
+      // Order is important: slot might be inside of the target if target
+      // was allocated over a dead object and slot comes from the store
+      // buffer.
+      *slot = target;
+      MigrateObject(heap, object, target, object_size);
+
+      if (object_contents == POINTER_OBJECT) {
+        if (map->instance_type() == JS_FUNCTION_TYPE) {
+          heap->promotion_queue()->insert(target,
+              JSFunction::kNonWeakFieldsEndOffset);
+        } else {
+          heap->promotion_queue()->insert(target, object_size);
+        }
+      }

-    if (alignment != kObjectAlignment) {
-      target = EnsureDoubleAligned(heap, target, allocation_size);
+      heap->IncrementPromotedObjectsSize(object_size);
+      return;
     }

-    // Order is important: slot might be inside of the target if target
-    // was allocated over a dead object and slot comes from the store
-    // buffer.
-    *slot = target;
-    MigrateObject(heap, object, target, object_size);
-    heap->IncrementSemiSpaceCopiedObjectSize(object_size);
-    return;
+    // The scavenger should always have enough space available in the old
+ // generation for promotion. Otherwise a full gc would have been triggered.
+    UNREACHABLE();
   }


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to