[vmkit-commits] [vmkit] r121008 - in /vmkit/branches/multi-vm: include/mvm/SystemThreads.h include/mvm/VMKit.h include/mvm/VirtualMachine.h lib/J3/VMCore/Jnjvm.cpp lib/J3/VMCore/Jnjvm.h lib/J3/VMCore/ReferenceQueue.cpp lib/J3/VMCore/ReferenceQueue.h lib/J3/VMCore/VirtualTables.cpp lib/Mvm/GCMmap2/MvmGC.h lib/Mvm/GCMmap2/gccollector.cpp lib/Mvm/MMTk/MvmGC.cpp lib/Mvm/Runtime/SystemThreads.cpp lib/Mvm/Runtime/VMKit.cpp mmtk/mmtk-alloc/Selected.cpp mmtk/mmtk-j3/FinalizableProcessor.cpp
Gael Thomas
gael.thomas at lip6.fr
Mon Dec 6 09:43:31 PST 2010
Author: gthomas
Date: Mon Dec 6 11:43:31 2010
New Revision: 121008
URL: http://llvm.org/viewvc/llvm-project?rev=121008&view=rev
Log:
Move the finalizer threads in vmkit.
Added:
vmkit/branches/multi-vm/include/mvm/SystemThreads.h
vmkit/branches/multi-vm/lib/Mvm/Runtime/SystemThreads.cpp
Modified:
vmkit/branches/multi-vm/include/mvm/VMKit.h
vmkit/branches/multi-vm/include/mvm/VirtualMachine.h
vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.cpp
vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.h
vmkit/branches/multi-vm/lib/J3/VMCore/ReferenceQueue.cpp
vmkit/branches/multi-vm/lib/J3/VMCore/ReferenceQueue.h
vmkit/branches/multi-vm/lib/J3/VMCore/VirtualTables.cpp
vmkit/branches/multi-vm/lib/Mvm/GCMmap2/MvmGC.h
vmkit/branches/multi-vm/lib/Mvm/GCMmap2/gccollector.cpp
vmkit/branches/multi-vm/lib/Mvm/MMTk/MvmGC.cpp
vmkit/branches/multi-vm/lib/Mvm/Runtime/VMKit.cpp
vmkit/branches/multi-vm/mmtk/mmtk-alloc/Selected.cpp
vmkit/branches/multi-vm/mmtk/mmtk-j3/FinalizableProcessor.cpp
Added: vmkit/branches/multi-vm/include/mvm/SystemThreads.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/include/mvm/SystemThreads.h?rev=121008&view=auto
==============================================================================
--- vmkit/branches/multi-vm/include/mvm/SystemThreads.h (added)
+++ vmkit/branches/multi-vm/include/mvm/SystemThreads.h Mon Dec 6 11:43:31 2010
@@ -0,0 +1,88 @@
+#ifndef _SYSTEM_THREADS_H_
+#define _SYSTEM_THREADS_H_
+
+#include "MutatorThread.h"
+#include "mvm/Threads/Cond.h"
+
+// Same values than JikesRVM
+#define INITIAL_QUEUE_SIZE 256
+#define GROW_FACTOR 2
+
+namespace mvm {
+class VirtualMachine;
+
+class FinalizerThread : public mvm::MutatorThread {
+public:
+ /// FinalizationQueueLock - A lock to protect access to the queue.
+ ///
+ mvm::SpinLock FinalizationQueueLock;
+
+ /// finalizationQueue - A list of allocated objets that contain a finalize
+ /// method.
+ ///
+ mvm::gc** FinalizationQueue;
+
+ /// CurrentIndex - Current index in the queue of finalizable objects.
+ ///
+ uint32 CurrentIndex;
+
+ /// QueueLength - Current length of the queue of finalizable objects.
+ ///
+ uint32 QueueLength;
+
+ /// growFinalizationQueue - Grow the queue of finalizable objects.
+ ///
+ void growFinalizationQueue();
+
+ /// ToBeFinalized - List of objects that are scheduled to be finalized.
+ ///
+ mvm::gc** ToBeFinalized;
+
+ /// ToBeFinalizedLength - Current length of the queue of objects scheduled
+ /// for finalization.
+ ///
+ uint32 ToBeFinalizedLength;
+
+ /// CurrentFinalizedIndex - The current index in the ToBeFinalized queue
+ /// that will be sceduled for finalization.
+ ///
+ uint32 CurrentFinalizedIndex;
+
+ /// growToBeFinalizedQueue - Grow the queue of the to-be finalized objects.
+ ///
+ void growToBeFinalizedQueue();
+
+ /// finalizationCond - Condition variable to wake up finalization threads.
+ ///
+ mvm::Cond FinalizationCond;
+
+ /// finalizationLock - Lock for the condition variable.
+ ///
+ mvm::LockNormal FinalizationLock;
+
+ static void finalizerStart(FinalizerThread*);
+
+ /// addFinalizationCandidate - Add an object to the queue of objects with
+ /// a finalization method.
+ ///
+ void addFinalizationCandidate(mvm::gc*);
+
+ /// scanFinalizationQueue - Scan objets with a finalized method and schedule
+ /// them for finalization if they are not live.
+ ///
+ void scanFinalizationQueue(uintptr_t closure);
+
+ FinalizerThread(VMKit* vmkit);
+
+ virtual void localDestroy() {
+ delete[] FinalizationQueue;
+ delete[] ToBeFinalized;
+ }
+
+ virtual void tracer(uintptr_t closure);
+};
+
+} // namespace mvm
+
+
+#endif
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=121008&r1=121007&r2=121008&view=diff
==============================================================================
--- vmkit/branches/multi-vm/include/mvm/VMKit.h (original)
+++ vmkit/branches/multi-vm/include/mvm/VMKit.h Mon Dec 6 11:43:31 2010
@@ -1,7 +1,6 @@
#ifndef _VMKIT_H_
#define _VMKIT_H_
-#include <vector>
#include "mvm/Allocator.h"
#include "mvm/Threads/CollectionRV.h"
#include "mvm/VirtualMachine.h"
@@ -10,6 +9,7 @@
class MethodInfo;
class VMKit;
class gc;
+class FinalizerThread;
class FunctionMap {
public:
@@ -92,6 +92,18 @@
void registerRunningThread(mvm::Thread* th);
void unregisterRunningThread(mvm::Thread* th);
+ FinalizerThread* finalizerThread;
+
+ /// scanFinalizationQueue - Scan objets with a finalized method and schedule
+ /// them for finalization if they are not live.
+ ///
+ void scanFinalizationQueue(uintptr_t closure);
+
+ /// addFinalizationCandidate - Add an object to the queue of objects with
+ /// a finalization method.
+ ///
+ void addFinalizationCandidate(gc* object);
+
/// ------------------------------------------------- ///
/// --- collection managment --- ///
/// ------------------------------------------------- ///
Modified: vmkit/branches/multi-vm/include/mvm/VirtualMachine.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/include/mvm/VirtualMachine.h?rev=121008&r1=121007&r2=121008&view=diff
==============================================================================
--- vmkit/branches/multi-vm/include/mvm/VirtualMachine.h (original)
+++ vmkit/branches/multi-vm/include/mvm/VirtualMachine.h Mon Dec 6 11:43:31 2010
@@ -82,16 +82,6 @@
///
virtual void scanPhantomReferencesQueue(uintptr_t closure) {}
- /// scanFinalizationQueue - Scan objets with a finalized method and schedule
- /// them for finalization if they are not live.
- ///
- virtual void scanFinalizationQueue(uintptr_t closure) {}
-
- /// addFinalizationCandidate - Add an object to the queue of objects with
- /// a finalization method.
- ///
- virtual void addFinalizationCandidate(gc* object) {}
-
/// tracer - Trace this virtual machine's GC-objects.
/// Called once by vm. If you have GC-objects in a thread specific data, redefine the tracer of your VMThreadData.
///
Modified: vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.cpp?rev=121008&r1=121007&r2=121008&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.cpp (original)
+++ vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.cpp Mon Dec 6 11:43:31 2010
@@ -1062,7 +1062,7 @@
}
mvm::VMThreadData* Jnjvm::buildVMThreadData(mvm::Thread* mut) {
- JavaThread* th = new JavaThread(this, finalizerThread);
+ JavaThread* th = new JavaThread(this, mut);
mut->allVmsData[vmID] = th; // will be done by my caller but I have to call java code before
mut->vmData = th; // will be done by my caller but I have to call java code before
bootstrapLoader->upcalls->CreateForeignJavaThread(this, th);
@@ -1076,10 +1076,6 @@
llvm_gcroot(javaLoader, 0);
JnjvmClassLoader* loader = bootstrapLoader;
- // First create system threads.
- finalizerThread = new FinalizerThread(this);
- finalizerThread->start((void (*)(mvm::Thread*))FinalizerThread::finalizerStart);
-
referenceThread = new ReferenceThread(this);
javaReferenceThread = new JavaThread(this, referenceThread);
referenceThread->allVmsData[vmID] = javaReferenceThread;
@@ -1411,7 +1407,6 @@
}
void Jnjvm::startCollection() {
- finalizerThread->FinalizationQueueLock.acquire();
referenceThread->ToEnqueueLock.acquire();
referenceThread->SoftReferencesQueue.acquire();
referenceThread->WeakReferencesQueue.acquire();
@@ -1419,12 +1414,10 @@
}
void Jnjvm::endCollection() {
- finalizerThread->FinalizationQueueLock.release();
referenceThread->ToEnqueueLock.release();
referenceThread->SoftReferencesQueue.release();
referenceThread->WeakReferencesQueue.release();
referenceThread->PhantomReferencesQueue.release();
- finalizerThread->FinalizationCond.broadcast();
referenceThread->EnqueueCond.broadcast();
}
@@ -1440,15 +1433,6 @@
referenceThread->PhantomReferencesQueue.scan(referenceThread, closure);
}
-void Jnjvm::scanFinalizationQueue(uintptr_t closure) {
- finalizerThread->scanFinalizationQueue(closure);
-}
-
-void Jnjvm::addFinalizationCandidate(mvm::gc* object) {
- llvm_gcroot(object, 0);
- finalizerThread->addFinalizationCandidate(object);
-}
-
size_t Jnjvm::getObjectSize(mvm::gc* object) {
// TODO: because this is called during GC, there is no need to do
// llvm_gcroot. For clarity, it may be useful to have a special type
Modified: vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.h?rev=121008&r1=121007&r2=121008&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.h (original)
+++ vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.h Mon Dec 6 11:43:31 2010
@@ -33,7 +33,6 @@
class ArrayObject;
class Classpath;
class CommonClass;
-class FinalizerThread;
class JavaField;
class JavaMethod;
class JavaObject;
@@ -123,10 +122,6 @@
private:
- /// finalizerThread - The thread that finalizes Java objects.
- ///
- FinalizerThread* finalizerThread;
-
/// enqueueThread - The thread that enqueue Java references.
///
ReferenceThread* referenceThread;
@@ -136,8 +131,6 @@
virtual void scanWeakReferencesQueue(uintptr_t closure);
virtual void scanSoftReferencesQueue(uintptr_t closure);
virtual void scanPhantomReferencesQueue(uintptr_t closure);
- virtual void scanFinalizationQueue(uintptr_t closure);
- virtual void addFinalizationCandidate(mvm::gc* obj);
virtual size_t getObjectSize(mvm::gc* obj);
virtual const char* getObjectTypeName(mvm::gc* obj);
@@ -321,15 +314,7 @@
/// finalizeObject - invoke the finalizer of a java object
///
virtual void finalizeObject(mvm::gc* obj);
-
- /// setFinalizerThread - Set the finalizer thread of this VM.
- ///
- void setFinalizerThread(FinalizerThread* th) { finalizerThread = th; }
-
- /// getFinalizerThread - Get the finalizer thread of this VM.
- ///
- FinalizerThread* getFinalizerThread() const { return finalizerThread; }
-
+
/// setReferenceThread - Set the enqueue thread of this VM.
///
void setReferenceThread(ReferenceThread* th) { referenceThread = th; }
Modified: vmkit/branches/multi-vm/lib/J3/VMCore/ReferenceQueue.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/VMCore/ReferenceQueue.cpp?rev=121008&r1=121007&r2=121008&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/VMCore/ReferenceQueue.cpp (original)
+++ vmkit/branches/multi-vm/lib/J3/VMCore/ReferenceQueue.cpp Mon Dec 6 11:43:31 2010
@@ -158,131 +158,3 @@
CurrentIndex = NewIndex;
}
-
-FinalizerThread::FinalizerThread(Jnjvm* vm) : MutatorThread(vm->vmkit) {
- FinalizationQueue = new mvm::gc*[INITIAL_QUEUE_SIZE];
- QueueLength = INITIAL_QUEUE_SIZE;
- CurrentIndex = 0;
-
- ToBeFinalized = new mvm::gc*[INITIAL_QUEUE_SIZE];
- ToBeFinalizedLength = INITIAL_QUEUE_SIZE;
- CurrentFinalizedIndex = 0;
-
- MyVM = vm;
-}
-
-void FinalizerThread::growFinalizationQueue() {
- if (CurrentIndex >= QueueLength) {
- uint32 newLength = QueueLength * GROW_FACTOR;
- mvm::gc** newQueue = new mvm::gc*[newLength];
- if (!newQueue) {
- fprintf(stderr, "I don't know how to handle finalizer overflows yet!\n");
- abort();
- }
- for (uint32 i = 0; i < QueueLength; ++i) newQueue[i] = FinalizationQueue[i];
- delete[] FinalizationQueue;
- FinalizationQueue = newQueue;
- QueueLength = newLength;
- }
-}
-
-void FinalizerThread::growToBeFinalizedQueue() {
- if (CurrentFinalizedIndex >= ToBeFinalizedLength) {
- uint32 newLength = ToBeFinalizedLength * GROW_FACTOR;
- mvm::gc** newQueue = new mvm::gc*[newLength];
- if (!newQueue) {
- fprintf(stderr, "I don't know how to handle finalizer overflows yet!\n");
- abort();
- }
- for (uint32 i = 0; i < ToBeFinalizedLength; ++i) newQueue[i] = ToBeFinalized[i];
- delete[] ToBeFinalized;
- ToBeFinalized = newQueue;
- ToBeFinalizedLength = newLength;
- }
-}
-
-
-void FinalizerThread::addFinalizationCandidate(mvm::gc* obj) {
- llvm_gcroot(obj, 0);
- FinalizationQueueLock.acquire();
-
- if (CurrentIndex >= QueueLength) {
- growFinalizationQueue();
- }
-
- FinalizationQueue[CurrentIndex++] = obj;
- FinalizationQueueLock.release();
-}
-
-
-void FinalizerThread::scanFinalizationQueue(uintptr_t closure) {
- uint32 NewIndex = 0;
- for (uint32 i = 0; i < CurrentIndex; ++i) {
- mvm::gc* obj = FinalizationQueue[i];
-
- if (!mvm::Collector::isLive(obj, closure)) {
- obj = mvm::Collector::retainForFinalize(FinalizationQueue[i], closure);
-
- if (CurrentFinalizedIndex >= ToBeFinalizedLength)
- growToBeFinalizedQueue();
-
- /* Add to object table */
- ToBeFinalized[CurrentFinalizedIndex++] = obj;
- } else {
- FinalizationQueue[NewIndex++] =
- mvm::Collector::getForwardedFinalizable(obj, closure);
- }
- }
- CurrentIndex = NewIndex;
-}
-
-typedef void (*destructor_t)(void*);
-
-void invokeFinalizer(mvm::gc* _obj) {
- JavaObject* obj = (JavaObject*)_obj;
- llvm_gcroot(obj, 0);
- Jnjvm* vm = (Jnjvm*)obj->getVirtualTable()->vm; //JavaThread::get()->getJVM();
- mvm::Thread::get()->attach(vm);
- vm->finalizeObject(obj);
-}
-
-void invokeFinalize(mvm::gc* res) {
- llvm_gcroot(res, 0);
- TRY {
- invokeFinalizer(res);
- } IGNORE;
- mvm::Thread::get()->clearPendingException();
-}
-
-void FinalizerThread::finalizerStart(FinalizerThread* th) {
- mvm::gc* res = NULL;
- llvm_gcroot(res, 0);
-
- while (true) {
- th->FinalizationLock.lock();
- while (th->CurrentFinalizedIndex == 0) {
- th->FinalizationCond.wait(&th->FinalizationLock);
- }
- th->FinalizationLock.unlock();
-
- while (true) {
- th->FinalizationQueueLock.acquire();
- if (th->CurrentFinalizedIndex != 0) {
- res = th->ToBeFinalized[th->CurrentFinalizedIndex - 1];
- --th->CurrentFinalizedIndex;
- }
- th->FinalizationQueueLock.release();
- if (!res) break;
-
- mvm::VirtualTable* VT = res->getVirtualTable();
- ASSERT(VT->vm);
- if (VT->operatorDelete) {
- destructor_t dest = (destructor_t)VT->destructor;
- dest(res);
- } else {
- invokeFinalize(res);
- }
- res = NULL;
- }
- }
-}
Modified: vmkit/branches/multi-vm/lib/J3/VMCore/ReferenceQueue.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/VMCore/ReferenceQueue.h?rev=121008&r1=121007&r2=121008&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/VMCore/ReferenceQueue.h (original)
+++ vmkit/branches/multi-vm/lib/J3/VMCore/ReferenceQueue.h Mon Dec 6 11:43:31 2010
@@ -133,81 +133,11 @@
ReferenceThread(Jnjvm* vm);
- ~ReferenceThread() {
+ virtual void localDestroy() {
delete[] ToEnqueue;
}
};
-class FinalizerThread : public mvm::MutatorThread {
-public:
- /// FinalizationQueueLock - A lock to protect access to the queue.
- ///
- mvm::SpinLock FinalizationQueueLock;
-
- /// finalizationQueue - A list of allocated objets that contain a finalize
- /// method.
- ///
- mvm::gc** FinalizationQueue;
-
- /// CurrentIndex - Current index in the queue of finalizable objects.
- ///
- uint32 CurrentIndex;
-
- /// QueueLength - Current length of the queue of finalizable objects.
- ///
- uint32 QueueLength;
-
- /// growFinalizationQueue - Grow the queue of finalizable objects.
- ///
- void growFinalizationQueue();
-
- /// ToBeFinalized - List of objects that are scheduled to be finalized.
- ///
- mvm::gc** ToBeFinalized;
-
- /// ToBeFinalizedLength - Current length of the queue of objects scheduled
- /// for finalization.
- ///
- uint32 ToBeFinalizedLength;
-
- /// CurrentFinalizedIndex - The current index in the ToBeFinalized queue
- /// that will be sceduled for finalization.
- ///
- uint32 CurrentFinalizedIndex;
-
- /// growToBeFinalizedQueue - Grow the queue of the to-be finalized objects.
- ///
- void growToBeFinalizedQueue();
-
- /// finalizationCond - Condition variable to wake up finalization threads.
- ///
- mvm::Cond FinalizationCond;
-
- /// finalizationLock - Lock for the condition variable.
- ///
- mvm::LockNormal FinalizationLock;
-
- static void finalizerStart(FinalizerThread*);
-
- /// addFinalizationCandidate - Add an object to the queue of objects with
- /// a finalization method.
- ///
- void addFinalizationCandidate(mvm::gc*);
-
- /// scanFinalizationQueue - Scan objets with a finalized method and schedule
- /// them for finalization if they are not live.
- ///
- void scanFinalizationQueue(uintptr_t closure);
-
- FinalizerThread(Jnjvm* vm);
-
- ~FinalizerThread() {
- delete[] FinalizationQueue;
- delete[] ToBeFinalized;
- }
-
-};
-
} // namespace j3
#endif //J3_REFERENCE_QUEUE_H
Modified: vmkit/branches/multi-vm/lib/J3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/VMCore/VirtualTables.cpp?rev=121008&r1=121007&r2=121008&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/VMCore/VirtualTables.cpp (original)
+++ vmkit/branches/multi-vm/lib/J3/VMCore/VirtualTables.cpp Mon Dec 6 11:43:31 2010
@@ -290,11 +290,6 @@
ArrayUInt16** key = const_cast<ArrayUInt16**>(&(i->first));
mvm::Collector::markAndTraceRoot(key, closure);
}
-
- // (5) Trace the finalization queue.
- for (uint32 i = 0; i < finalizerThread->CurrentFinalizedIndex; ++i) {
- mvm::Collector::markAndTraceRoot(finalizerThread->ToBeFinalized + i, closure);
- }
// (6) Trace the reference queue
for (uint32 i = 0; i < referenceThread->ToEnqueueIndex; ++i) {
Modified: vmkit/branches/multi-vm/lib/Mvm/GCMmap2/MvmGC.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/Mvm/GCMmap2/MvmGC.h?rev=121008&r1=121007&r2=121008&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/Mvm/GCMmap2/MvmGC.h (original)
+++ vmkit/branches/multi-vm/lib/Mvm/GCMmap2/MvmGC.h Mon Dec 6 11:43:31 2010
@@ -187,7 +187,7 @@
unlock();
if (((CommonVirtualTable*)vt)->destructor)
- mvm::Thread::get()->MyVM->addFinalizationCandidate((gc*)p);
+ mvm::Thread::get()->vmkit->addFinalizationCandidate((gc*)p);
return p;
Modified: vmkit/branches/multi-vm/lib/Mvm/GCMmap2/gccollector.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/Mvm/GCMmap2/gccollector.cpp?rev=121008&r1=121007&r2=121008&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/Mvm/GCMmap2/gccollector.cpp (original)
+++ vmkit/branches/multi-vm/lib/Mvm/GCMmap2/gccollector.cpp Mon Dec 6 11:43:31 2010
@@ -69,7 +69,7 @@
th->MyVM->scanSoftReferencesQueue(0);
// (6) Trace the finalization queue.
- th->MyVM->scanFinalizationQueue(0);
+ th->vmkit->scanFinalizationQueue(0);
// (7) Trace the phantom reference queue.
th->MyVM->scanPhantomReferencesQueue(0);
Modified: vmkit/branches/multi-vm/lib/Mvm/MMTk/MvmGC.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/Mvm/MMTk/MvmGC.cpp?rev=121008&r1=121007&r2=121008&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/Mvm/MMTk/MvmGC.cpp (original)
+++ vmkit/branches/multi-vm/lib/Mvm/MMTk/MvmGC.cpp Mon Dec 6 11:43:31 2010
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#include "mvm/GC.h"
+#include "mvm/VMKit.h"
#include "MutatorThread.h"
#include "mvm/VirtualMachine.h"
@@ -37,12 +38,12 @@
extern "C" void* gcmallocUnresolved(uint32_t sz, VirtualTable* VT) {
gc* res = (gc*)gcmalloc(sz, VT);
if (VT->destructor)
- mvm::Thread::get()->MyVM->addFinalizationCandidate(res);
+ mvm::Thread::get()->vmkit->addFinalizationCandidate(res);
return res;
}
extern "C" void addFinalizationCandidate(gc* obj) {
- mvm::Thread::get()->MyVM->addFinalizationCandidate(obj);
+ mvm::Thread::get()->vmkit->addFinalizationCandidate(obj);
}
extern "C" void* AllocateMagicArray(int32_t sz, void* length) {
Added: vmkit/branches/multi-vm/lib/Mvm/Runtime/SystemThreads.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/Mvm/Runtime/SystemThreads.cpp?rev=121008&view=auto
==============================================================================
--- vmkit/branches/multi-vm/lib/Mvm/Runtime/SystemThreads.cpp (added)
+++ vmkit/branches/multi-vm/lib/Mvm/Runtime/SystemThreads.cpp Mon Dec 6 11:43:31 2010
@@ -0,0 +1,137 @@
+#include "mvm/SystemThreads.h"
+#include "mvm/GC.h"
+#include "mvm/VirtualMachine.h"
+
+using namespace mvm;
+
+FinalizerThread::FinalizerThread(VMKit* vmkit) : MutatorThread(vmkit) {
+ FinalizationQueue = new mvm::gc*[INITIAL_QUEUE_SIZE];
+ QueueLength = INITIAL_QUEUE_SIZE;
+ CurrentIndex = 0;
+
+ ToBeFinalized = new mvm::gc*[INITIAL_QUEUE_SIZE];
+ ToBeFinalizedLength = INITIAL_QUEUE_SIZE;
+ CurrentFinalizedIndex = 0;
+}
+
+void FinalizerThread::growFinalizationQueue() {
+ if (CurrentIndex >= QueueLength) {
+ uint32 newLength = QueueLength * GROW_FACTOR;
+ mvm::gc** newQueue = new mvm::gc*[newLength];
+ if (!newQueue) {
+ fprintf(stderr, "I don't know how to handle finalizer overflows yet!\n");
+ abort();
+ }
+ for (uint32 i = 0; i < QueueLength; ++i) newQueue[i] = FinalizationQueue[i];
+ delete[] FinalizationQueue;
+ FinalizationQueue = newQueue;
+ QueueLength = newLength;
+ }
+}
+
+void FinalizerThread::growToBeFinalizedQueue() {
+ if (CurrentFinalizedIndex >= ToBeFinalizedLength) {
+ uint32 newLength = ToBeFinalizedLength * GROW_FACTOR;
+ mvm::gc** newQueue = new mvm::gc*[newLength];
+ if (!newQueue) {
+ fprintf(stderr, "I don't know how to handle finalizer overflows yet!\n");
+ abort();
+ }
+ for (uint32 i = 0; i < ToBeFinalizedLength; ++i) newQueue[i] = ToBeFinalized[i];
+ delete[] ToBeFinalized;
+ ToBeFinalized = newQueue;
+ ToBeFinalizedLength = newLength;
+ }
+}
+
+
+void FinalizerThread::addFinalizationCandidate(mvm::gc* obj) {
+ llvm_gcroot(obj, 0);
+ FinalizationQueueLock.acquire();
+
+ if (CurrentIndex >= QueueLength) {
+ growFinalizationQueue();
+ }
+
+ FinalizationQueue[CurrentIndex++] = obj;
+ FinalizationQueueLock.release();
+}
+
+void FinalizerThread::scanFinalizationQueue(uintptr_t closure) {
+ uint32 NewIndex = 0;
+ for (uint32 i = 0; i < CurrentIndex; ++i) {
+ mvm::gc* obj = FinalizationQueue[i];
+
+ if (!mvm::Collector::isLive(obj, closure)) {
+ obj = mvm::Collector::retainForFinalize(FinalizationQueue[i], closure);
+
+ if (CurrentFinalizedIndex >= ToBeFinalizedLength)
+ growToBeFinalizedQueue();
+
+ /* Add to object table */
+ ToBeFinalized[CurrentFinalizedIndex++] = obj;
+ } else {
+ FinalizationQueue[NewIndex++] =
+ mvm::Collector::getForwardedFinalizable(obj, closure);
+ }
+ }
+ CurrentIndex = NewIndex;
+}
+
+typedef void (*destructor_t)(void*);
+
+void invokeFinalizer(mvm::gc* obj) {
+ llvm_gcroot(obj, 0);
+ VirtualMachine* vm = obj->getVirtualTable()->vm; //JavaThread::get()->getJVM();
+ mvm::Thread::get()->attach(vm);
+ vm->finalizeObject(obj);
+}
+
+void invokeFinalize(mvm::gc* res) {
+ llvm_gcroot(res, 0);
+ TRY {
+ invokeFinalizer(res);
+ } IGNORE;
+ mvm::Thread::get()->clearPendingException();
+}
+
+void FinalizerThread::finalizerStart(FinalizerThread* th) {
+ mvm::gc* res = NULL;
+ llvm_gcroot(res, 0);
+
+ while (true) {
+ th->FinalizationLock.lock();
+ while (th->CurrentFinalizedIndex == 0) {
+ th->FinalizationCond.wait(&th->FinalizationLock);
+ }
+ th->FinalizationLock.unlock();
+
+ while (true) {
+ th->FinalizationQueueLock.acquire();
+ if (th->CurrentFinalizedIndex != 0) {
+ res = th->ToBeFinalized[th->CurrentFinalizedIndex - 1];
+ --th->CurrentFinalizedIndex;
+ }
+ th->FinalizationQueueLock.release();
+ if (!res) break;
+
+ mvm::VirtualTable* VT = res->getVirtualTable();
+ ASSERT(VT->vm);
+ if (VT->operatorDelete) {
+ destructor_t dest = (destructor_t)VT->destructor;
+ dest(res);
+ } else {
+ invokeFinalize(res);
+ }
+ res = NULL;
+ }
+ }
+}
+
+void FinalizerThread::tracer(uintptr_t closure) {
+ // (5) Trace the finalization queue.
+ for (uint32 i = 0; i < CurrentFinalizedIndex; ++i) {
+ mvm::Collector::markAndTraceRoot(ToBeFinalized + i, closure);
+ }
+ MutatorThread::tracer(closure);
+}
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=121008&r1=121007&r2=121008&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/Mvm/Runtime/VMKit.cpp (original)
+++ vmkit/branches/multi-vm/lib/Mvm/Runtime/VMKit.cpp Mon Dec 6 11:43:31 2010
@@ -1,5 +1,6 @@
#include "mvm/VMKit.h"
#include "mvm/VirtualMachine.h"
+#include "mvm/SystemThreads.h"
using namespace mvm;
@@ -12,6 +13,19 @@
VMKit::VMKit(mvm::BumpPtrAllocator &Alloc) : allocator(Alloc) {
vms = 0;
vmsArraySize = 0;
+
+ // First create system threads.
+ finalizerThread = new FinalizerThread(this);
+ finalizerThread->start((void (*)(mvm::Thread*))FinalizerThread::finalizerStart);
+}
+
+void VMKit::scanFinalizationQueue(uintptr_t closure) {
+ finalizerThread->scanFinalizationQueue(closure);
+}
+
+void VMKit::addFinalizationCandidate(mvm::gc* object) {
+ llvm_gcroot(object, 0);
+ finalizerThread->addFinalizationCandidate(object);
}
void VMKit::tracer(uintptr_t closure) {
@@ -36,6 +50,8 @@
// Lock thread lock, so that we can traverse the vm and thread lists safely. This will be released on finishRV.
vmkitLock();
+ finalizerThread->FinalizationQueueLock.acquire();
+
// call first startCollection on each vm to avoid deadlock.
// indeed, a vm could want to execute applicative code
for(size_t i=0; i<vmsArraySize; i++)
@@ -57,6 +73,9 @@
if(vms[i])
vms[i]->endCollection();
+ finalizerThread->FinalizationQueueLock.release();
+ finalizerThread->FinalizationCond.broadcast();
+
vmkitUnlock();
}
Modified: vmkit/branches/multi-vm/mmtk/mmtk-alloc/Selected.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/mmtk/mmtk-alloc/Selected.cpp?rev=121008&r1=121007&r2=121008&view=diff
==============================================================================
--- vmkit/branches/multi-vm/mmtk/mmtk-alloc/Selected.cpp (original)
+++ vmkit/branches/multi-vm/mmtk/mmtk-alloc/Selected.cpp Mon Dec 6 11:43:31 2010
@@ -11,6 +11,7 @@
#include "mvm/GC.h"
#include "mvm/VirtualMachine.h"
+#include "mvm/VMKit.h"
#include <sys/mman.h>
#include <set>
@@ -58,7 +59,7 @@
extern "C" void addFinalizationCandidate(void* obj) {
llvm_gcroot(obj, 0);
- mvm::Thread::get()->MyVM->addFinalizationCandidate((gc*)obj);
+ mvm::Thread::get()->vmkit->addFinalizationCandidate((gc*)obj);
}
extern "C" void* gcmallocUnresolved(uint32_t sz, VirtualTable* VT) {
Modified: vmkit/branches/multi-vm/mmtk/mmtk-j3/FinalizableProcessor.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/mmtk/mmtk-j3/FinalizableProcessor.cpp?rev=121008&r1=121007&r2=121008&view=diff
==============================================================================
--- vmkit/branches/multi-vm/mmtk/mmtk-j3/FinalizableProcessor.cpp (original)
+++ vmkit/branches/multi-vm/mmtk/mmtk-j3/FinalizableProcessor.cpp Mon Dec 6 11:43:31 2010
@@ -10,6 +10,7 @@
#include "debug.h"
#include "mvm/VirtualMachine.h"
+#include "mvm/VMKit.h"
#include "MMTkObject.h"
namespace mmtk {
@@ -26,7 +27,7 @@
extern "C" void
Java_org_j3_mmtk_FinalizableProcessor_scan__Lorg_mmtk_plan_TraceLocal_2Z (MMTkObject* FP, MMTkObject* TL, uint8_t nursery) {
mvm::Thread* th = mvm::Thread::get();
- th->MyVM->scanFinalizationQueue(reinterpret_cast<uintptr_t>(TL));
+ th->vmkit->scanFinalizationQueue(reinterpret_cast<uintptr_t>(TL));
}
}
More information about the vmkit-commits
mailing list