[vmkit-commits] [vmkit] r121610 - in /vmkit/branches/multi-vm: Makefile.config.in autoconf/configure.ac configure find-it.sh include/mvm/GC.h include/mvm/SystemThreads.h include/mvm/Threads/Locks.h include/mvm/VMKit.h include/mvm/VirtualMachine.h lib/J3/Classpath/JavaUpcalls.cpp lib/Mvm/Runtime/SystemThreads.cpp lib/Mvm/Runtime/VMKit.cpp tools/Makefile tools/toy-vm/
Gael Thomas
gael.thomas at lip6.fr
Sat Dec 11 03:00:03 PST 2010
Author: gthomas
Date: Sat Dec 11 05:00:03 2010
New Revision: 121610
URL: http://llvm.org/viewvc/llvm-project?rev=121610&view=rev
Log:
remove toy-vm, move llvm_gcroot in GC.H, lazily allocate reference and finalizerThread
Removed:
vmkit/branches/multi-vm/tools/toy-vm/
Modified:
vmkit/branches/multi-vm/Makefile.config.in
vmkit/branches/multi-vm/autoconf/configure.ac
vmkit/branches/multi-vm/configure
vmkit/branches/multi-vm/find-it.sh
vmkit/branches/multi-vm/include/mvm/GC.h
vmkit/branches/multi-vm/include/mvm/SystemThreads.h
vmkit/branches/multi-vm/include/mvm/Threads/Locks.h
vmkit/branches/multi-vm/include/mvm/VMKit.h
vmkit/branches/multi-vm/include/mvm/VirtualMachine.h
vmkit/branches/multi-vm/lib/J3/Classpath/JavaUpcalls.cpp
vmkit/branches/multi-vm/lib/Mvm/Runtime/SystemThreads.cpp
vmkit/branches/multi-vm/lib/Mvm/Runtime/VMKit.cpp
vmkit/branches/multi-vm/tools/Makefile
Modified: vmkit/branches/multi-vm/Makefile.config.in
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/Makefile.config.in?rev=121610&r1=121609&r2=121610&view=diff
==============================================================================
--- vmkit/branches/multi-vm/Makefile.config.in (original)
+++ vmkit/branches/multi-vm/Makefile.config.in Sat Dec 11 05:00:03 2010
@@ -13,6 +13,5 @@
MMTK_PLAN_HEADER = @MMTK_PLAN_HEADER@
WITH_64 = @WITH_64@
WITH_LLVM_GCC = @WITH_LLVM_GCC@
-WITH_TOY = @WITH_TOY@
ANT = @ANT@
Modified: vmkit/branches/multi-vm/autoconf/configure.ac
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/autoconf/configure.ac?rev=121610&r1=121609&r2=121610&view=diff
==============================================================================
--- vmkit/branches/multi-vm/autoconf/configure.ac (original)
+++ vmkit/branches/multi-vm/autoconf/configure.ac Sat Dec 11 05:00:03 2010
@@ -422,18 +422,6 @@
AC_SUBST([WITH_N3])
-dnl **************************************************************************
-dnl toy vm
-dnl **************************************************************************
-AC_ARG_WITH(toy,
- [AS_HELP_STRING(--with-toy=yes|no,
- [Build the toy virtual machine (default is yes)])],
- [[WITH_TOY=$withval]],
- [[WITH_TOY=yes]]
-)
-
-AC_SUBST([WITH_TOY])
-
dnl===-----------------------------------------------------------------------===
dnl===
dnl=== SECTION 4: Check for programs we need and that they are the right version
Modified: vmkit/branches/multi-vm/configure
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/configure?rev=121610&r1=121609&r2=121610&view=diff
==============================================================================
--- vmkit/branches/multi-vm/configure (original)
+++ vmkit/branches/multi-vm/configure Sat Dec 11 05:00:03 2010
@@ -667,7 +667,6 @@
ac_ct_CXX
CXXFLAGS
CXX
-WITH_TOY
WITH_N3
monopath
WITH_N3_MONO
@@ -775,7 +774,6 @@
with_pnet_local_prefix
with_pnetlib
with_mono
-with_toy
'
ac_precious_vars='build_alias
host_alias
@@ -1440,7 +1438,6 @@
Pnetlib's mscorlib.dll location (default is
/usr/lib/cscc/lib/)
--with-mono=something Mono's mscorlib.dll location (no default)
- --with-toy=yes|no Build the toy virtual machine (default is yes)
Some influential environment variables:
CC C compiler command
@@ -4317,18 +4314,6 @@
-# Check whether --with-toy was given.
-if test "${with_toy+set}" = set; then
- withval=$with_toy; WITH_TOY=$withval
-else
- WITH_TOY=yes
-
-fi
-
-
-
-
-
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
Modified: vmkit/branches/multi-vm/find-it.sh
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/find-it.sh?rev=121610&r1=121609&r2=121610&view=diff
==============================================================================
--- vmkit/branches/multi-vm/find-it.sh (original)
+++ vmkit/branches/multi-vm/find-it.sh Sat Dec 11 05:00:03 2010
@@ -6,6 +6,6 @@
else
- grep -w --exclude find-it.sh --exclude-dir IJvm --exclude-dir Isolate --exclude *.txt --exclude-dir autoconf --exclude config.status --exclude config.log --exclude configure --exclude *.xml --exclude *.html --exclude *.jar --exclude *.bc --exclude MMTkInline.inc --exclude-dir patches --exclude-dir N3 --exclude *.java --exclude *.class -R --exclude-dir .svn --exclude-dir Release --exclude *.s "$1" .
+ grep --exclude find-it.sh --exclude-dir IJvm --exclude-dir Isolate --exclude *.txt --exclude-dir autoconf --exclude config.status --exclude config.log --exclude configure --exclude *.xml --exclude *.html --exclude *.jar --exclude *.bc --exclude MMTkInline.inc --exclude-dir patches --exclude-dir N3 --exclude *.java --exclude *.class -R --exclude-dir .svn --exclude-dir Release --exclude *.s "$1" .
fi
\ No newline at end of file
Modified: vmkit/branches/multi-vm/include/mvm/GC.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/include/mvm/GC.h?rev=121610&r1=121609&r2=121610&view=diff
==============================================================================
--- vmkit/branches/multi-vm/include/mvm/GC.h (original)
+++ vmkit/branches/multi-vm/include/mvm/GC.h Sat Dec 11 05:00:03 2010
@@ -14,6 +14,13 @@
#include <stdint.h>
#include "ObjectHeader.h"
+#ifdef WITH_LLVM_GCC
+extern "C" void __llvm_gcroot(void**, void*) __attribute__((nothrow));
+#define llvm_gcroot(a, b) __llvm_gcroot((void**)&a, b)
+#else
+#define llvm_gcroot(a, b)
+#endif
+
namespace mvm {
class VirtualMachine;
Modified: vmkit/branches/multi-vm/include/mvm/SystemThreads.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/include/mvm/SystemThreads.h?rev=121610&r1=121609&r2=121610&view=diff
==============================================================================
--- vmkit/branches/multi-vm/include/mvm/SystemThreads.h (original)
+++ vmkit/branches/multi-vm/include/mvm/SystemThreads.h Sat Dec 11 05:00:03 2010
@@ -42,25 +42,7 @@
delete[] References;
}
- void addReference(mvm::gc* ref) {
- llvm_gcroot(ref, 0);
- QueueLock.acquire();
- if (CurrentIndex >= QueueLength) {
- uint32 newLength = QueueLength * GROW_FACTOR;
- mvm::gc** newQueue = new mvm::gc*[newLength];
- memset(newQueue, 0, newLength * sizeof(mvm::gc*));
- if (!newQueue) {
- fprintf(stderr, "I don't know how to handle reference overflow yet!\n");
- abort();
- }
- for (uint32 i = 0; i < QueueLength; ++i) newQueue[i] = References[i];
- delete[] References;
- References = newQueue;
- QueueLength = newLength;
- }
- References[CurrentIndex++] = ref;
- QueueLock.release();
- }
+ void addReference(mvm::gc* ref);
void acquire() {
QueueLock.acquire();
@@ -103,24 +85,15 @@
/// addWeakReference - Add a weak reference to the queue.
///
- void addWeakReference(mvm::gc* ref) {
- llvm_gcroot(ref, 0);
- WeakReferencesQueue.addReference(ref);
- }
+ void addWeakReference(mvm::gc* ref);
/// addSoftReference - Add a weak reference to the queue.
///
- void addSoftReference(mvm::gc* ref) {
- llvm_gcroot(ref, 0);
- SoftReferencesQueue.addReference(ref);
- }
+ void addSoftReference(mvm::gc* ref);
/// addPhantomReference - Add a weak reference to the queue.
///
- void addPhantomReference(mvm::gc* ref) {
- llvm_gcroot(ref, 0);
- PhantomReferencesQueue.addReference(ref);
- }
+ void addPhantomReference(mvm::gc* ref);
ReferenceThread(mvm::VMKit* vmkit);
Modified: vmkit/branches/multi-vm/include/mvm/Threads/Locks.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/include/mvm/Threads/Locks.h?rev=121610&r1=121609&r2=121610&view=diff
==============================================================================
--- vmkit/branches/multi-vm/include/mvm/Threads/Locks.h (original)
+++ vmkit/branches/multi-vm/include/mvm/Threads/Locks.h Sat Dec 11 05:00:03 2010
@@ -17,13 +17,6 @@
#include "ObjectHeader.h"
#include "mvm/Threads/Thread.h"
-#ifdef WITH_LLVM_GCC
-extern "C" void __llvm_gcroot(void**, void*) __attribute__((nothrow));
-#define llvm_gcroot(a, b) __llvm_gcroot((void**)&a, b)
-#else
-#define llvm_gcroot(a, b)
-#endif
-
namespace mvm {
class gc;
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=121610&r1=121609&r2=121610&view=diff
==============================================================================
--- vmkit/branches/multi-vm/include/mvm/VMKit.h (original)
+++ vmkit/branches/multi-vm/include/mvm/VMKit.h Sat Dec 11 05:00:03 2010
@@ -92,7 +92,7 @@
VMKit(mvm::BumpPtrAllocator &Alloc);
- LockNormal _vmkitLock;
+ LockRecursive _vmkitLock;
void vmkitLock() { _vmkitLock.lock(); }
void vmkitUnlock() { _vmkitLock.unlock(); }
@@ -148,23 +148,45 @@
UncooperativeCollectionRV rendezvous;
#endif
+private:
/// enqueueThread - The thread that finalizes references.
///
FinalizerThread* finalizerThread;
/// enqueueThread - The thread that enqueues references.
///
- ReferenceThread* referenceThread;
+ ReferenceThread* referenceThread;
- /// scanFinalizationQueue - Scan objets with a finalized method and schedule
- /// them for finalization if they are not live.
- ///
- void scanFinalizationQueue(uintptr_t closure);
+ /// getAndAllocateFinalizerThread - get the finalizer thread and allocate it if it does not exist
+ ///
+ FinalizerThread* getAndAllocateFinalizerThread();
+
+ /// getAndAllocateReferenceThread - get the reference thread and allocate it if it does not exist
+ ///
+ ReferenceThread* getAndAllocateReferenceThread();
+
+public:
+ /// addWeakReference - Add a weak reference to the queue.
+ ///
+ void addWeakReference(mvm::gc* ref);
+
+ /// addSoftReference - Add a weak reference to the queue.
+ ///
+ void addSoftReference(mvm::gc* ref);
+
+ /// addPhantomReference - Add a weak reference to the queue.
+ ///
+ void addPhantomReference(mvm::gc* ref);
/// addFinalizationCandidate - Add an object to the queue of objects with
/// a finalization method.
///
void addFinalizationCandidate(gc* object);
+
+ /// scanFinalizationQueue - Scan objets with a finalized method and schedule
+ /// them for finalization if they are not live.
+ ///
+ void scanFinalizationQueue(uintptr_t closure);
/// scanWeakReferencesQueue - Scan all weak references. Called by the GC
/// before scanning the finalization queue.
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=121610&r1=121609&r2=121610&view=diff
==============================================================================
--- vmkit/branches/multi-vm/include/mvm/VirtualMachine.h (original)
+++ vmkit/branches/multi-vm/include/mvm/VirtualMachine.h Sat Dec 11 05:00:03 2010
@@ -77,7 +77,7 @@
/// finalizeObject - invoke the finalizer of a java object
///
- virtual void finalizeObject(mvm::gc* obj) {}
+ virtual void finalizeObject(mvm::gc* obj) = 0;
/// getReferentPtr - return the referent of a reference
///
Modified: vmkit/branches/multi-vm/lib/J3/Classpath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/Classpath/JavaUpcalls.cpp?rev=121610&r1=121609&r2=121610&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/Classpath/JavaUpcalls.cpp (original)
+++ vmkit/branches/multi-vm/lib/J3/Classpath/JavaUpcalls.cpp Sat Dec 11 05:00:03 2010
@@ -120,7 +120,7 @@
BEGIN_NATIVE_EXCEPTION(0)
JavaObjectReference::init(reference, referent, 0);
- mvm::Thread::get()->vmkit->referenceThread->addWeakReference(reference);
+ mvm::Thread::get()->vmkit->addWeakReference(reference);
END_NATIVE_EXCEPTION
@@ -137,7 +137,7 @@
BEGIN_NATIVE_EXCEPTION(0)
JavaObjectReference::init(reference, referent, queue);
- mvm::Thread::get()->vmkit->referenceThread->addWeakReference(reference);
+ mvm::Thread::get()->vmkit->addWeakReference(reference);
END_NATIVE_EXCEPTION
@@ -151,7 +151,7 @@
BEGIN_NATIVE_EXCEPTION(0)
JavaObjectReference::init(reference, referent, 0);
- mvm::Thread::get()->vmkit->referenceThread->addSoftReference(reference);
+ mvm::Thread::get()->vmkit->addSoftReference(reference);
END_NATIVE_EXCEPTION
@@ -168,7 +168,7 @@
BEGIN_NATIVE_EXCEPTION(0)
JavaObjectReference::init(reference, referent, queue);
- mvm::Thread::get()->vmkit->referenceThread->addSoftReference(reference);
+ mvm::Thread::get()->vmkit->addSoftReference(reference);
END_NATIVE_EXCEPTION
@@ -185,7 +185,7 @@
BEGIN_NATIVE_EXCEPTION(0)
JavaObjectReference::init(reference, referent, queue);
- mvm::Thread::get()->vmkit->referenceThread->addPhantomReference(reference);
+ mvm::Thread::get()->vmkit->addPhantomReference(reference);
END_NATIVE_EXCEPTION
}
Modified: 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=121610&r1=121609&r2=121610&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/Mvm/Runtime/SystemThreads.cpp (original)
+++ vmkit/branches/multi-vm/lib/Mvm/Runtime/SystemThreads.cpp Sat Dec 11 05:00:03 2010
@@ -17,6 +17,21 @@
setDaemon();
}
+void ReferenceThread::addWeakReference(mvm::gc* ref) {
+ llvm_gcroot(ref, 0);
+ WeakReferencesQueue.addReference(ref);
+}
+
+void ReferenceThread::addSoftReference(mvm::gc* ref) {
+ llvm_gcroot(ref, 0);
+ SoftReferencesQueue.addReference(ref);
+}
+
+void ReferenceThread::addPhantomReference(mvm::gc* ref) {
+ llvm_gcroot(ref, 0);
+ PhantomReferencesQueue.addReference(ref);
+}
+
mvm::gc** getReferent(mvm::gc* obj) {
llvm_gcroot(obj, 0);
mvm::VirtualMachine* vm = obj->getVirtualTable()->vm;
@@ -89,6 +104,26 @@
ToEnqueue[ToEnqueueIndex++] = obj;
}
+void ReferenceQueue::addReference(mvm::gc* ref) {
+ llvm_gcroot(ref, 0);
+ QueueLock.acquire();
+ if (CurrentIndex >= QueueLength) {
+ uint32 newLength = QueueLength * GROW_FACTOR;
+ mvm::gc** newQueue = new mvm::gc*[newLength];
+ memset(newQueue, 0, newLength * sizeof(mvm::gc*));
+ if (!newQueue) {
+ fprintf(stderr, "I don't know how to handle reference overflow yet!\n");
+ abort();
+ }
+ for (uint32 i = 0; i < QueueLength; ++i) newQueue[i] = References[i];
+ delete[] References;
+ References = newQueue;
+ QueueLength = newLength;
+ }
+ References[CurrentIndex++] = ref;
+ QueueLock.release();
+}
+
mvm::gc* ReferenceQueue::processReference(mvm::gc* reference, ReferenceThread* th, uintptr_t closure) {
if (!mvm::Collector::isLive(reference, closure)) {
setReferent(reference, 0);
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=121610&r1=121609&r2=121610&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/Mvm/Runtime/VMKit.cpp (original)
+++ vmkit/branches/multi-vm/lib/Mvm/Runtime/VMKit.cpp Sat Dec 11 05:00:03 2010
@@ -30,34 +30,70 @@
vms = 0;
vmsArraySize = 0;
-
- // First create system threads.
- finalizerThread = new FinalizerThread(this);
- finalizerThread->start((void (*)(mvm::Thread*))FinalizerThread::finalizerStart);
-
- referenceThread = new ReferenceThread(this);
- referenceThread->start((void (*)(mvm::Thread*))ReferenceThread::enqueueStart);
}
void VMKit::scanWeakReferencesQueue(uintptr_t closure) {
- referenceThread->WeakReferencesQueue.scan(referenceThread, closure);
+ if(referenceThread)
+ referenceThread->WeakReferencesQueue.scan(referenceThread, closure);
}
void VMKit::scanSoftReferencesQueue(uintptr_t closure) {
- referenceThread->SoftReferencesQueue.scan(referenceThread, closure);
+ if(referenceThread)
+ referenceThread->SoftReferencesQueue.scan(referenceThread, closure);
}
void VMKit::scanPhantomReferencesQueue(uintptr_t closure) {
- referenceThread->PhantomReferencesQueue.scan(referenceThread, closure);
+ if(referenceThread)
+ referenceThread->PhantomReferencesQueue.scan(referenceThread, closure);
}
void VMKit::scanFinalizationQueue(uintptr_t closure) {
- finalizerThread->scanFinalizationQueue(closure);
+ if(finalizerThread)
+ finalizerThread->scanFinalizationQueue(closure);
+}
+
+FinalizerThread* VMKit::getAndAllocateFinalizerThread() {
+ if(!finalizerThread) {
+ vmkitLock();
+ if(!finalizerThread) {
+ finalizerThread = new FinalizerThread(this);
+ finalizerThread->start((void (*)(mvm::Thread*))FinalizerThread::finalizerStart);
+ }
+ vmkitUnlock();
+ }
+ return finalizerThread;
+}
+
+ReferenceThread* VMKit::getAndAllocateReferenceThread() {
+ if(!referenceThread) {
+ vmkitLock();
+ if(!referenceThread) {
+ referenceThread = new ReferenceThread(this);
+ referenceThread->start((void (*)(mvm::Thread*))ReferenceThread::enqueueStart);
+ }
+ vmkitUnlock();
+ }
+ return referenceThread;
}
void VMKit::addFinalizationCandidate(mvm::gc* object) {
llvm_gcroot(object, 0);
- finalizerThread->addFinalizationCandidate(object);
+ getAndAllocateFinalizerThread()->addFinalizationCandidate(object);
+}
+
+void VMKit::addWeakReference(mvm::gc* ref) {
+ llvm_gcroot(ref, 0);
+ getAndAllocateReferenceThread()->addWeakReference(ref);
+}
+
+void VMKit::addSoftReference(mvm::gc* ref) {
+ llvm_gcroot(ref, 0);
+ getAndAllocateReferenceThread()->addSoftReference(ref);
+}
+
+void VMKit::addPhantomReference(mvm::gc* ref) {
+ llvm_gcroot(ref, 0);
+ getAndAllocateReferenceThread()->addPhantomReference(ref);
}
void VMKit::tracer(uintptr_t closure) {
@@ -82,11 +118,14 @@
// Lock thread lock, so that we can traverse the vm and thread lists safely. This will be released on finishRV.
vmkitLock();
- finalizerThread->FinalizationQueueLock.acquire();
- referenceThread->ToEnqueueLock.acquire();
- referenceThread->SoftReferencesQueue.acquire();
- referenceThread->WeakReferencesQueue.acquire();
- referenceThread->PhantomReferencesQueue.acquire();
+ if(finalizerThread)
+ finalizerThread->FinalizationQueueLock.acquire();
+ if(referenceThread) {
+ referenceThread->ToEnqueueLock.acquire();
+ referenceThread->SoftReferencesQueue.acquire();
+ referenceThread->WeakReferencesQueue.acquire();
+ referenceThread->PhantomReferencesQueue.acquire();
+ }
// call first startCollection on each vm to avoid deadlock.
// indeed, a vm could want to execute applicative code
@@ -109,13 +148,18 @@
if(vms[i])
vms[i]->endCollection();
- finalizerThread->FinalizationQueueLock.release();
- referenceThread->ToEnqueueLock.release();
- referenceThread->SoftReferencesQueue.release();
- referenceThread->WeakReferencesQueue.release();
- referenceThread->PhantomReferencesQueue.release();
- referenceThread->EnqueueCond.broadcast();
- finalizerThread->FinalizationCond.broadcast();
+ if(finalizerThread) {
+ finalizerThread->FinalizationQueueLock.release();
+ finalizerThread->FinalizationCond.broadcast();
+ }
+
+ if(referenceThread) {
+ referenceThread->ToEnqueueLock.release();
+ referenceThread->SoftReferencesQueue.release();
+ referenceThread->WeakReferencesQueue.release();
+ referenceThread->PhantomReferencesQueue.release();
+ referenceThread->EnqueueCond.broadcast();
+ }
vmkitUnlock();
}
Modified: vmkit/branches/multi-vm/tools/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/tools/Makefile?rev=121610&r1=121609&r2=121610&view=diff
==============================================================================
--- vmkit/branches/multi-vm/tools/Makefile (original)
+++ vmkit/branches/multi-vm/tools/Makefile Sat Dec 11 05:00:03 2010
@@ -26,9 +26,5 @@
PARALLEL_DIRS += n3-pnetlib
endif
-ifeq ($(WITH_J3), 1)
- PARALLEL_DIRS += #toy-vm
-endif
-
include $(LEVEL)/Makefile.common
More information about the vmkit-commits
mailing list