[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