[vmkit-commits] [vmkit] r72379 - in /vmkit/trunk: include/mvm/VirtualMachine.h lib/JnJVM/Compiler/JavaJIT.cpp lib/JnJVM/VMCore/JavaObject.h lib/JnJVM/VMCore/JavaString.cpp lib/JnJVM/VMCore/JavaThread.cpp lib/JnJVM/VMCore/JavaThread.h lib/JnJVM/VMCore/Jnjvm.h lib/JnJVM/VMCore/LockedMap.h lib/JnJVM/VMCore/VirtualTables.cpp lib/Mvm/GCMmap2/gccollector.cpp lib/Mvm/GCMmap2/gccollector.h lib/Mvm/Runtime/Object.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Mon May 25 01:53:39 PDT 2009


Author: geoffray
Date: Mon May 25 03:53:22 2009
New Revision: 72379

URL: http://llvm.org/viewvc/llvm-project?rev=72379&view=rev
Log:
Enable finalization, but disable destruction of internal Java strings,
which, for some reasons, do not seem to work properly.


Modified:
    vmkit/trunk/include/mvm/VirtualMachine.h
    vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
    vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h
    vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
    vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp
    vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h
    vmkit/trunk/lib/Mvm/Runtime/Object.cpp

Modified: vmkit/trunk/include/mvm/VirtualMachine.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/VirtualMachine.h?rev=72379&r1=72378&r2=72379&view=diff

==============================================================================
--- vmkit/trunk/include/mvm/VirtualMachine.h (original)
+++ vmkit/trunk/include/mvm/VirtualMachine.h Mon May 25 03:53:22 2009
@@ -156,11 +156,11 @@
   ///
   void wakeUpFinalizers() { FinalizationCond.broadcast(); }
 
-  void startCollection() {
+  virtual void startCollection() {
     FinalizationQueueLock.acquire();
   }
   
-  void endCollection() {
+  virtual void endCollection() {
     FinalizationQueueLock.release();
   }
 

Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp?rev=72379&r1=72378&r2=72379&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Mon May 25 03:53:22 2009
@@ -1001,8 +1001,9 @@
   
   func->setLinkage(GlobalValue::ExternalLinkage);
   
-  PRINT_DEBUG(JNJVM_COMPILE, 1, COLOR_NORMAL, "--> end compiling %s\n",
-              compilingMethod->printString());
+  PRINT_DEBUG(JNJVM_COMPILE, 1, COLOR_NORMAL, "--> end compiling %s.%s\n",
+              UTF8Buffer(compilingClass->name).cString(),
+              UTF8Buffer(compilingMethod->name).cString());
   
 #ifndef DWARF_EXCEPTIONS
   if (codeLen < 5 && !callsStackWalker && !TheCompiler->isStaticCompiling())

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h?rev=72379&r1=72378&r2=72379&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Mon May 25 03:53:22 2009
@@ -111,7 +111,14 @@
   ///
   static VirtualTable VT;
 
-  ~LockObj() {}
+  /// staticDestructor - The destructor of this LockObj, called by the GC.
+  ///
+  static void staticDestructor(LockObj* obj) {
+    obj->lock.~LockRecursive();
+    obj->varcond.~JavaCond();
+  }
+
+  /// LockObj - Empty constructor.
   LockObj() {}
 };
 

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp?rev=72379&r1=72378&r2=72379&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp Mon May 25 03:53:22 2009
@@ -65,7 +65,7 @@
 void JavaString::stringDestructor(JavaString* str) {
   Jnjvm* vm = JavaThread::get()->getJVM();
   assert(vm && "No vm when destroying a string");
-  if (str->value) vm->hashStr.remove(str->value, str);
+  if (str->value) vm->hashStr.removeUnlocked(str->value, str);
 }
 
 JavaString* JavaString::internalToJava(const UTF8* name, Jnjvm* vm) {

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=72379&r1=72378&r2=72379&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Mon May 25 03:53:22 2009
@@ -80,7 +80,7 @@
 
   // When entering, the number of addresses should be odd.
   // Enable this when finalization gets proper support.
-  // assert((addresses.size() % 2) && "Wrong stack");
+  assert((addresses.size() % 2) && "Wrong stack");
   
   addresses.push_back(cur);
 }
@@ -90,7 +90,7 @@
   void** cur = (void**)FRAME_PTR();
   cur = (void**)cur[0];
   
-  // assert(!(addresses.size() % 2) && "Wrong stack");
+  assert(!(addresses.size() % 2) && "Wrong stack");
   
   addresses.push_back(cur);
 }

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=72379&r1=72378&r2=72379&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Mon May 25 03:53:22 2009
@@ -198,14 +198,14 @@
   /// endNative - Record that we are leaving native code.
   ///
   void endNative() {
-    //assert(!(addresses.size() % 2) && "Wrong stack");    
+    assert(!(addresses.size() % 2) && "Wrong stack");    
     addresses.pop_back();
   }
 
   /// endJava - Record that we are leaving Java code.
   ///
   void endJava() {
-    //assert((addresses.size() % 2) && "Wrong stack");    
+    assert((addresses.size() % 2) && "Wrong stack");    
     addresses.pop_back();
   }
 

Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=72379&r1=72378&r2=72379&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Mon May 25 03:53:22 2009
@@ -357,11 +357,19 @@
   virtual void stopService();
 #endif
 
+  virtual void startCollection() {
+    VirtualMachine::startCollection();
+    hashStr.lock.lock();
+  }
+  
+  virtual void endCollection() {
+    VirtualMachine::endCollection();
+    hashStr.lock.unlock();
+  }
+
 protected:
   virtual void invokeFinalizer(gc*);
 
-
-
 };
 
 } // end namespace jnjvm

Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h?rev=72379&r1=72378&r2=72379&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Mon May 25 03:53:22 2009
@@ -87,13 +87,16 @@
   
   inline void remove(Key V, Container C) {
     lock.lock();
+    removeUnlocked(V, C); 
+    lock.unlock();
+  }
+  
+  inline void removeUnlocked(Key V, Container C) {
     iterator End = map.end();
     iterator I = map.find(V);
     
     if (I != End && I->second == C)
-        map.erase(I);
-    
-    lock.unlock();
+        map.erase(I); 
   }
 
   inline Container lookup(Key V) {

Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=72379&r1=72378&r2=72379&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Mon May 25 03:53:22 2009
@@ -61,7 +61,9 @@
                                (uintptr_t)VMClassLoader::staticDestructor,
                                (uintptr_t)VMClassLoader::staticTracer);
 
-VirtualTable LockObj::VT(0, 0, (uintptr_t)VirtualTable::emptyTracer);
+VirtualTable LockObj::VT((uintptr_t)LockObj::staticDestructor,
+                         (uintptr_t)LockObj::staticDestructor,
+                         (uintptr_t)VirtualTable::emptyTracer);
 
 //===----------------------------------------------------------------------===//
 // Empty tracer for static tracers of classes that do not declare static
@@ -246,6 +248,12 @@
        i = globalRefs.begin(), e = globalRefs.end(); i!= e; ++i) {
     (*i)->markAndTrace(); 
   }
+  
+  for (StringMap::iterator i = hashStr.map.begin(), e = hashStr.map.end();
+       i!= e; ++i) {
+    JavaString* str = i->second;
+    str->markAndTrace();
+  }
 
 #if defined(ISOLATE_SHARING)
   JnjvmSharedLoader::sharedLoader->markAndTrace();

Modified: vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp?rev=72379&r1=72378&r2=72379&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp Mon May 25 03:53:22 2009
@@ -49,11 +49,13 @@
 
   unused_nodes->attrape(used_nodes);
 
+  mvm::Thread* th = th->get();
+  th->MyVM->startCollection();
+
 #ifdef HAVE_PTHREAD
   threads->synchronize();
 #endif
 
-  mvm::Thread* th = th->get();
   mvm::Thread* tcur = th;
 
   // First, trace the VM.
@@ -69,6 +71,9 @@
   for(cur=used_nodes->next(); cur!=used_nodes; cur=cur->next())
     trace(cur);
 
+  // Fourth, trace the finalization queue.
+  th->MyVM->scanFinalizationQueue();
+
   if(_marker)
     _marker(0);
   status = stat_finalize;
@@ -79,55 +84,26 @@
 
   status = stat_alloc;
   
-  unlock();
-
   /* kill everyone */
   GCChunkNode *next = 0;
-
-#ifdef SERVICE
-  Thread* th = Thread::get();
-  VirtualMachine* OldVM = th->MyVM;
-#endif
-
-
-  for(cur=finalizable.next(); cur!=&finalizable; cur=next) {
-#ifdef SERVICE
-    mvm::VirtualMachine* NewVM = cur->meta;
-    if (NewVM) {
-      NewVM->memoryUsed -= real_nbb(cur);
-      th->MyVM = NewVM;
-      th->IsolateID = NewVM->IsolateID;
-    }
-#endif
-    register gc_header *c = cur->chunk();
-    next = cur->next();
-    
-    destructor_t dest = c->getDestructor();
-    if (dest) {
-      try {
-        dest(c);
-      } catch(...) {
-        mvm::Thread::get()->clearException();
-      }
-    }
-  }
-#ifdef SERVICE
-  th->IsolateID = OldVM->IsolateID;
-  th->MyVM = OldVM;
-#endif
-  
-  next = 0;
   for(cur=finalizable.next(); cur!=&finalizable; cur=next) {
     //printf("    !!!! reject %p [%p]\n", cur->chunk()->_2gc(), cur);
+    gcRoot *res = cur->chunk()->_2gc();
+    VirtualTable* VT = res->getVirtualTable();    
+    if (VT->operatorDelete) {
+      destructor_t dest = (destructor_t)VT->destructor;
+      dest(res);
+    }
     next = cur->next();
     allocator->reject_chunk(cur);
   }
 
-  lock();
 
+  th->MyVM->endCollection();
 #ifdef HAVE_PTHREAD
   threads->collectionFinished();
 #endif
+  th->MyVM->wakeUpFinalizers();
 }
 
 void GCCollector::collect_unprotect() {

Modified: vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h?rev=72379&r1=72378&r2=72379&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h Mon May 25 03:53:22 2009
@@ -58,6 +58,7 @@
   static void do_collect();           
 
   static inline GCChunkNode *o2node(void *p) {
+    if (!p) return 0;
     return GCHash::get(p)->o2node(p, GCChunkNode::maskCollectable);
   }
 
@@ -208,6 +209,12 @@
 
 
     unlock();
+
+    // Having an operatorDelete means being a C++ object.
+    if (vt->destructor && !vt->operatorDelete) {
+      mvm::Thread::get()->MyVM->addFinalizationCandidate((gc*)p->_2gc());
+    }
+
     return p->_2gc();
 #endif
   }

Modified: vmkit/trunk/lib/Mvm/Runtime/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Object.cpp?rev=72379&r1=72378&r2=72379&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/Runtime/Object.cpp (original)
+++ vmkit/trunk/lib/Mvm/Runtime/Object.cpp Mon May 25 03:53:22 2009
@@ -136,15 +136,8 @@
       vm->FinalizationQueueLock.release();
       if (!res) break;
 
-      VirtualTable* VT = res->getVirtualTable();
       try {
-        if (VT->operatorDelete) {
-          // It's a native method!
-          destructor_t dest = (destructor_t)VT->destructor;
-          dest(res);
-        } else {
-          vm->invokeFinalizer(res);
-        }
+        vm->invokeFinalizer(res);
       } catch(...) {
       }
       th->clearException();





More information about the vmkit-commits mailing list