[vmkit-commits] [vmkit] r86258 - in /vmkit/trunk: include/mvm/Threads/CollectionRV.h lib/Mvm/CommonThread/CollectionRV.cpp lib/Mvm/GCMmap2/gccollector.cpp mmtk/mmtk-j3/Collection.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Fri Nov 6 09:46:28 PST 2009
Author: geoffray
Date: Fri Nov 6 11:46:28 2009
New Revision: 86258
URL: http://llvm.org/viewvc/llvm-project?rev=86258&view=rev
Log:
Add a startRV function that takes the lock.
Modified:
vmkit/trunk/include/mvm/Threads/CollectionRV.h
vmkit/trunk/lib/Mvm/CommonThread/CollectionRV.cpp
vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp
vmkit/trunk/mmtk/mmtk-j3/Collection.cpp
Modified: vmkit/trunk/include/mvm/Threads/CollectionRV.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/CollectionRV.h?rev=86258&r1=86257&r2=86258&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/Threads/CollectionRV.h (original)
+++ vmkit/trunk/include/mvm/Threads/CollectionRV.h Fri Nov 6 11:46:28 2009
@@ -63,25 +63,26 @@
void waitEndOfRV();
void waitRV();
+
+ void startRV() {
+ mvm::Thread::get()->inRV = true;
+ lockRV();
+ }
void finishRV() {
+
if (cooperative) {
- // We lock here to make sure no threads previously blocked in native
- // will join the collection and never go back to running code.
- lockRV();
mvm::Thread* cur = initiator;
do {
cur->doYield = false;
cur = (mvm::Thread*)cur->next();
} while (cur != initiator);
- rendezvousNb++;
- condEndRV.broadcast();
- unlockRV();
- } else {
- rendezvousNb++;
- condEndRV.broadcast();
}
+
+ rendezvousNb++;
+ condEndRV.broadcast();
initiator->inRV = false;
+ unlockRV();
}
void collectorGo() { condInitiator.broadcast(); }
Modified: vmkit/trunk/lib/Mvm/CommonThread/CollectionRV.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/CommonThread/CollectionRV.cpp?rev=86258&r1=86257&r2=86258&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/CommonThread/CollectionRV.cpp (original)
+++ vmkit/trunk/lib/Mvm/CommonThread/CollectionRV.cpp Fri Nov 6 11:46:28 2009
@@ -46,11 +46,6 @@
initiator = self;
nbJoined = 0;
- // Lock. Changes on the doYield flag of threads must be protected, as
- // threads may wake up after being blocked in native code and join the
- // rendezvous.
- lockRV();
-
mvm::Thread* cur = self;
do {
cur->joinedRV = false;
@@ -67,11 +62,6 @@
}
}
- // And wait for other threads to join.
- waitRV();
-
- unlockRV();
-
} else {
mvm::Thread* self = mvm::Thread::get();
self->joinedRV = false;
@@ -85,11 +75,10 @@
cur->killForRendezvous();
}
- lockRV();
- // And wait for other threads to finish.
- waitRV();
- unlockRV();
}
+
+ // And wait for other threads to finish.
+ waitRV();
self->MyVM->ThreadLock.unlock();
}
Modified: vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp?rev=86258&r1=86257&r2=86258&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp Fri Nov 6 11:46:28 2009
@@ -43,6 +43,7 @@
mvm::Thread* th = mvm::Thread::get();
mvm::StackScanner* sc = th->MyVM->getScanner();
+ th->MyVM->rendezvous.startRV();
th->MyVM->startCollection();
th->MyVM->rendezvous.synchronize();
Modified: vmkit/trunk/mmtk/mmtk-j3/Collection.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-j3/Collection.cpp?rev=86258&r1=86257&r2=86258&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-j3/Collection.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-j3/Collection.cpp Fri Nov 6 11:46:28 2009
@@ -37,36 +37,45 @@
extern "C" void Java_org_j3_mmtk_Collection_triggerCollection__I (JavaObject* C, int why) {
mvm::Thread* th = mvm::Thread::get();
-
- th->MyVM->startCollection();
- th->MyVM->rendezvous.synchronize();
+
+ // Verify that another collection is not happening.
+ th->MyVM->rendezvous.startRV();
+ if (th->doYield) {
+ th->MyVM->rendezvous.unlockRV();
+ th->MyVM->rendezvous.join();
+ return;
+ } else {
+ th->MyVM->startCollection();
+ th->MyVM->rendezvous.synchronize();
- JnJVM_org_mmtk_plan_Plan_setCollectionTriggered__();
+ JnJVM_org_mmtk_plan_Plan_setCollectionTriggered__();
- // Record the starting time
- int64_t startTime = Java_org_j3_mmtk_Statistics_nanoTime__();
+ // Record the starting time
+ int64_t startTime = Java_org_j3_mmtk_Statistics_nanoTime__();
- // Collect!
- JnJVM_org_j3_config_Selected_00024Collector_staticCollect__();
+ // 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);
+ // 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__();
+ // 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_utility_heap_HeapGrowthManager_reset__();
- JnJVM_org_mmtk_plan_Plan_collectionComplete__();
+ JnJVM_org_mmtk_plan_Plan_collectionComplete__();
- th->MyVM->rendezvous.finishRV();
-
- th->MyVM->endCollection();
+ th->MyVM->rendezvous.finishRV();
- th->MyVM->wakeUpFinalizers();
- th->MyVM->wakeUpEnqueue();
+ th->MyVM->wakeUpFinalizers();
+ th->MyVM->wakeUpEnqueue();
+
+ th->MyVM->endCollection();
+ }
+
}
More information about the vmkit-commits
mailing list