[vmkit-commits] [vmkit] r180357 - Make FinalizerThread generic.
Peter Senna Tschudin
peter.senna at gmail.com
Thu Apr 25 10:03:02 PDT 2013
Author: peter.senna
Date: Thu Apr 25 12:00:59 2013
New Revision: 180357
URL: http://llvm.org/viewvc/llvm-project?rev=180357&view=rev
Log:
Make FinalizerThread generic.
(cherry picked from commit 1b24dae50e2d56e60f3664cbafb00b09926b4c0d)
Modified:
vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp
vmkit/trunk/lib/j3/VMCore/Jnjvm.h
vmkit/trunk/lib/j3/VMCore/ReferenceQueue.cpp
vmkit/trunk/lib/j3/VMCore/ReferenceQueue.h
Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp?rev=180357&r1=180356&r2=180357&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp Thu Apr 25 12:00:59 2013
@@ -1071,9 +1071,9 @@ void Jnjvm::loadBootstrap() {
JnjvmBootstrapLoader* loader = bootstrapLoader;
// First create system threads.
- finalizerThread = new FinalizerThread(this);
+ finalizerThread = new JavaFinalizerThread(this);
finalizerThread->start(
- (void (*)(vmkit::Thread*))FinalizerThread::finalizerStart);
+ (void (*)(vmkit::Thread*))JavaFinalizerThread::finalizerStart);
referenceThread = new JavaReferenceThread(this);
referenceThread->start(
@@ -1386,47 +1386,6 @@ void Jnjvm::addFinalizationCandidate(gc*
finalizerThread->addFinalizationCandidate(src);
}
-/*
- * PUT THIS INTO A SEPARATED FILE
- */
-
-typedef void (*destructor_t)(void*);
-
-void invokeFinalizer(gc* _obj) {
- Jnjvm* vm = JavaThread::get()->getJVM();
- JavaObject* obj = (JavaObject*)_obj;
- llvm_gcroot(obj, 0);
- JavaMethod* meth = vm->upcalls->FinalizeObject;
- UserClass* cl = JavaObject::getClass(obj)->asClass();
- meth->invokeIntVirtualBuf(vm, cl, obj, 0);
-}
-
-void invokeFinalize(gc* res) {
- llvm_gcroot(res, 0);
- TRY {
- invokeFinalizer(res);
- } IGNORE;
- vmkit::Thread::get()->clearException();
-}
-
-/*
- *
- */
-
-void Jnjvm::finalizeObject(gc* object) {
- JavaObject* res = 0;
- llvm_gcroot(object, 0);
- llvm_gcroot(res, 0);
- res = (JavaObject*) object;
- JavaVirtualTable* VT = res->getVirtualTable();
- if (VT->operatorDelete) {
- destructor_t dest = (destructor_t)VT->destructor;
- dest(res);
- } else {
- invokeFinalize(res);
- }
-}
-
void Jnjvm::setType(gc* header, void* type) {
JavaObject* src = 0;
llvm_gcroot(src, 0);
Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.h?rev=180357&r1=180356&r2=180357&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.h Thu Apr 25 12:00:59 2013
@@ -32,7 +32,7 @@ class ArrayObject;
class ArrayUInt16;
class Classpath;
class CommonClass;
-class FinalizerThread;
+class JavaFinalizerThread;
class JavaField;
class JavaMethod;
class JavaObject;
@@ -115,9 +115,9 @@ public:
private:
- /// finalizerThread - The thread that finalizes Java objects.
+ /// JavaFinalizerThread - The thread that finalizes Java objects.
///
- FinalizerThread* finalizerThread;
+ JavaFinalizerThread* finalizerThread;
/// enqueueThread - The thread that enqueue Java references.
///
@@ -315,11 +315,11 @@ public:
/// setFinalizerThread - Set the finalizer thread of this VM.
///
- void setFinalizerThread(FinalizerThread* th) { finalizerThread = th; }
+ void setFinalizerThread(JavaFinalizerThread* th) { finalizerThread = th; }
/// getFinalizerThread - Get the finalizer thread of this VM.
///
- FinalizerThread* getFinalizerThread() const { return finalizerThread; }
+ JavaFinalizerThread* getFinalizerThread() const { return finalizerThread; }
/// setReferenceThread - Set the enqueue thread of this VM.
///
Modified: vmkit/trunk/lib/j3/VMCore/ReferenceQueue.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/ReferenceQueue.cpp?rev=180357&r1=180356&r2=180357&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/ReferenceQueue.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/ReferenceQueue.cpp Thu Apr 25 12:00:59 2013
@@ -51,105 +51,39 @@ void Jnjvm::clearObjectReferent(gc* _obj
JavaObjectReference::setReferent(obj, NULL);
}
-FinalizerThread::FinalizerThread(Jnjvm* vm) : JavaThread(vm) {
- FinalizationQueue = new gc*[INITIAL_QUEUE_SIZE];
- QueueLength = INITIAL_QUEUE_SIZE;
- CurrentIndex = 0;
+typedef void (*destructor_t)(void*);
- ToBeFinalized = new gc*[INITIAL_QUEUE_SIZE];
- ToBeFinalizedLength = INITIAL_QUEUE_SIZE;
- CurrentFinalizedIndex = 0;
-}
-
-void FinalizerThread::growFinalizationQueue() {
- if (CurrentIndex >= QueueLength) {
- uint32 newLength = QueueLength * GROW_FACTOR;
- gc** newQueue = new 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;
- gc** newQueue = new 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(gc* obj) {
+void invokeFinalizer(gc* _obj) {
+ Jnjvm* vm = JavaThread::get()->getJVM();
+ JavaObject* obj = (JavaObject*)_obj;
llvm_gcroot(obj, 0);
- FinalizationQueueLock.acquire();
-
- if (CurrentIndex >= QueueLength) {
- growFinalizationQueue();
- }
-
- FinalizationQueue[CurrentIndex++] = obj;
- FinalizationQueueLock.release();
+ JavaMethod* meth = vm->upcalls->FinalizeObject;
+ UserClass* cl = JavaObject::getClass(obj)->asClass();
+ meth->invokeIntVirtualBuf(vm, cl, obj, 0);
}
-
-void FinalizerThread::scanFinalizationQueue(word_t closure) {
- uint32 NewIndex = 0;
- for (uint32 i = 0; i < CurrentIndex; ++i) {
- gc* obj = FinalizationQueue[i];
-
- if (!vmkit::Collector::isLive(obj, closure)) {
- obj = vmkit::Collector::retainForFinalize(FinalizationQueue[i], closure);
-
- if (CurrentFinalizedIndex >= ToBeFinalizedLength)
- growToBeFinalizedQueue();
-
- /* Add to object table */
- ToBeFinalized[CurrentFinalizedIndex++] = obj;
- } else {
- FinalizationQueue[NewIndex++] =
- vmkit::Collector::getForwardedFinalizable(obj, closure);
- }
- }
- CurrentIndex = NewIndex;
-}
-
-
-void FinalizerThread::finalizerStart(FinalizerThread* th) {
- gc* res = NULL;
+void invokeFinalize(gc* res) {
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;
-
- th->MyVM->finalizeObject(res);
-
- res = NULL;
- }
+ TRY {
+ invokeFinalizer(res);
+ } IGNORE;
+ vmkit::Thread::get()->clearException();
+}
+
+/*
+ *
+ */
+
+void Jnjvm::finalizeObject(gc* object) {
+ JavaObject* res = 0;
+ llvm_gcroot(object, 0);
+ llvm_gcroot(res, 0);
+ res = (JavaObject*) object;
+ JavaVirtualTable* VT = res->getVirtualTable();
+ if (VT->operatorDelete) {
+ destructor_t dest = (destructor_t)VT->destructor;
+ dest(res);
+ } else {
+ invokeFinalize(res);
}
}
Modified: vmkit/trunk/lib/j3/VMCore/ReferenceQueue.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/ReferenceQueue.h?rev=180357&r1=180356&r2=180357&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/ReferenceQueue.h (original)
+++ vmkit/trunk/lib/j3/VMCore/ReferenceQueue.h Thu Apr 25 12:00:59 2013
@@ -232,12 +232,7 @@ public:
}
};
-class JavaReferenceThread : public ReferenceThread<JavaThread> {
-public:
- JavaReferenceThread(Jnjvm* vm) : ReferenceThread<JavaThread>(vm) {}
-};
-
-class FinalizerThread : public JavaThread {
+template <class T_THREAD> class FinalizerThread : public T_THREAD {
public:
/// FinalizationQueueLock - A lock to protect access to the queue.
///
@@ -258,7 +253,21 @@ public:
/// growFinalizationQueue - Grow the queue of finalizable objects.
///
- void growFinalizationQueue();
+ void growFinalizationQueue() {
+ if (CurrentIndex >= QueueLength) {
+ uint32 newLength = QueueLength * GROW_FACTOR;
+ gc** newQueue = new 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;
+ }
+ }
+
/// ToBeFinalized - List of objects that are scheduled to be finalized.
///
@@ -276,7 +285,21 @@ public:
/// growToBeFinalizedQueue - Grow the queue of the to-be finalized objects.
///
- void growToBeFinalizedQueue();
+ void growToBeFinalizedQueue() {
+ if (CurrentFinalizedIndex >= ToBeFinalizedLength) {
+ uint32 newLength = ToBeFinalizedLength * GROW_FACTOR;
+ gc** newQueue = new 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;
+ }
+ }
+
/// finalizationCond - Condition variable to wake up finalization threads.
///
@@ -286,19 +309,83 @@ public:
///
vmkit::LockNormal FinalizationLock;
- static void finalizerStart(FinalizerThread*);
+ static void finalizerStart(FinalizerThread* th) {
+ 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;
+
+ th->MyVM->finalizeObject(res);
+
+ res = NULL;
+ }
+ }
+ }
/// addFinalizationCandidate - Add an object to the queue of objects with
/// a finalization method.
///
- void addFinalizationCandidate(gc*);
+ void addFinalizationCandidate(gc* obj) {
+ llvm_gcroot(obj, 0);
+ FinalizationQueueLock.acquire();
+
+ if (CurrentIndex >= QueueLength) {
+ growFinalizationQueue();
+ }
+
+ FinalizationQueue[CurrentIndex++] = obj;
+ FinalizationQueueLock.release();
+ }
+
/// scanFinalizationQueue - Scan objets with a finalized method and schedule
/// them for finalization if they are not live.
///
- void scanFinalizationQueue(word_t closure);
+ void scanFinalizationQueue(word_t closure) {
+ uint32 NewIndex = 0;
+ for (uint32 i = 0; i < CurrentIndex; ++i) {
+ gc* obj = FinalizationQueue[i];
+
+ if (!vmkit::Collector::isLive(obj, closure)) {
+ obj = vmkit::Collector::retainForFinalize(FinalizationQueue[i], closure);
+
+ if (CurrentFinalizedIndex >= ToBeFinalizedLength)
+ growToBeFinalizedQueue();
+
+ /* Add to object table */
+ ToBeFinalized[CurrentFinalizedIndex++] = obj;
+ } else {
+ FinalizationQueue[NewIndex++] =
+ vmkit::Collector::getForwardedFinalizable(obj, closure);
+ }
+ }
+ CurrentIndex = NewIndex;
+ }
+
- FinalizerThread(Jnjvm* vm);
+ FinalizerThread(vmkit::VirtualMachine* vm) : T_THREAD(vm) {
+ FinalizationQueue = new gc*[INITIAL_QUEUE_SIZE];
+ QueueLength = INITIAL_QUEUE_SIZE;
+ CurrentIndex = 0;
+
+ ToBeFinalized = new gc*[INITIAL_QUEUE_SIZE];
+ ToBeFinalizedLength = INITIAL_QUEUE_SIZE;
+ CurrentFinalizedIndex = 0;
+ }
~FinalizerThread() {
delete[] FinalizationQueue;
@@ -306,6 +393,17 @@ public:
}
};
+class JavaFinalizerThread : public FinalizerThread<JavaThread>{
+ public:
+ JavaFinalizerThread(Jnjvm* vm) : FinalizerThread<JavaThread>(vm) {}
+};
+
+class JavaReferenceThread : public ReferenceThread<JavaThread> {
+public:
+ JavaReferenceThread(Jnjvm* vm) : ReferenceThread<JavaThread>(vm) {}
+};
+
+
} // namespace j3
#endif //J3_REFERENCE_QUEUE_H
More information about the vmkit-commits
mailing list