[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