[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