[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