[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