[vmkit-commits] [vmkit] r137586 - in /vmkit/trunk: lib/J3/LLVMRuntime/runtime-mmtk-thread.ll lib/Mvm/MMTk/MutatorThread.h mmtk/java/src/org/j3/bindings/Bindings.java mmtk/mmtk-alloc/Selected.cpp mmtk/mmtk-j3/Collection.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sun Aug 14 08:39:50 PDT 2011


Author: geoffray
Date: Sun Aug 14 10:39:50 2011
New Revision: 137586

URL: http://llvm.org/viewvc/llvm-project?rev=137586&view=rev
Log:
Truely support generational GC by allowing full GC heaps to happen.


Modified:
    vmkit/trunk/lib/J3/LLVMRuntime/runtime-mmtk-thread.ll
    vmkit/trunk/lib/Mvm/MMTk/MutatorThread.h
    vmkit/trunk/mmtk/java/src/org/j3/bindings/Bindings.java
    vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
    vmkit/trunk/mmtk/mmtk-j3/Collection.cpp

Modified: vmkit/trunk/lib/J3/LLVMRuntime/runtime-mmtk-thread.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/LLVMRuntime/runtime-mmtk-thread.ll?rev=137586&r1=137585&r2=137586&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/LLVMRuntime/runtime-mmtk-thread.ll (original)
+++ vmkit/trunk/lib/J3/LLVMRuntime/runtime-mmtk-thread.ll Sun Aug 14 10:39:50 2011
@@ -4,4 +4,5 @@
 ;;; field 1: allocator
 ;;; field 2: MutatorContext
 ;;; field 3: realRoutine
-%MutatorThread = type { %Thread, %ThreadAllocator, i8*, i8* }
+;;; field 4: CollectionAttempts
+%MutatorThread = type { %Thread, %ThreadAllocator, i8*, i8*, i32 }

Modified: vmkit/trunk/lib/Mvm/MMTk/MutatorThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/MMTk/MutatorThread.h?rev=137586&r1=137585&r2=137586&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/MMTk/MutatorThread.h (original)
+++ vmkit/trunk/lib/Mvm/MMTk/MutatorThread.h Sun Aug 14 10:39:50 2011
@@ -20,6 +20,7 @@
 public:
   MutatorThread() : mvm::Thread() {
     MutatorContext = 0;
+    CollectionAttempts = 0;
   }
   mvm::ThreadAllocator Allocator;
   uintptr_t MutatorContext;
@@ -28,6 +29,8 @@
   ///
   void (*realRoutine)(mvm::Thread*);
 
+  uint32_t CollectionAttempts;
+
   static void init(Thread* _th);
 
   static MutatorThread* get() {

Modified: vmkit/trunk/mmtk/java/src/org/j3/bindings/Bindings.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/java/src/org/j3/bindings/Bindings.java?rev=137586&r1=137585&r2=137586&view=diff
==============================================================================
--- vmkit/trunk/mmtk/java/src/org/j3/bindings/Bindings.java (original)
+++ vmkit/trunk/mmtk/java/src/org/j3/bindings/Bindings.java Sun Aug 14 10:39:50 2011
@@ -16,6 +16,10 @@
 import org.mmtk.plan.TransitiveClosure;
 import org.mmtk.utility.heap.HeapGrowthManager;
 import org.mmtk.utility.Constants;
+import org.mmtk.utility.Log;
+import org.mmtk.utility.options.Options;
+import org.mmtk.vm.Collection;
+import org.mmtk.vm.VM;
 import org.vmmagic.pragma.Inline;
 import org.vmmagic.unboxed.Address;
 import org.vmmagic.unboxed.Extent;
@@ -164,4 +168,37 @@
   private static boolean needsNonHeapWriteBarrier() {
     return Selected.Constraints.get().needsObjectReferenceNonHeapWriteBarrier();
   }
+
+  @Inline
+  private static void collect(int why) {
+    boolean userTriggered = why == Collection.EXTERNAL_GC_TRIGGER;
+    boolean internalPhaseTriggered = why == Collection.INTERNAL_PHASE_GC_TRIGGER;
+
+    if (Options.verbose.getValue() == 1 || Options.verbose.getValue() == 2) {
+      if (userTriggered) {
+        Log.write("[Forced GC]");
+      } else if (internalPhaseTriggered) {
+        Log.write("[Phase GC]");
+      }
+    }
+
+    Plan.setCollectionTriggered();
+    Plan.setCollectionTrigger(why);
+
+    long startTime = VM.statistics.nanoTime();
+    Selected.Collector.staticCollect();
+    long elapsedTime = VM.statistics.nanoTime() - startTime;
+
+    HeapGrowthManager.recordGCTime(((double)elapsedTime) / 1000000);
+
+    if (Selected.Plan.get().lastCollectionFullHeap() && !internalPhaseTriggered) {
+      if (Options.variableSizeHeap.getValue() && !userTriggered) {
+        // Don't consider changing the heap size if gc was forced by System.gc()
+        HeapGrowthManager.considerHeapSize();
+      }
+      HeapGrowthManager.reset();
+    }
+
+    Plan.collectionComplete();
+  }
 }

Modified: vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp?rev=137586&r1=137585&r2=137586&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp Sun Aug 14 10:39:50 2011
@@ -157,7 +157,7 @@
 }
 
 void Collector::initialise() {
-  JnJVM_org_j3_bindings_Bindings_boot__Lorg_vmmagic_unboxed_Extent_2Lorg_vmmagic_unboxed_Extent_2(128 * 1024 * 1024, 1024 * 1024 * 1024);
+  JnJVM_org_j3_bindings_Bindings_boot__Lorg_vmmagic_unboxed_Extent_2Lorg_vmmagic_unboxed_Extent_2(20 * 1024 * 1024, 100 * 1024 * 1024);
 }
 
 extern "C" void* MMTkMutatorAllocate(uint32_t size, VirtualTable* VT) {

Modified: vmkit/trunk/mmtk/mmtk-j3/Collection.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-j3/Collection.cpp?rev=137586&r1=137585&r2=137586&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-j3/Collection.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-j3/Collection.cpp Sun Aug 14 10:39:50 2011
@@ -14,25 +14,20 @@
 
 namespace mmtk {
 
-extern "C" void JnJVM_org_mmtk_plan_Plan_setCollectionTriggered__();
-extern "C" void JnJVM_org_j3_config_Selected_00024Collector_staticCollect__();
-extern "C" void JnJVM_org_mmtk_plan_Plan_collectionComplete__();
-extern "C" uint8_t JnJVM_org_mmtk_utility_heap_HeapGrowthManager_considerHeapSize__();
-extern "C" void JnJVM_org_mmtk_utility_heap_HeapGrowthManager_reset__();
-extern "C" int64_t Java_org_j3_mmtk_Statistics_nanoTime__ ();
-extern "C" void JnJVM_org_mmtk_utility_heap_HeapGrowthManager_recordGCTime__D(double);
-
 extern "C" bool Java_org_j3_mmtk_Collection_isEmergencyAllocation__ (MMTkObject* C) {
   // TODO: emergency when OOM.
   return false;
 }
 
 extern "C" void Java_org_j3_mmtk_Collection_reportAllocationSuccess__ (MMTkObject* C) {
-  // TODO: clear internal data.
+  mvm::MutatorThread::get()->CollectionAttempts = 0;
 }
 
+extern "C" void JnJVM_org_j3_bindings_Bindings_collect__I(int why);
+
 extern "C" void Java_org_j3_mmtk_Collection_triggerCollection__I (MMTkObject* C, int why) {
-  mvm::Thread* th = mvm::Thread::get();
+  mvm::MutatorThread* th = mvm::MutatorThread::get();
+  if (why > 2) th->CollectionAttempts++;
 
   // Verify that another collection is not happening.
   th->MyVM->rendezvous.startRV();
@@ -43,34 +38,8 @@
   } else {
     th->MyVM->startCollection();
     th->MyVM->rendezvous.synchronize();
-  
-    JnJVM_org_mmtk_plan_Plan_setCollectionTriggered__();
-
-    // Record the starting time
-    int64_t startTime = Java_org_j3_mmtk_Statistics_nanoTime__();
-
-    // Collect!
-    JnJVM_org_j3_config_Selected_00024Collector_staticCollect__();
-
-    // Record the time to GC.
-    int64_t elapsedTime = Java_org_j3_mmtk_Statistics_nanoTime__() - startTime;
-
-    JnJVM_org_mmtk_utility_heap_HeapGrowthManager_recordGCTime__D(((double)elapsedTime) / 1000000);
 
-    // 2 means called by System.gc();
-    if (why != 2)
-      JnJVM_org_mmtk_utility_heap_HeapGrowthManager_considerHeapSize__();
-
-    JnJVM_org_mmtk_utility_heap_HeapGrowthManager_reset__();
-
-    JnJVM_org_mmtk_plan_Plan_collectionComplete__();
-    
-    if (mvm::Collector::verbose > 0) {
-      static int collectionNum = 1;
-      if (why == 2) fprintf(stderr, "[Forced] ");
-      fprintf(stderr, "Collection %d finished in %lld ms.\n", collectionNum++,
-              elapsedTime / 1000000);
-    }
+    JnJVM_org_j3_bindings_Bindings_collect__I(why);
 
     th->MyVM->rendezvous.finishRV();
     th->MyVM->endCollection();
@@ -89,7 +58,18 @@
 }
 
 extern "C" int Java_org_j3_mmtk_Collection_maximumCollectionAttempt__ (MMTkObject* C) {
-  return 0;
+  mvm::MutatorThread* th = mvm::MutatorThread::get();
+  mvm::MutatorThread* tcur = th;
+
+  uint32_t max = 0; 
+  do {
+    if (tcur->CollectionAttempts > max) {
+      max = tcur->CollectionAttempts;
+    }
+    tcur = (mvm::MutatorThread*)tcur->next();
+  } while (tcur != th);
+
+  return max;
 }
 
 extern "C" void Java_org_j3_mmtk_Collection_prepareCollector__Lorg_mmtk_plan_CollectorContext_2 (MMTkObject* C, MMTkObject* CC) {





More information about the vmkit-commits mailing list