[vmkit-commits] [vmkit] r120939 - in /vmkit/branches/multi-vm: include/mvm/Threads/Thread.h include/mvm/VMKit.h lib/Mvm/CommonThread/CollectionRV.cpp lib/Mvm/Runtime/VMKit.cpp mmtk/mmtk-j3/ActivePlan.cpp mmtk/mmtk-j3/Scanning.cpp

Gael Thomas gael.thomas at lip6.fr
Sun Dec 5 07:18:00 PST 2010


Author: gthomas
Date: Sun Dec  5 09:18:00 2010
New Revision: 120939

URL: http://llvm.org/viewvc/llvm-project?rev=120939&view=rev
Log:
Rename oneThread in runningThreads. Now runningThreads is a fake node of the double list, implies that we don't have to worry about the first node.

Modified:
    vmkit/branches/multi-vm/include/mvm/Threads/Thread.h
    vmkit/branches/multi-vm/include/mvm/VMKit.h
    vmkit/branches/multi-vm/lib/Mvm/CommonThread/CollectionRV.cpp
    vmkit/branches/multi-vm/lib/Mvm/Runtime/VMKit.cpp
    vmkit/branches/multi-vm/mmtk/mmtk-j3/ActivePlan.cpp
    vmkit/branches/multi-vm/mmtk/mmtk-j3/Scanning.cpp

Modified: vmkit/branches/multi-vm/include/mvm/Threads/Thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/include/mvm/Threads/Thread.h?rev=120939&r1=120938&r2=120939&view=diff
==============================================================================
--- vmkit/branches/multi-vm/include/mvm/Threads/Thread.h (original)
+++ vmkit/branches/multi-vm/include/mvm/Threads/Thread.h Sun Dec  5 09:18:00 2010
@@ -60,11 +60,11 @@
 
   /// next - Get the next object in the list.
   ///
-  inline T *next0() { return _next; }
+  inline T *next() { return _next; }
 
   /// prev - Get the previous object in the list.
   ///
-  inline T *prev0() { return _prev; }
+  inline T *prev() { return _prev; }
 
   /// CricularBase - Creates the object as a single element in the list.
   ///
@@ -72,7 +72,7 @@
 
   /// CircularBase - Creates the object and place it in the given list.
   ///
-  inline explicit CircularBase(T *p) { appendTo(p); }
+  inline explicit CircularBase(CircularBase<T> *p) { appendTo(p); }
 
   /// remove - Remove the object from its list.
   ///
@@ -84,8 +84,8 @@
 
   /// append - Add the object in the list.
   ///
-  inline void appendTo(T *p) { 
-    _prev = p;
+  inline void appendTo(CircularBase<T> *p) { 
+    _prev = (T*)p;
     _next = p->_next;
     _next->_prev = (T*)this;
     _prev->_next = (T*)this;

Modified: vmkit/branches/multi-vm/include/mvm/VMKit.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/include/mvm/VMKit.h?rev=120939&r1=120938&r2=120939&view=diff
==============================================================================
--- vmkit/branches/multi-vm/include/mvm/VMKit.h (original)
+++ vmkit/branches/multi-vm/include/mvm/VMKit.h Sun Dec  5 09:18:00 2010
@@ -60,12 +60,12 @@
 	/// ------------------------------------------------- ///
 	/// ---             thread managment              --- ///
 	/// ------------------------------------------------- ///
-  /// oneThread - the linked list of thread. 
+  /// runningThreads - the list of running threads
   ///
-	Thread*                      oneThread;
+	CircularBase<Thread>         runningThreads;
 
-  /// numberOfThreads - The number of threads that currently run under this VM.
-  size_t                       numberOfThreads;
+  /// numberOfRunningThreads - The number of threads that currently run under this VM.
+  size_t                       numberOfRunningThreads;
 
   /// rendezvous - The rendezvous implementation for garbage collection.
   ///

Modified: vmkit/branches/multi-vm/lib/Mvm/CommonThread/CollectionRV.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/Mvm/CommonThread/CollectionRV.cpp?rev=120939&r1=120938&r2=120939&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/Mvm/CommonThread/CollectionRV.cpp (original)
+++ vmkit/branches/multi-vm/lib/Mvm/CommonThread/CollectionRV.cpp Sun Dec  5 09:18:00 2010
@@ -23,7 +23,7 @@
   assert(th->getLastSP() != NULL);
   assert(nbJoined < vmkit->NumberOfThreads);
   nbJoined++;
-  if (nbJoined == vmkit->numberOfThreads) {
+  if (nbJoined == vmkit->numberOfRunningThreads) {
     condInitiator.broadcast();
   }
 }
@@ -41,7 +41,7 @@
   // Add myself.
   nbJoined++;
 
-  while (nbJoined != mvm::Thread::get()->vmkit()->numberOfThreads) {
+  while (nbJoined != mvm::Thread::get()->vmkit()->numberOfRunningThreads) {
     condInitiator.wait(&_lockRV);
   } 
 }
@@ -49,30 +49,29 @@
 void CooperativeCollectionRV::synchronize() {
   assert(nbJoined == 0);
   mvm::Thread* self = mvm::Thread::get();
+	mvm::VMKit* vmkit = self->vmkit();
+
   // Lock thread lock, so that we can traverse the thread list safely. This will
   // be released on finishRV.
-	self->vmkit()->vmkitLock.lock();
+	vmkit->vmkitLock.lock();
 
-  mvm::Thread* cur = self;
-  do {
+	for(Thread* cur=vmkit->runningThreads.next(); cur!=&vmkit->runningThreads; cur=cur->next()) { 
     assert(!cur->doYield);
     cur->doYield = true;
     assert(!cur->joinedRV);
-    cur = cur->next0();
-  } while (cur != self);
- 
+  }
+
   // The CAS is not necessary but it does a memory barrier. 
   __sync_bool_compare_and_swap(&(self->joinedRV), false, true);
 
   // Lookup currently blocked threads.
-  for (cur = self->next0(); cur != self; 
-       cur = cur->next0()) {
-    if (cur->getLastSP()) {
+	for(Thread* cur=vmkit->runningThreads.next(); cur!=&vmkit->runningThreads; cur=cur->next()) {
+		if(cur->getLastSP() && cur != self) {
       nbJoined++;
       cur->joinedRV = true;
     }
   }
-  
+
   // And wait for other threads to finish.
   waitRV();
 
@@ -91,15 +90,18 @@
 void UncooperativeCollectionRV::synchronize() { 
   assert(nbJoined == 0);
   mvm::Thread* self = mvm::Thread::get();
+	mvm::VMKit* vmkit = self->vmkit();
+
   // Lock thread lock, so that we can traverse the thread list safely. This will
   // be released on finishRV.
   self->vmkit()->vmkitLock.lock();
-  
-  for (mvm::Thread* cur = self->next0(); cur != self; 
-       cur = cur->next0()) {
-    int res = cur->kill(SIGGC);
-    assert(!res && "Error on kill");
-  }
+
+	for(Thread* cur=vmkit->runningThreads.next(); cur!=&vmkit->runningThreads; cur=cur->next()) { 
+		if(cur!=self) {
+			int res = cur->kill(SIGGC);
+			assert(!res && "Error on kill");
+		}
+	}
   
   // And wait for other threads to finish.
   waitRV();
@@ -194,15 +196,15 @@
   lockRV();
     
   mvm::Thread* initiator = mvm::Thread::get();
-  mvm::Thread* cur = initiator;
-  do {
+	mvm::VMKit* vmkit = initiator->vmkit();
+
+  for(mvm::Thread* cur=vmkit->runningThreads.next(); cur!=&vmkit->runningThreads; cur=cur->next()) {
     assert(cur->doYield && "Inconsistent state");
     assert(cur->joinedRV && "Inconsistent state");
     cur->doYield = false;
     cur->joinedRV = false;
-    cur = cur->next0();
-  } while (cur != initiator);
-
+  }
+	
   assert(nbJoined == initiator->MyVM->NumberOfThreads && "Inconsistent state");
   nbJoined = 0;
   initiator->vmkit()->vmkitLock.unlock();

Modified: vmkit/branches/multi-vm/lib/Mvm/Runtime/VMKit.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/Mvm/Runtime/VMKit.cpp?rev=120939&r1=120938&r2=120939&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/Mvm/Runtime/VMKit.cpp (original)
+++ vmkit/branches/multi-vm/lib/Mvm/Runtime/VMKit.cpp Sun Dec  5 09:18:00 2010
@@ -28,12 +28,8 @@
 	delete[] oldVms;
 	
  	// reallocate the allVMDatas
- 	Thread* cur=oneThread;
-	if(cur) {
-		do {
-			cur->reallocAllVmsData(res, numberOfVms);
-			cur = cur->next0();
-		} while(cur!=oneThread);
+ 	for(Thread* cur=runningThreads.next(); cur!=&runningThreads; cur=cur->next()) {
+		cur->reallocAllVmsData(res, numberOfVms);
 	}
 
 	vmkitLock.unlock();
@@ -47,22 +43,16 @@
 
 void VMKit::addThread(mvm::Thread* th) {
 	vmkitLock.lock();
-	numberOfThreads++;
-	if (th != oneThread) {
-		if (oneThread) th->appendTo(oneThread);
-		else oneThread = th;
-	}
+	numberOfRunningThreads++;
+	th->appendTo(&runningThreads);
 	th->reallocAllVmsData(0, numberOfVms);
 	vmkitLock.unlock();
 }
   
 void VMKit::removeThread(mvm::Thread* th) {
 	vmkitLock.lock();
-	numberOfThreads--;
-	if (oneThread == th) oneThread = th->next0();
+	numberOfRunningThreads--;
 	th->remove();
-	if (!numberOfThreads) oneThread = 0;
-	delete th->allVmsData;
 	th->allVmsData = 0;
 	vmkitLock.unlock();
 }

Modified: vmkit/branches/multi-vm/mmtk/mmtk-j3/ActivePlan.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/mmtk/mmtk-j3/ActivePlan.cpp?rev=120939&r1=120938&r2=120939&view=diff
==============================================================================
--- vmkit/branches/multi-vm/mmtk/mmtk-j3/ActivePlan.cpp (original)
+++ vmkit/branches/multi-vm/mmtk/mmtk-j3/ActivePlan.cpp Sun Dec  5 09:18:00 2010
@@ -17,15 +17,20 @@
 
 extern "C" MMTkObject* Java_org_j3_mmtk_ActivePlan_getNextMutator__(MMTkActivePlan* A) {
   assert(A && "No active plan");
-  
-  if (A->current == NULL) {
-    A->current = (mvm::MutatorThread*)mvm::Thread::get()->vmkit()->oneThread;
-  } else if (A->current->next0() == mvm::Thread::get()->vmkit()->oneThread) {
-    A->current = NULL;
-    return NULL;
-  } else {
-    A->current = (mvm::MutatorThread*)A->current->next0();
-  }
+
+	mvm::CircularBase<mvm::Thread>* mut = A->current;
+
+	if(!mut)
+		mut = &mvm::Thread::get()->vmkit()->runningThreads;
+
+	mut = mut->next();
+
+	if(mut == &mvm::Thread::get()->vmkit()->runningThreads) {
+		A->current = NULL;
+		return NULL;
+	}
+	
+	A->current = (mvm::MutatorThread*)mut;
 
   if (A->current->MutatorContext == 0) {
     return Java_org_j3_mmtk_ActivePlan_getNextMutator__(A);

Modified: vmkit/branches/multi-vm/mmtk/mmtk-j3/Scanning.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/mmtk/mmtk-j3/Scanning.cpp?rev=120939&r1=120938&r2=120939&view=diff
==============================================================================
--- vmkit/branches/multi-vm/mmtk/mmtk-j3/Scanning.cpp (original)
+++ vmkit/branches/multi-vm/mmtk/mmtk-j3/Scanning.cpp Sun Dec  5 09:18:00 2010
@@ -11,31 +11,30 @@
 #include "mvm/VirtualMachine.h"
 #include "MMTkObject.h"
 #include "mvm/GC.h"
+#include "mvm/VMKit.h"
 
 namespace mmtk {
 
 extern "C" void Java_org_j3_mmtk_Scanning_computeThreadRoots__Lorg_mmtk_plan_TraceLocal_2 (MMTkObject* Scanning, MMTkObject* TL) {
   // When entering this function, all threads are waiting on the rendezvous to
   // finish.
-  mvm::Thread* th = mvm::Thread::get();
-  mvm::Thread* tcur = th;
+  mvm::VMKit* vmkit = mvm::Thread::get()->vmkit();
+  mvm::Thread* tcur;
   
-  do {
+	for(tcur=vmkit->runningThreads.next(); tcur!=&vmkit->runningThreads; tcur=tcur->next()) {
     tcur->scanStack(reinterpret_cast<uintptr_t>(TL));
-    tcur = tcur->next0();
-  } while (tcur != th);
+  }
 }
 
 extern "C" void Java_org_j3_mmtk_Scanning_computeGlobalRoots__Lorg_mmtk_plan_TraceLocal_2 (MMTkObject* Scanning, MMTkObject* TL) { 
   mvm::Thread::get()->MyVM->tracer(reinterpret_cast<uintptr_t>(TL));
+
+	mvm::VMKit* vmkit = mvm::Thread::get()->vmkit();
+  mvm::Thread* tcur;
   
-	mvm::Thread* th = mvm::Thread::get();
-  mvm::Thread* tcur = th;
-  
-  do {
+	for(tcur=vmkit->runningThreads.next(); tcur!=&vmkit->runningThreads; tcur=tcur->next()) {
     tcur->tracer(reinterpret_cast<uintptr_t>(TL));
-    tcur = tcur->next0();
-  } while (tcur != th);
+  }
 }
 
 extern "C" void Java_org_j3_mmtk_Scanning_computeStaticRoots__Lorg_mmtk_plan_TraceLocal_2 (MMTkObject* Scanning, MMTkObject* TL) {





More information about the vmkit-commits mailing list