[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