[vmkit-commits] [vmkit] r180316 - Integrating support for stale references correction.

Peter Senna Tschudin peter.senna at gmail.com
Thu Apr 25 09:55:53 PDT 2013


Author: peter.senna
Date: Thu Apr 25 11:54:20 2013
New Revision: 180316

URL: http://llvm.org/viewvc/llvm-project?rev=180316&view=rev
Log:
Integrating support for stale references correction.
Adding support for debugging.(cherry picked from commit 0b10069b8453587862cac0d4ca897a3cdf017ab6)

Added:
    vmkit/trunk/tests/benchmarks/
    vmkit/trunk/tests/benchmarks/j3-stale-ref-corrected.csv
    vmkit/trunk/tests/benchmarks/j3-stale-ref.csv
    vmkit/trunk/tests/benchmarks/monitor_process.sh
    vmkit/trunk/tests/benchmarks/plot_benchmarks.plot
    vmkit/trunk/tests/benchmarks/rebase_time.sh
    vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/A/Token.java
    vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/TokenImpl.java
    vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/
    vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/.classpath
    vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/.project
    vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/META-INF/
    vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/build.properties
    vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/src/
    vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/src/ijvm/
    vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/src/ijvm/tests/
    vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/src/ijvm/tests/BundleMgmtStress/
    vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/src/ijvm/tests/BundleMgmtStress/Activator.java
Modified:
    vmkit/trunk/.cproject
    vmkit/trunk/.project
    vmkit/trunk/CREDITS.TXT
    vmkit/trunk/Makefile.common.in
    vmkit/trunk/README.TXT
    vmkit/trunk/include/vmkit/VirtualMachine.h
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc
    vmkit/trunk/lib/j3/Compiler/JavaJITOpcodes.cpp
    vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/j3/VMCore/JavaClass.h
    vmkit/trunk/lib/j3/VMCore/Jnjvm.h
    vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h
    vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp
    vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp
    vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp
    vmkit/trunk/llvm.patch
    vmkit/trunk/mmtk/java/build.xml.in
    vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
    vmkit/trunk/osgi/src/j3/J3Mgr.java
    vmkit/trunk/osgi/src/j3/vm/OSGi.java
    vmkit/trunk/osgi/src/j3mgr/Activator.java
    vmkit/trunk/osgi/src/j3mgr/J3MgrImpl.java
    vmkit/trunk/tests/debug.txt
    vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/A/A.java
    vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/AImpl.java
    vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/Activator.java
    vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/Activator.java
    vmkit/trunk/tests/ijvm.tests.C/src/ijvm/tests/C/C.java
    vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/Activator.java
    vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/CImpl.java
    vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/Activator.java
    vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/Activator.java
    vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/Runner.java
    vmkit/trunk/tests/minimal.xargs
    vmkit/trunk/tools/precompiler/trainer/Makefile

Modified: vmkit/trunk/.cproject
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/.cproject?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/.cproject (original)
+++ vmkit/trunk/.cproject Thu Apr 25 11:54:20 2013
@@ -45,7 +45,7 @@
 		</cconfiguration>
 	</storageModule>
 	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-		<project id="vmkit_stale_ref.org.eclipse.linuxtools.cdt.autotools.core.projectType.1537789838" name="GNU Autotools" projectType="org.eclipse.linuxtools.cdt.autotools.core.projectType"/>
+		<project id="vmkit2.org.eclipse.linuxtools.cdt.autotools.core.projectType.1537789838" name="GNU Autotools" projectType="org.eclipse.linuxtools.cdt.autotools.core.projectType"/>
 	</storageModule>
 	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
 	<storageModule moduleId="scannerConfiguration">
@@ -58,7 +58,7 @@
 		</scannerConfigBuildInfo>
 	</storageModule>
 	<storageModule moduleId="refreshScope" versionNumber="1">
-		<resource resourceType="PROJECT" workspacePath="/vmkit_stale_ref"/>
+		<resource resourceType="PROJECT" workspacePath="/vmkit2"/>
 	</storageModule>
 	<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings">
 		<doc-comment-owner id="org.eclipse.cdt.ui.doxygen">

Modified: vmkit/trunk/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/.project?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/.project (original)
+++ vmkit/trunk/.project Thu Apr 25 11:54:20 2013
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>vmkit_stale_ref</name>
+	<name>vmkit2</name>
 	<comment></comment>
 	<projects>
 	</projects>

Modified: vmkit/trunk/CREDITS.TXT
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/CREDITS.TXT?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/CREDITS.TXT (original)
+++ vmkit/trunk/CREDITS.TXT Thu Apr 25 11:54:20 2013
@@ -38,3 +38,6 @@ D: Primary architect of JnJVM
 
 N: Koutheir Attouchi
 E: koutheir at gmail.com
+W: http://koutheir.blogspot.com/
+D: Debug support for VMKit.
+D: Correction of stale references for J3.

Modified: vmkit/trunk/Makefile.common.in
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.common.in?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/Makefile.common.in (original)
+++ vmkit/trunk/Makefile.common.in Thu Apr 25 11:54:20 2013
@@ -18,6 +18,7 @@ endif
   
 ENABLE_OPTIMIZED	:= 0
 REQUIRES_FRAME_POINTER	:= 1
+JAVAC_TARGET		:= 1.5
 
 ifeq ($(ENABLE_OPTIMIZED), 0)
 	CFLAGS			+= -O0

Modified: vmkit/trunk/README.TXT
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/README.TXT?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/README.TXT (original)
+++ vmkit/trunk/README.TXT Thu Apr 25 11:54:20 2013
@@ -3,7 +3,7 @@ Requirements:
 =============
 
 * Install required packages (Debian):
-apt-get install ant libgconf2-dev libgtk2.0-dev
+apt-get install ant libgconf2-dev libgtk2.0-dev sharutils
 
 * Install required packages (SUSE):
 zypper install ant gconf2-devel gtk2-devel
@@ -15,9 +15,9 @@ apt-get install default-jre default-jdk
 GNU Classpath:
 ==============
 
-wget http://ftp.gnu.org/gnu/classpath/classpath-0.97.2.tar.gz
-tar zxvf classpath-0.97.2.tar.gz
-ln -s classpath-0.97.2 classpath
+wget http://ftp.gnu.org/gnu/classpath/classpath-0.99.tar.gz
+tar zxf classpath-0.99.tar.gz
+ln -s classpath-0.99 classpath
 cd classpath
 ./configure --disable-plugin --disable-examples --disable-Werror
 make -j12
@@ -33,8 +33,8 @@ ln -sf ../native/jni/java-util/.libs/lib
 
 * Go root
 cd classpath
-make install
-ldconfig
+sudo make install
+sudo ldconfig
 
 =====
 LLVM:
@@ -91,7 +91,7 @@ svn co http://llvm.org/svn/llvm-project/
 
 * Make it (debug mode):
 
-./configure --with-llvmsrc=/home/koutheir/PhD/VMKit/llvm --with-llvmobj=/home/koutheir/PhD/VMKit/llvm --with-gnu-classpath-libs=/home/koutheir/PhD/VMKit/classpath/lib --with-gnu-classpath-glibj=/usr/local/classpath/share/classpath/glibj.zip
+./configure --with-llvmsrc=/home/koutheir/PhD/VMKit/llvm --with-llvmobj=/home/koutheir/PhD/VMKit/llvm --with-gnu-classpath-libs=/usr/local/classpath/lib/classpath --with-gnu-classpath-glibj=/usr/local/classpath/share/classpath/glibj.zip
 make -j12 ENABLE_OPTIMIZED=0 REQUIRES_FRAME_POINTER=1 KEEP_SYMBOLS=1 DEBUG_RUNTIME=1 DEBUG_SYMBOLS=1
 
 =============

Modified: vmkit/trunk/include/vmkit/VirtualMachine.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/VirtualMachine.h?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/VirtualMachine.h (original)
+++ vmkit/trunk/include/vmkit/VirtualMachine.h Thu Apr 25 11:54:20 2013
@@ -10,6 +10,8 @@
 #ifndef VMKIT_VIRTUALMACHINE_H
 #define VMKIT_VIRTUALMACHINE_H
 
+#define RESET_STALE_REFERENCES	1
+
 #include "llvm/ADT/DenseMap.h"
 
 #include "vmkit/Allocator.h"
@@ -194,6 +196,11 @@ public:
   ///
   virtual void traceObject(gc* object, word_t closure) = 0;
 
+  /// setType - Method called when allocating an object. The VirtualMachine has to
+  /// set the identity of the object (identity is determined by user).
+  ///
+  virtual void setType(gcHeader* header, void* type) = 0;
+
   /// getObjectSize - Get the size of this object. Used by copying collectors.
   ///
   virtual size_t getObjectSize(gc* object) = 0;
@@ -207,7 +214,9 @@ public:
   ///
   CooperativeCollectionRV rendezvous;
 
+#if RESET_STALE_REFERENCES
   virtual void resetReferenceIfStale(const void* source, void** ref) {}
+#endif
 
 //===----------------------------------------------------------------------===//
 // (3) Backtrace-related methods.

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp Thu Apr 25 11:54:20 2013
@@ -115,11 +115,9 @@ JavaObjectField* JavaObjectField::create
   return ret;
 }
 
-UserClass* JavaObjectConstructor::getClass(JavaObjectConstructor* self)
-{
+UserClass* JavaObjectConstructor::getClass(JavaObjectConstructor* self) {
   llvm_gcroot(self, 0);
-  UserCommonClass* cls = JavaObjectClass::getClass(self->declaringClass);
-  return cls->asClass();
+  return JavaObjectVMConstructor::getClass(self->vmCons);
 }
 
 }

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc Thu Apr 25 11:54:20 2013
@@ -65,8 +65,8 @@ JavaObjectVMField* VMField, JavaObjectCl
     /* Retrieving VMField.class attributes list */
     UserClass* compilingClass = JavaObjectVMField::getClass(VMField);
     JavaField* field = JavaObjectVMField::getInternalField(VMField);
-    Attribut* annotationsAtt =
-      field->lookupAttribut(Attribut::annotationsAttribut);
+    JavaAttribute* annotationsAtt =
+      field->lookupAttribute(JavaAttribute::annotationsAttribute);
     dprintf("JavaField : %s\n", UTF8Buffer(field->name).cString());
 
     if (annotationsAtt) {

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc Thu Apr 25 11:54:20 2013
@@ -46,8 +46,8 @@ JavaObjectVMMethod* VMMeth) {
   if (cl->inheritName(name->elements, name->size)) {
     // Find "default attribute"
     JavaMethod* method = JavaObjectVMMethod::getInternalMethod(VMMeth);
-    Attribut* annotationsAtt =
-      method->lookupAttribut(Attribut::annotationDefaultAttribut);
+    JavaAttribute* annotationsAtt =
+      method->lookupAttribute(JavaAttribute::annotationDefaultAttribute);
     dprintf("JavaMethod:%s\n", UTF8Buffer(method->name).cString());
 
     if (annotationsAtt) {
@@ -89,8 +89,8 @@ JavaObjectVMMethod* VMMeth, JavaObjectCl
     /* Retrieving VMMethod.class attributes list */
     UserClass* compilingClass = JavaObjectVMMethod::getClass(VMMeth);
     JavaMethod* method = JavaObjectVMMethod::getInternalMethod(VMMeth);
-    Attribut* annotationsAtt =
-      method->lookupAttribut(Attribut::annotationsAttribut);
+    JavaAttribute* annotationsAtt =
+      method->lookupAttribute(JavaAttribute::annotationsAttribute);
     dprintf("JavaMethod:%s\n", UTF8Buffer(method->name).cString());
 
     if (annotationsAtt) {

Modified: vmkit/trunk/lib/j3/Compiler/JavaJITOpcodes.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaJITOpcodes.cpp?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaJITOpcodes.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaJITOpcodes.cpp Thu Apr 25 11:54:20 2013
@@ -2301,10 +2301,10 @@ void JavaJIT::compileOpcodes(Reader& rea
       }
 
       case MONITOREXIT : {
-        bool thisReference = isThisReference(currentStackIndex - 1);
-        Value* obj = pop();
         // NOTE: monitorExit() should NOT throw an exception if object is null.
         // See monitorExit() implementation.
+        //bool thisReference = isThisReference(currentStackIndex - 1);
+        Value* obj = pop();
         // if (!thisReference) JITVerifyNull(obj);
         monitorExit(obj);
         break;

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Thu Apr 25 11:54:20 2013
@@ -343,6 +343,8 @@ JavaMethod* Class::lookupSpecialMethodDo
 JavaMethod* Class::lookupMethodDontThrow(const UTF8* name, const UTF8* type,
                                          bool isStatic, bool recurse,
                                          Class** methodCl) {
+  // This is a dirty hack because of a dirty usage pattern. See UPCALL_METHOD macro...
+  if (this == NULL) return NULL;
   
   JavaMethod* methods = 0;
   uint32 nb = 0;
@@ -897,8 +899,10 @@ void Class::readClass() {
   magic = reader.readU4();
   assert(magic == Jnjvm::Magic && "I've created a class but magic is no good!");
 
-  /* uint16 minor = */ reader.readU2();
-  /* uint16 major = */ reader.readU2();
+  uint16 minor = reader.readU2();
+  uint16 major = reader.readU2();
+  this->isClassVersionSupported(major, minor);
+
   uint32 ctpSize = reader.readU2();
   ctpInfo = new(classLoader->allocator, ctpSize) JavaConstantPool(this, reader,
                                                                   ctpSize);
@@ -919,6 +923,36 @@ void Class::readClass() {
   attributes = readAttributes(reader, nbAttributes);
 }
 
+void Class::getMinimalJDKVersion(uint16 major, uint16 minor, unsigned int& JDKMajor, unsigned int& JDKMinor, unsigned int& JDKBuild)
+{
+	JDKMajor = 1;
+	JDKBuild = 0;
+	if (major == 45 && minor <= 3) {			// Supported by Java 1.0.2
+		JDKMinor = 0;
+		JDKBuild = 2;
+	} else if (major == 45 && minor <= 65535) {	// Supported by Java 1.1
+		JDKMinor = 1;
+	} else {									// Supported by Java 1.x (x >= 2)
+		JDKMinor = major - 43;
+		if (minor == 0) --JDKMinor;
+	}
+}
+
+bool Class::isClassVersionSupported(uint16 major, uint16 minor)
+{
+	const int supportedJavaMinorVersion = 5;	// Java 1.5
+
+	unsigned int JDKMajor, JDKMinor, JDKBuild;
+	Class::getMinimalJDKVersion(major, minor, JDKMajor, JDKMinor, JDKBuild);
+
+	bool res = (JDKMajor <= 1) && (JDKMinor <= supportedJavaMinorVersion);
+	if (!res) {
+		cerr << "WARNING: Class file '" << *name << "' requires Java version " << JDKMajor << '.' << JDKMinor <<
+			". This JVM only supports Java versions up to 1." << supportedJavaMinorVersion << '.' << endl;
+	}
+	return res;
+}
+
 void UserClass::resolveParents() {
   if (super != NULL) {
     super->resolveClass();
@@ -1917,7 +1951,7 @@ std::string& CommonClass::getName(std::s
 {
 	name->toString(nameBuffer);
 
-	for (size_t i=0; i < name->size; ++i) {
+	for (int32_t i=0; i < name->size; ++i) {
 		if (name->elements[i] == '/')
 			nameBuffer[i] = linkageName ? '_' : '.';
 	}

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.h?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.h Thu Apr 25 11:54:20 2013
@@ -813,6 +813,8 @@ public:
   ///
   void makeVT();
 
+  static void getMinimalJDKVersion(uint16 major, uint16 minor, unsigned int& JDKMajor, unsigned int& JDKMinor, unsigned int& JDKBuild);
+  bool isClassVersionSupported(uint16 major, uint16 minor);
 };
 
 /// ClassArray - This class represents Java array classes.

Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.h?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.h Thu Apr 25 11:54:20 2013
@@ -131,6 +131,7 @@ private:
   virtual void scanFinalizationQueue(word_t closure);
   virtual void addFinalizationCandidate(gc* obj);
   virtual void traceObject(gc* obj, word_t closure);
+  virtual void setType(gcHeader* header, void* type);
   virtual size_t getObjectSize(gc* obj);
   virtual const char* getObjectTypeName(gc* obj);
   virtual void printMethod(vmkit::FrameInfo* FI, word_t ip, word_t addr);
@@ -353,9 +354,12 @@ public:
   ///
   void loadBootstrap();
 
+#if RESET_STALE_REFERENCES
+
 public:
   void resetReferencesToBundle(int64_t bundleID);
   virtual void resetReferenceIfStale(const void* source, void** ref);
+  void dumpClassLoaderBundles();
 
   int64_t getClassLoaderBundleID(JnjvmClassLoader* loader);
   JnjvmClassLoader* getBundleClassLoader(int64_t bundleID);
@@ -368,8 +372,11 @@ protected:
   void resetReferenceIfStale(const JavaObject *source, class VMStaticInstance** ref);
   void resetReferenceIfStale(const JavaObject *source, class JavaObject** ref);
 
+  // Link between OSGi (bundle ID) and Java (class loaders).
   vmkit::LockRecursive bundleClassLoadersLock;
   bundleClassLoadersType bundleClassLoaders;
+
+#endif
 };
 
 } // end namespace j3

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp Thu Apr 25 11:54:20 2013
@@ -7,6 +7,9 @@
 //
 //===----------------------------------------------------------------------===//
 
+#define DEBUG_VERBOSE_CLASS_LOADER_UNLOADING		1
+
+#include <iostream>
 #include <climits>
 #include <cstdlib>
 
@@ -43,6 +46,7 @@
 
 
 using namespace j3;
+using namespace std;
 
 typedef void (*static_init_t)(JnjvmClassLoader*);
 
@@ -209,14 +213,21 @@ JnjvmBootstrapLoader::JnjvmBootstrapLoad
 }
 
 JnjvmClassLoader::JnjvmClassLoader(vmkit::BumpPtrAllocator& Alloc) :
-	allocator(Alloc), zombie(false)
+	allocator(Alloc)
+#if RESET_STALE_REFERENCES
+	,zombie(false)
+#endif
 {
 }
 
 JnjvmClassLoader::JnjvmClassLoader(vmkit::BumpPtrAllocator& Alloc,
                                    JnjvmClassLoader& JCL, JavaObject* loader,
                                    VMClassLoader* vmdata,
-                                   Jnjvm* VM) : allocator(Alloc), zombie(false) {
+                                   Jnjvm* VM) : allocator(Alloc)
+#if RESET_STALE_REFERENCES
+	, zombie(false)
+#endif
+{
   llvm_gcroot(loader, 0);
   llvm_gcroot(vmdata, 0);
   bootstrapLoader = JCL.bootstrapLoader;
@@ -240,24 +251,6 @@ JnjvmClassLoader::JnjvmClassLoader(vmkit
   assert(loadClass && "Loader does not have a loadClass function");
 }
 
-int64_t JnjvmClassLoader::getAssociatedBundleID()
-{
-	return vm->getClassLoaderBundleID(this);
-}
-
-void JnjvmClassLoader::setAssociatedBundleID(int64_t newID)
-{
-	int64_t oldBundleID = vm->getClassLoaderBundleID(this);
-	if (oldBundleID != -1) {
-		if (oldBundleID == newID) return;	// Nothing to do
-
-		// Remove old bundle ID
-		vm->setBundleClassLoader(oldBundleID, NULL);
-	}
-
-	vm->setBundleClassLoader(newID, this);
-}
-
 void JnjvmClassLoader::setCompiler(JavaCompiler* Comp) {
   // Set the new compiler.
   TheCompiler = Comp;
@@ -860,6 +853,16 @@ const UTF8* JnjvmClassLoader::readerCons
 
 JnjvmClassLoader::~JnjvmClassLoader() {
 
+#if RESET_STALE_REFERENCES
+
+#if DEBUG_VERBOSE_CLASS_LOADER_UNLOADING
+  cerr << "Bundle class loader unloaded, bundleID=" << this->getAssociatedBundleID() << endl;
+#endif
+
+  this->setAssociatedBundleID(-1);
+
+#endif
+
   if (vm) {
     vm->removeFrameInfos(TheCompiler);
   }
@@ -1111,3 +1114,25 @@ ArrayObject* JnjvmBootstrapLoader::getBo
 
   return res;
 }
+
+#if RESET_STALE_REFERENCES
+
+int64_t JnjvmClassLoader::getAssociatedBundleID()
+{
+	return vm->getClassLoaderBundleID(this);
+}
+
+void JnjvmClassLoader::setAssociatedBundleID(int64_t newID)
+{
+	int64_t oldBundleID = vm->getClassLoaderBundleID(this);
+	if (oldBundleID != -1) {
+		if (oldBundleID == newID) return;	// Nothing to do
+
+		// Remove old bundle ID
+		vm->setBundleClassLoader(oldBundleID, NULL);
+	}
+
+	vm->setBundleClassLoader(newID, this);
+}
+
+#endif

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h Thu Apr 25 11:54:20 2013
@@ -19,6 +19,7 @@
 
 
 #include "vmkit/Allocator.h"
+#include "vmkit/VirtualMachine.h"
 
 #include "JavaObject.h"
 #include "JnjvmConfig.h"
@@ -324,16 +325,23 @@ public:
   ///
   word_t getRegisteredNative(const JavaMethod * meth);
 
+#if RESET_STALE_REFERENCES
+
 protected:
+  // A zombie class loader is one whose defining bundle was uninstalled, but it is
+  // still loaded because some references to it still exist in memory.
   bool zombie;
 
 public:
   bool isZombie() const {return zombie;}
   void markZombie(bool becomeZombie = true) {zombie = becomeZombie;}
 
+  // This bridges the OSGi world (bundles) to the Java world (class loaders).
   int64_t getAssociatedBundleID();
   void setAssociatedBundleID(int64_t newID);
 
+#endif
+
   friend class Class;
   friend class CommonClass;
   friend class StringList;

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp Thu Apr 25 11:54:20 2013
@@ -1,13 +1,26 @@
 
 #include <algorithm>
+#include <iostream>
 
 #include "VmkitGC.h"
 #include "Jnjvm.h"
 #include "ClasspathReflect.h"
 #include "j3/jni.h"
 
+
+using namespace std;
+
+#if RESET_STALE_REFERENCES
+
 namespace j3 {
 
+void Jnjvm::dumpClassLoaderBundles()
+{
+	for (bundleClassLoadersType::const_iterator i = bundleClassLoaders.begin(), e = bundleClassLoaders.end(); i != e; ++i) {
+		cerr << "classLoader=" << i->second << "\tbundleID=" << i->first << endl;
+	}
+}
+
 JnjvmClassLoader* Jnjvm::getBundleClassLoader(int64_t bundleID)
 {
 	if (bundleID == -1) return NULL;
@@ -36,6 +49,7 @@ int64_t Jnjvm::getClassLoaderBundleID(Jn
 	return (i == last) ? -1 : i->first;
 }
 
+// Link a bundle ID (OSGi world) to a class loader (Java world).
 void Jnjvm::setBundleClassLoader(int64_t bundleID, JnjvmClassLoader* loader)
 {
 	if (bundleID == -1) return;
@@ -49,19 +63,48 @@ void Jnjvm::setBundleClassLoader(int64_t
 
 }
 
+#endif
 
 using namespace j3;
 
+/*
+	This Java native method must be called by the framework in order to link bundles (given
+	by bundle identifiers) to objects (thus, class loaders). This allows the VM to perform
+	operations on bundles without actually having to know the precise structure of these.
+*/
 extern "C" void Java_j3_vm_OSGi_associateBundleClass(jlong bundleID, JavaObjectClass* classObject)
 {
 	llvm_gcroot(classObject, 0);
 
+#if RESET_STALE_REFERENCES
+
 	CommonClass* ccl = JavaObjectClass::getClass(classObject);
 	ccl->classLoader->setAssociatedBundleID(bundleID);
+
+#endif
 }
 
+/*
+	The VM manager bundle calls this method to reset all references to a given bundle. This enables
+	resetting stale references that would otherwise prohibit the bundle from being unloaded from
+	memory due to some stale references.
+*/
 extern "C" void Java_j3_vm_OSGi_resetReferencesToBundle(jlong bundleID)
 {
+#if RESET_STALE_REFERENCES
+
 	Jnjvm* vm = JavaThread::get()->getJVM();
 	vm->resetReferencesToBundle(bundleID);
+
+#endif
+}
+
+extern "C" void Java_j3_vm_OSGi_dumpClassLoaderBundles()
+{
+#if RESET_STALE_REFERENCES
+
+	Jnjvm* vm = JavaThread::get()->getJVM();
+	vm->dumpClassLoaderBundles();
+
+#endif
 }

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp Thu Apr 25 11:54:20 2013
@@ -3,6 +3,8 @@
 #include "Jnjvm.h"
 #include "VMStaticInstance.h"
 
+#if RESET_STALE_REFERENCES
+
 #define DEBUG_VERBOSE_STALE_REF		1
 
 using namespace std;
@@ -14,16 +16,20 @@ void Jnjvm::resetReferencesToBundle(int6
 	JnjvmClassLoader* loader = this->getBundleClassLoader(bundleID);
 	assert(loader && "No class loader is associated with the bundle");
 
+	// Mark this class loader as a zombie. Its references will be reset in the next
+	// garbage collection phase.
 	loader->markZombie();
 
-	vmkit::Collector::collect();
+	vmkit::Collector::collect();	// Start a garbage collection now
 }
 
 void Jnjvm::resetReferenceIfStale(const void* source, void** ref)
 {
-	if (!ref || !(*ref)) return;
+	if (!ref || !(*ref)) return;	// Invalid or null reference
 	JavaObject** objRef = reinterpret_cast<JavaObject**>(ref);
 
+	// Check the type of Java object. Some Java objects are not real object, but
+	// are bridges between Java and the VM objects.
 	if (VMClassLoader::isVMClassLoader(*objRef)) {
 		return resetReferenceIfStale(
 			reinterpret_cast<const JavaObject*>(source),
@@ -98,9 +104,8 @@ void Jnjvm::resetReferenceIfStale(const
 
 	Jnjvm* vm = JavaThread::get()->getJVM();
 	if (JavaThread* ownerThread = (JavaThread*)vmkit::ThinLock::getOwner(*ref, vm->lockSystem)) {
-		if (vmkit::FatLock* lock = vmkit::ThinLock::getFatLock(*ref, vm->lockSystem)) {
+		if (vmkit::FatLock* lock = vmkit::ThinLock::getFatLock(*ref, vm->lockSystem))
 			lock->markAssociatedObjectAsDead();
-		}
 
 		// Notify all threads waiting on this object
 		ownerThread->lockingThread.notifyAll(*ref, vm->lockSystem, ownerThread);
@@ -114,3 +119,5 @@ void Jnjvm::resetReferenceIfStale(const
 }
 
 }
+
+#endif

Modified: vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp (original)
+++ vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp Thu Apr 25 11:54:20 2013
@@ -326,20 +326,9 @@ bool FatLock::acquire(gc* obj, LockSyste
 
   if (this->associatedObjectIsDead()) {
     internalLock.unlock();
-/*
-    vmkit::Thread* ownerThread = this->getOwner();
 
-    // Notify all threads waiting on this object
-    ownerThread->lockingThread.notifyAll(*ref, vm->lockSystem, ownerThread);
-
-    // Release this object
-    while (vmkit::ThinLock::getOwner(*ref, vm->lockSystem) == ownerThread)
-      vmkit::ThinLock::release(*ref, vm->lockSystem, ownerThread);
-*/
-
-	if (lockingThreads == 0) {
-      table.deallocate(this);
-    }
+//	if (lockingThreads == 0)
+//      table.deallocate(this);
 
 	word_t methodIP = System::GetCallerAddress();
 	methodIP = System::GetIPFromCallerAddress(methodIP);

Modified: vmkit/trunk/llvm.patch
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/llvm.patch?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/llvm.patch (original)
+++ vmkit/trunk/llvm.patch Thu Apr 25 11:54:20 2013
@@ -2,7 +2,7 @@ diff --git a/lib/CodeGen/AsmPrinter/AsmP
 index d74a703..1831bb6 100644
 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
 +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
-@@ -177,7 +177,7 @@ bool AsmPrinter::doInitialization(Module &M) {
+@@ -173,7 +173,7 @@ bool AsmPrinter::doInitialization(Module &M) {
    for (GCModuleInfo::iterator I = MI->begin(), E = MI->end(); I != E; ++I)
      if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I))
        MP->beginAssembly(*this);
@@ -11,7 +11,7 @@ index d74a703..1831bb6 100644
    // Emit module-level inline asm if it exists.
    if (!M.getModuleInlineAsm().empty()) {
      OutStreamer.AddComment("Start of file scope inline assembly");
-@@ -186,7 +186,7 @@ bool AsmPrinter::doInitialization(Module &M) {
+@@ -182,7 +182,7 @@ bool AsmPrinter::doInitialization(Module &M) {
      OutStreamer.AddComment("End of file scope inline assembly");
      OutStreamer.AddBlankLine();
    }
@@ -20,7 +20,7 @@ index d74a703..1831bb6 100644
    if (MAI->doesSupportDebugInformation())
      DD = new DwarfDebug(this, &M);
  
-@@ -928,6 +928,15 @@ bool AsmPrinter::doFinalization(Module &M) {
+@@ -929,6 +929,15 @@ bool AsmPrinter::doFinalization(Module &M) {
      if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*--I))
        MP->finishAssembly(*this);
  
@@ -62,7 +62,7 @@ index 0f3efd8..d96a258 100644
        nl(Out);
      }
 +    if (const Function* F = dyn_cast<Function>(call->getCalledValue())) {
-+    	if (F->getName().compare("llvm.dbg.value") == 0)
++    	if ((F->getName().compare("llvm.dbg.value") == 0) || (F->getName().compare("llvm.dbg.declare") == 0))
 +    		break;	//Generate nothing
 +    }
      if (call->getNumArgOperands() > 1) {

Modified: vmkit/trunk/mmtk/java/build.xml.in
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/java/build.xml.in?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/mmtk/java/build.xml.in (original)
+++ vmkit/trunk/mmtk/java/build.xml.in Thu Apr 25 11:54:20 2013
@@ -1,7 +1,7 @@
 <project name="MMTK-VMKit" default="main" basedir=".">
   <target name="main">
     <mkdir dir="classes"/>
-    <javac srcdir="@abs_top_srcdir@/mmtk/java/src" destdir="classes" source="1.5" includeantruntime="false"/>
+    <javac srcdir="@abs_top_srcdir@/mmtk/java/src" destdir="classes" source="1.5" target="1.5" includeantruntime="false"/>
     <jar jarfile="mmtk-vmkit.jar">
       <fileset dir="classes"/>
     </jar>

Modified: vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp Thu Apr 25 11:54:20 2013
@@ -55,13 +55,40 @@ extern "C" void JnJVM_org_j3_bindings_Bi
   
 extern "C" void JnJVM_org_j3_bindings_Bindings_nonHeapWriteBarrier__Lorg_vmmagic_unboxed_Address_2Lorg_vmmagic_unboxed_ObjectReference_2(gc** ptr, gc* value) ALWAYS_INLINE;
 
-extern "C" void* JnJVM_org_j3_bindings_Bindings_gcmalloc__ILorg_vmmagic_unboxed_ObjectReference_2(
-    int sz, void* VT) ALWAYS_INLINE;
+extern "C" void* JnJVM_org_j3_bindings_Bindings_prealloc__I(int sz) ALWAYS_INLINE;
 
-extern "C" void* gcmalloc(uint32_t sz, void* VT) {
+extern "C" void* JnJVM_org_j3_bindings_Bindings_postalloc__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2I(
+		void* object, void* type, int sz) ALWAYS_INLINE;
+
+extern "C" void* prealloc(uint32_t size) {
+	gc* res = 0;
+  gcHeader* head = 0;
+  size = llvm::RoundUpToAlignment(size, sizeof(void*));
+  head = (gcHeader*) JnJVM_org_j3_bindings_Bindings_prealloc__I(size);
+  res = head->toReference();
+  return res;
+}
+
+extern "C" void postalloc(gc* obj, void* type, uint32_t size) {
+	vmkit::Thread::get()->MyVM->setType(obj->toHeader(), type);
+	JnJVM_org_j3_bindings_Bindings_postalloc__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2I(obj, type, size);
+}
+
+extern "C" void* gcmalloc(uint32_t sz, void* type) {
+  gc* res = 0;
+  llvm_gcroot(res, 0);
 	sz += gcHeader::hiddenHeaderSize();
-  sz = llvm::RoundUpToAlignment(sz, sizeof(void*));
-  return ((gcHeader*)JnJVM_org_j3_bindings_Bindings_gcmalloc__ILorg_vmmagic_unboxed_ObjectReference_2(sz, VT))->toReference();
+	res = (gc*) prealloc(sz);
+	postalloc(res, type, sz);
+	return res;
+}
+
+extern "C" void* gcmallocUnresolved(uint32_t sz, void* type) {
+  gc* res = 0;
+  llvm_gcroot(res, 0);
+  res = (gc*)gcmalloc(sz, type);
+	vmkit::Thread::get()->MyVM->addFinalizationCandidate(res);
+  return res;
 }
 
 extern "C" void addFinalizationCandidate(gc* obj) __attribute__((always_inline));
@@ -71,13 +98,6 @@ extern "C" void addFinalizationCandidate
   vmkit::Thread::get()->MyVM->addFinalizationCandidate(obj);
 }
 
-extern "C" void* gcmallocUnresolved(uint32_t sz, VirtualTable* VT) {
-  gc* res = 0;
-  llvm_gcroot(res, 0);
-  res = (gc*)gcmalloc(sz, VT);
-  if (VT->hasDestructor()) addFinalizationCandidate(res);
-  return res;
-}
 
 extern "C" void arrayWriteBarrier(void* ref, void** ptr, void* value) {
   JnJVM_org_j3_bindings_Bindings_arrayWriteBarrier__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Address_2Lorg_vmmagic_unboxed_ObjectReference_2(
@@ -114,7 +134,10 @@ void Collector::scanObject(void** ptr, w
   if ((*ptr) != NULL) {
     assert(((gc*)(*ptr))->getVirtualTable());
   }
+#if RESET_STALE_REFERENCES
+  // Allow the VM to reset references if needed
   vmkit::Thread::get()->MyVM->resetReferenceIfStale(NULL, ptr);
+#endif
   JnJVM_org_j3_bindings_Bindings_reportDelayedRootEdge__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_Address_2(closure, ptr);
 }
  
@@ -124,7 +147,10 @@ void Collector::markAndTrace(void* sourc
     assert(((gc*)(*ptr_))->getVirtualTable());
   }
   if ((*(void**)ptr) != NULL) assert(((gc*)(*(void**)ptr))->getVirtualTable());
+#if RESET_STALE_REFERENCES
+  // Allow the VM to reset references if needed
   vmkit::Thread::get()->MyVM->resetReferenceIfStale(source, ptr_);
+#endif
   JnJVM_org_j3_bindings_Bindings_processEdge__Lorg_mmtk_plan_TransitiveClosure_2Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Address_2(closure, source, ptr);
 }
   
@@ -133,7 +159,10 @@ void Collector::markAndTraceRoot(void* s
   if ((*ptr_) != NULL) {
     assert(((gc*)(*ptr_))->getVirtualTable());
   }
+#if RESET_STALE_REFERENCES
+  // Allow the VM to reset references if needed
   vmkit::Thread::get()->MyVM->resetReferenceIfStale(source, ptr_);
+#endif
   JnJVM_org_j3_bindings_Bindings_processRootEdge__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_Address_2Z(closure, ptr, true);
 }
 

Modified: vmkit/trunk/osgi/src/j3/J3Mgr.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/osgi/src/j3/J3Mgr.java?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/osgi/src/j3/J3Mgr.java (original)
+++ vmkit/trunk/osgi/src/j3/J3Mgr.java Thu Apr 25 11:54:20 2013
@@ -9,5 +9,6 @@ public interface J3Mgr
 	// THE FOLLOWING METHODS ARE DEBUGGING HELPERS
 	// THEY SHOULD BE REMOVED IN PRODUCTION
 	
+	public void dumpClassLoaderBundles();
 	public void resetReferencesToBundle(String bundleName) throws Exception;
 }

Modified: vmkit/trunk/osgi/src/j3/vm/OSGi.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/osgi/src/j3/vm/OSGi.java?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/osgi/src/j3/vm/OSGi.java (original)
+++ vmkit/trunk/osgi/src/j3/vm/OSGi.java Thu Apr 25 11:54:20 2013
@@ -4,4 +4,5 @@ public class OSGi
 {
 	public static native void associateBundleClass(long bundleID, Class classObject);
 	public static native void resetReferencesToBundle(long bundleID);
+	public static native void dumpClassLoaderBundles();
 }

Modified: vmkit/trunk/osgi/src/j3mgr/Activator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/osgi/src/j3mgr/Activator.java?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/osgi/src/j3mgr/Activator.java (original)
+++ vmkit/trunk/osgi/src/j3mgr/Activator.java Thu Apr 25 11:54:20 2013
@@ -12,8 +12,6 @@ public class Activator
 
 	public void start(BundleContext bundleContext) throws Exception
 	{
-		System.out.println("J3MgrImpl exports and provides J3Mgr");
-
 		mgr = new J3MgrImpl();
 		mgr.open(bundleContext);
 		
@@ -22,8 +20,6 @@ public class Activator
 
 	public void stop(BundleContext bundleContext) throws Exception
 	{
-		System.out.println("J3MgrImpl no more provides J3Mgr");
-
 		if (mgr != null) {
 			mgr.close();
 			mgr = null;

Modified: vmkit/trunk/osgi/src/j3mgr/J3MgrImpl.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/osgi/src/j3mgr/J3MgrImpl.java?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/osgi/src/j3mgr/J3MgrImpl.java (original)
+++ vmkit/trunk/osgi/src/j3mgr/J3MgrImpl.java Thu Apr 25 11:54:20 2013
@@ -1,5 +1,7 @@
 package j3mgr;
 
+import java.util.LinkedList;
+
 import j3.J3Mgr;
 
 import org.osgi.framework.Bundle;
@@ -13,17 +15,14 @@ public class J3MgrImpl
 	implements J3Mgr, FrameworkListener
 {
 	BundleContext context;
-	long bundleToKill;
-
-	public J3MgrImpl()
-	{
-		bundleToKill = -1;
-	}
+	LinkedList<Long> bundlesToKill;
 	
 	public void open(BundleContext bundleContext)
 	{
 		context = bundleContext;
 		
+		bundlesToKill = new LinkedList<Long>();
+		
 		// We need to know when packages are refreshed
 		context.addFrameworkListener(this);
 	}
@@ -32,19 +31,21 @@ public class J3MgrImpl
 	{
 		context.removeFrameworkListener(this);
 		context = null;
+		
+		bundlesToKill = null;
 	}
 
 	public void resetReferencesToBundle(Bundle bundle) throws Exception
 	{
 		System.out.println("resetReferencesToBundle: #" + bundle.getBundleId() + " " + bundle.getSymbolicName());
 		
-		bundleToKill = bundle.getBundleId();
-		
 		System.out.println("Stopping bundle: " + bundle.getSymbolicName());
 		bundle.stop();
 		System.out.println("Uninstalling bundle: " + bundle.getSymbolicName());
 		bundle.uninstall();
 
+		bundlesToKill.addFirst(new Long(bundle.getBundleId()));
+		
 		System.out.println("Refreshing framework...");
 		refreshFramework(bundle);
 	}
@@ -54,19 +55,17 @@ public class J3MgrImpl
 		ServiceReference<?> pkgAdminRef = (ServiceReference<?>)context.getServiceReference(
 			"org.osgi.service.packageadmin.PackageAdmin");
 		PackageAdmin pkgAdmin = (PackageAdmin)context.getService(pkgAdminRef);
-		pkgAdmin.refreshPackages(new Bundle[] {bundle});		
+		pkgAdmin.refreshPackages(null);
 	}
 
 	public void frameworkEvent(FrameworkEvent event)
 	{
 		if (event.getType() != FrameworkEvent.PACKAGES_REFRESHED) return;
 
-		if (bundleToKill == -1) return;
-		
-		System.out.println("Resetting stale references to bundle #" + bundleToKill);
-		j3.vm.OSGi.resetReferencesToBundle(bundleToKill);
+		long bundleID = bundlesToKill.removeLast().longValue();
 		
-		bundleToKill = -1;
+		System.out.println("Resetting stale references to bundle #" + bundleID);
+		j3.vm.OSGi.resetReferencesToBundle(bundleID);
 	}
 	
 	// THE FOLLOWING METHODS ARE DEBUGGING HELPERS
@@ -86,4 +85,9 @@ public class J3MgrImpl
 		}
 		return null;
 	}
+
+	public void dumpClassLoaderBundles()
+	{
+		j3.vm.OSGi.dumpClassLoaderBundles();
+	}
 }

Added: vmkit/trunk/tests/benchmarks/j3-stale-ref-corrected.csv
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/benchmarks/j3-stale-ref-corrected.csv?rev=180316&view=auto
==============================================================================
--- vmkit/trunk/tests/benchmarks/j3-stale-ref-corrected.csv (added)
+++ vmkit/trunk/tests/benchmarks/j3-stale-ref-corrected.csv Thu Apr 25 11:54:20 2013
@@ -0,0 +1,269 @@
+PID,DATE,MEM_DATA,CPU_USAGE
+14003,0,83693568,0
+14003,1,84475904,62.00
+14003,2,84520960,107.00
+14003,3,84959232,83.00
+14003,4,86032384,98.00
+14003,5,86032384,100.00
+14003,6,86032384,98.00
+14003,7,86032384,93.00
+14003,8,86032384,104.00
+14003,9,86036480,97.00
+14003,10,86032384,110.00
+14003,12,85966848,53.50
+14003,13,86036480,98.00
+14003,14,86032384,97.00
+14003,15,86032384,98.00
+14003,16,85966848,108.00
+14003,17,85966848,94.00
+14003,18,86032384,101.00
+14003,19,86036480,99.00
+14003,20,86032384,101.00
+14003,21,86036480,96.00
+14003,22,86032384,117.00
+14003,23,85966848,101.00
+14003,25,86036480,51.00
+14003,26,86032384,107.00
+14003,27,85966848,98.00
+14003,28,86036480,99.00
+14003,29,86032384,106.00
+14003,30,86032384,102.00
+14003,31,86032384,103.00
+14003,32,86032384,106.00
+14003,34,86032384,56.00
+14003,35,85966848,111.00
+14003,36,86032384,104.00
+14003,37,86032384,92.00
+14003,38,86032384,99.00
+14003,39,86036480,94.00
+14003,40,86036480,97.00
+14003,41,86032384,96.00
+14003,42,86032384,104.00
+14003,43,86036480,98.00
+14003,44,86032384,117.00
+14003,46,86032384,53.00
+14003,47,86032384,102.00
+14003,48,86036480,108.00
+14003,49,86036480,91.00
+14003,50,86032384,108.00
+14003,51,85966848,96.00
+14003,52,86032384,101.00
+14003,53,86032384,90.00
+14003,54,86036480,103.00
+14003,55,86032384,96.00
+14003,56,86036480,101.00
+14003,57,86032384,89.00
+14003,58,86032384,108.00
+14003,60,85970944,51.50
+14003,61,85987328,88.00
+14003,62,86024192,100.00
+14003,63,86118400,102.00
+14003,64,86093824,121.00
+14003,65,86192128,98.00
+14003,66,86220800,102.00
+14003,67,86253568,93.00
+14003,68,86290432,108.00
+14003,70,86323200,58.00
+14003,71,86360064,105.00
+14003,72,86401024,111.00
+14003,73,86429696,106.00
+14003,74,86466560,107.00
+14003,75,86503424,103.00
+14003,77,86536192,59.50
+14003,78,86568960,94.00
+14003,79,86597632,94.00
+14003,80,86638592,103.00
+14003,81,86667264,94.00
+14003,82,86700032,112.00
+14003,83,86667264,93.00
+14003,84,86761472,100.00
+14003,85,86724608,93.00
+14003,86,86822912,102.00
+14003,87,86851584,86.00
+14003,88,86892544,99.00
+14003,89,86913024,90.00
+14003,90,86953984,99.00
+14003,91,86982656,89.00
+14003,92,87015424,99.00
+14003,93,87040000,97.00
+14003,95,86482944,52.50
+14003,96,87044096,97.00
+14003,97,87138304,106.00
+14003,98,87179264,102.00
+14003,99,87199744,97.00
+14003,100,87236608,106.00
+14003,101,87269376,92.00
+14003,102,87293952,99.00
+14003,103,87330816,91.00
+14003,104,87298048,118.00
+14003,106,87400448,56.00
+14003,107,87429120,103.00
+14003,108,87465984,107.00
+14003,109,87490560,93.00
+14003,110,87527424,108.00
+14003,111,87564288,97.00
+14003,112,87597056,104.00
+14003,113,87625728,94.00
+14003,114,87592960,108.00
+14003,115,87687168,99.00
+14003,116,87719936,88.00
+14003,117,87748608,95.00
+14003,119,87789568,51.00
+14003,120,87818240,96.00
+14003,121,87842816,96.00
+14003,122,87879680,102.00
+14003,123,87912448,96.00
+14003,124,87937024,106.00
+14003,125,87969792,95.00
+14003,126,87408640,101.00
+14003,127,88035328,110.00
+14003,128,88072192,108.00
+14003,129,88104960,96.00
+14003,130,88129536,104.00
+14003,132,88162304,47.50
+14003,133,88190976,101.00
+14003,134,88162304,101.00
+14003,135,88260608,104.00
+14003,136,88297472,101.00
+14003,137,88322048,93.00
+14003,138,88358912,105.00
+14003,139,88391680,92.00
+14003,140,88358912,121.00
+14003,141,88449024,96.00
+14003,142,88420352,103.00
+14003,144,88506368,48.50
+14003,145,88477696,94.00
+14003,146,88510464,103.00
+14003,147,88539136,94.00
+14003,148,88637440,97.00
+14003,149,88686592,136.00
+14003,151,88727552,62.00
+14003,152,88748032,95.00
+14003,153,88780800,93.00
+14003,154,88809472,95.00
+14003,155,88776704,92.00
+14003,156,88276992,94.00
+14003,157,88838144,107.00
+14003,158,88866816,96.00
+14003,159,88956928,92.00
+14003,160,88993792,106.00
+14003,161,89022464,106.00
+14003,162,89055232,99.00
+14003,163,89018368,89.00
+14003,164,89108480,96.00
+14003,165,89141248,98.00
+14003,166,89112576,97.00
+14003,167,89141248,104.00
+14003,168,89239552,97.00
+14003,169,89264128,93.00
+14003,170,89235456,97.00
+14003,172,89329664,52.00
+14003,173,89358336,99.00
+14003,174,89391104,96.00
+14003,175,89427968,99.00
+14003,176,89460736,104.00
+14003,177,89485312,104.00
+14003,178,89518080,97.00
+14003,179,89550848,90.00
+14003,180,89579520,104.00
+14003,181,89612288,89.00
+14003,182,89645056,95.00
+14003,183,89673728,89.00
+14003,184,89706496,97.00
+14003,185,89726976,89.00
+14003,186,89694208,90.00
+14003,187,89784320,81.00
+14003,188,89817088,94.00
+14003,189,89845760,90.00
+14003,190,89878528,102.00
+14003,191,89907200,90.00
+14003,192,89939968,93.00
+14003,193,89964544,96.00
+14003,194,89997312,101.00
+14003,195,90025984,93.00
+14003,196,90062848,88.00
+14003,197,90091520,92.00
+14003,198,90124288,93.00
+14003,199,90144768,92.00
+14003,200,90112000,87.00
+14003,201,90202112,89.00
+14003,202,90230784,91.00
+14003,203,90259456,95.00
+14003,204,90296320,87.00
+14003,205,90324992,93.00
+14003,206,90357760,96.00
+14003,207,90378240,96.00
+14003,208,90345472,82.00
+14003,209,90435584,88.00
+14003,210,90464256,98.00
+14003,211,90497024,96.00
+14003,212,90517504,73.00
+14003,213,90542080,73.00
+14003,214,90574848,99.00
+14003,215,90599424,78.00
+14003,216,90558464,74.00
+14003,217,90652672,82.00
+14003,218,90669056,82.00
+14003,219,90693632,88.00
+14003,220,90718208,78.00
+14003,221,90755072,82.00
+14003,223,90771456,42.00
+14003,224,90796032,68.00
+14003,225,90824704,81.00
+14003,226,90849280,96.00
+14003,227,90873856,73.00
+14003,228,90898432,76.00
+14003,229,90865664,96.00
+14003,230,90959872,99.00
+14003,231,90927104,93.00
+14003,232,90955776,100.00
+14003,233,90988544,85.00
+14003,234,90488832,99.00
+14003,235,91107328,93.00
+14003,236,91136000,96.00
+14003,237,91168768,95.00
+14003,238,91201536,88.00
+14003,239,91234304,93.00
+14003,240,91254784,95.00
+14003,241,91222016,98.00
+14003,242,91250688,104.00
+14003,243,91283456,95.00
+14003,244,91312128,98.00
+14003,245,91410432,106.00
+14003,246,91439104,102.00
+14003,247,91471872,96.00
+14003,248,91500544,91.00
+14003,249,91459584,90.00
+14003,250,91553792,89.00
+14003,251,91586560,92.00
+14003,252,91615232,101.00
+14003,253,91652096,92.00
+14003,254,91680768,95.00
+14003,255,91713536,100.00
+14003,256,91742208,90.00
+14003,257,91774976,96.00
+14003,258,91795456,103.00
+14003,260,91828224,48.50
+14003,261,91791360,90.00
+14003,262,91889664,101.00
+14003,263,91914240,86.00
+14003,264,91942912,96.00
+14003,265,91971584,91.00
+14003,266,92004352,91.00
+14003,267,92037120,94.00
+14003,268,92069888,97.00
+14003,269,92098560,105.00
+14003,270,92131328,94.00
+14003,271,92160000,93.00
+14003,272,92184576,88.00
+14003,273,92213248,101.00
+14003,274,92254208,104.00
+14003,275,92282880,98.00
+14003,276,92315648,100.00
+14003,277,92336128,98.00
+14003,278,92368896,99.00
+14003,279,92332032,93.00
+14003,280,92434432,75.00
+14003,281,92405760,12.00
+14003,282,92798976,60.00
+14003,284,92798976,0

Added: vmkit/trunk/tests/benchmarks/j3-stale-ref.csv
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/benchmarks/j3-stale-ref.csv?rev=180316&view=auto
==============================================================================
--- vmkit/trunk/tests/benchmarks/j3-stale-ref.csv (added)
+++ vmkit/trunk/tests/benchmarks/j3-stale-ref.csv Thu Apr 25 11:54:20 2013
@@ -0,0 +1,77 @@
+PID,DATE,MEM_DATA,CPU_USAGE
+31700,0,82620416,0
+31700,1,82620416,0
+31700,2,83570688,84.00
+31700,3,83890176,83.00
+31700,4,87556096,91.00
+31700,5,92487680,88.00
+31700,6,98541568,104.00
+31700,7,103399424,86.00
+31700,8,109211648,89.00
+31700,9,114331648,87.00
+31700,10,119197696,89.00
+31700,11,125255680,84.00
+31700,12,130113536,87.00
+31700,13,135782400,84.00
+31700,14,140853248,84.00
+31700,15,145903616,85.00
+31700,16,150765568,95.00
+31700,17,156827648,92.00
+31700,18,161677312,92.00
+31700,19,166547456,87.00
+31700,20,172613632,109.00
+31700,21,178704384,110.00
+31700,22,183554048,95.00
+31700,24,188403712,53.00
+31700,25,193261568,90.00
+31700,26,199315456,92.00
+31700,27,204206080,102.00
+31700,28,209059840,104.00
+31700,29,215130112,96.00
+31700,30,220983296,98.00
+31700,31,226050048,109.00
+31700,32,232132608,126.00
+31700,34,239091712,54.50
+31700,35,245481472,126.00
+31700,37,252755968,71.00
+31700,38,261013504,136.00
+31700,40,268550144,75.50
+31700,41,277037056,149.00
+31700,43,285544448,81.50
+31700,45,294985728,86.00
+31700,47,305041408,97.00
+31700,49,314769408,95.00
+31700,51,325689344,98.00
+31700,54,336621568,76.33
+31700,57,348766208,81.66
+31700,60,362106880,92.00
+31700,62,375476224,130.50
+31700,65,388820992,88.33
+31700,69,402210816,74.75
+31700,72,416763904,93.00
+31700,75,432205824,105.33
+31700,78,447868928,107.00
+31700,82,464117760,82.25
+31700,86,480931840,90.25
+31700,90,498143232,90.25
+31700,94,515145728,96.50
+31700,98,534171648,99.75
+31700,103,552796160,85.40
+31700,108,573046784,86.60
+31700,113,594059264,95.60
+31700,118,614739968,103.80
+31700,125,640221184,86.85
+31700,132,666951680,93.71
+31700,139,691376128,91.57
+31700,146,719286272,100.57
+31700,154,748339200,93.50
+31700,162,776155136,94.00
+31700,171,804700160,86.44
+31700,179,835207168,99.00
+31700,188,864772096,92.55
+31700,197,896733184,93.77
+31700,206,927342592,93.00
+31700,217,963043328,94.18
+31700,231,1004720128,87.07
+31700,246,1048158208,87.60
+31700,263,1094676480,85.82

Added: vmkit/trunk/tests/benchmarks/monitor_process.sh
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/benchmarks/monitor_process.sh?rev=180316&view=auto
==============================================================================
--- vmkit/trunk/tests/benchmarks/monitor_process.sh (added)
+++ vmkit/trunk/tests/benchmarks/monitor_process.sh Thu Apr 25 11:54:20 2013
@@ -0,0 +1,181 @@
+#/bin/bash
+
+# ps -ww -o etime:1,pid:1,time:1,%cpu,%mem,rss -C "$1" # |tr -s ' ' ','
+
+float_scale=2
+page_size=$(getconf PAGESIZE)
+clock_tick=$(getconf CLK_TCK)
+
+# Evaluate then output an equation into a float number with $float_scale precision.
+function float_eval()
+{
+	local stat=0
+	local result=0.0
+	
+	if [[ $# -gt 0 ]]; then
+		result=$(echo "scale=$float_scale; $*"|bc -q 2>/dev/null)
+		stat=$?
+		
+		if [[ "$stat" -eq 0 && -z "$result" ]]; then stat=1; fi
+	fi
+	
+	echo -n $result
+	return $stat
+}
+
+# Evaluate an equation into a condition.
+function float_cond()
+{
+	local cond=0
+	
+	if [[ $# -gt 0 ]]; then
+		cond=$(echo "$*"|bc -q 2>/dev/null)
+		
+		if [[ -z "$cond" ]]; then cond=0; fi
+		if [[ "$cond" != 0 && "$cond" != 1 ]]; then cond=0; fi
+	fi
+	
+	local stat=$(($cond == 0))
+	return $stat
+}
+
+# Outputs a PID given a process name.
+# If multiple processes of the same program exist, only one PID will be output.
+function get_pid_from_name()
+{
+	local process_name=$1
+
+	ps --no-headers -ww -o pid:1 -C "$process_name"|head -n 1
+	return $?
+}
+
+# Returns the memory data usage in bytes for a PID
+function get_memory_data_usage()
+{
+	local pid=$1
+	if [ -z "$pid" ]; then return 1; fi;
+	
+	local memory_data_pages=$(cat /proc/$pid/statm 2>/dev/null|cut -d ' ' -f 6)
+	if [ -z "$memory_data_pages" ]; then return 1; fi;
+
+	float_eval "$memory_data_pages * $page_size"
+}
+
+# Converts size from some size unit to bytes unit.
+function get_size_in_bytes()
+{
+	local size=$1
+	local number=$(echo "$size"|cut -d ' ' -f 1)
+	local unit=$(echo "$size"|cut -d ' ' -f 2)
+	local factor=1
+
+	case $unit in
+	B ) factor=1 ;;
+	kB ) factor=1024 ;;
+	mB ) factor=1048576 ;;
+	gB ) factor=1073741824 ;;
+	esac
+	
+	float_eval "$number * $factor"
+}
+
+# Returns writable memory usage, given a PID.
+function get_writable_memory_usage()
+{
+	local pid=$1
+	if [ -z "$pid" ]; then return 1; fi;
+
+	local sum=0
+	local oldIFS=$IFS
+IFS='
+'
+	for entry in $(cat /proc/$pid/smaps|tr -s ' '|grep '^Private_Dirty: [^0]'|cut -d ' ' -f '2,3'); do
+		sum=$(float_eval "$sum + $(get_size_in_bytes $entry)")
+	done
+	IFS=oldIFS
+
+	echo $sum
+}
+
+# Returns the CPU time (user+kernel) in seconds, given a PID.
+function get_cpu_time()
+{
+	local pid=$1
+	if [ -z "$pid" ]; then return 1; fi;
+
+	local user_time=$(cat /proc/$pid/stat 2>/dev/null|cut -d ' ' -f 14)
+	if [ -z "$user_time" ]; then return 1; fi;
+
+	local kernel_time=$(cat /proc/$pid/stat 2>/dev/null|cut -d ' ' -f 15)
+	if [ -z "$kernel_time" ]; then return 1; fi;
+
+	float_eval "($user_time + $kernel_time) / $clock_tick"
+}
+
+# Outputs the CPU average usage, given a PID.
+function get_cpu_avg_usage()
+{
+	local pid=$1
+	local avg_period=$2
+	local _cpu_avg_usage=$3
+	local _last_cpu_time=$4
+	local last_cpu_time
+
+	eval last_cpu_time='$'$_last_cpu_time''
+
+	if [ -z "$pid" ]; then return 1; fi;
+
+	if [ -z "$last_cpu_time" ]; then
+		last_cpu_time=$(get_cpu_time $pid)
+		if [ -z "$last_cpu_time" ]; then return 1; fi;
+	fi;
+
+	local cpu_time=$(get_cpu_time $pid)
+	if [ -z "$cpu_time" ]; then return 1; fi;
+
+	local cpu_avg_usage=$(float_eval "100 * ( $cpu_time - $last_cpu_time ) / $avg_period")
+#	local cpu_avg_usage=$(float_eval "$cpu_time - $last_cpu_time"),$(float_eval "100 * ( $cpu_time - $last_cpu_time ) / $avg_period")
+
+	eval $_cpu_avg_usage="'$cpu_avg_usage'"
+	eval $_last_cpu_time="'$cpu_time'"
+	return 0
+}
+
+period=
+the_date=
+the_last_date=$(date '+%s')
+the_last_cpu_time=
+the_cpu_avg_usage=
+
+sleep 1
+
+echo "PID,DATE,MEM_DATA,CPU_USAGE"
+#echo "DATE,PID,MEM_DATA,CPU_TIME,CPU_TIME_DIFF,CPU_USAGE"
+
+while true
+do
+	pid=$(get_pid_from_name "$1")
+
+	if [ ! -z "$pid" ]; then
+		the_date=$(date '+%s')
+		period=$(($the_date - $the_last_date))
+		the_last_date=$the_date
+
+		if [ "$period" -gt "0" ]; then
+			get_cpu_avg_usage $pid $period the_cpu_avg_usage the_last_cpu_time
+
+#			echo "$(date '+%F %T'),$pid,$(get_writable_memory_usage $pid),$(get_cpu_time $pid),$the_cpu_avg_usage"
+#			echo "$(date -d "@$the_date" '+%F %T'),$pid,$(get_writable_memory_usage $pid),$the_cpu_avg_usage"
+			echo "$pid,$the_date,$(get_writable_memory_usage $pid),$the_cpu_avg_usage"
+		fi;
+	fi;
+done
+
+# gnuplot
+# set datafile separator ","
+# set xdata time
+# set timefmt "%Y-%m-%d %H:%M:%S"
+# set format x "%M:%S"
+# plot "jasmin_player.csv" using 1:3 title "Memory Usage" with lines
+# plot "jasmin_player.csv" using 1:4 title "CPU Usage" with lines
+

Added: vmkit/trunk/tests/benchmarks/plot_benchmarks.plot
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/benchmarks/plot_benchmarks.plot?rev=180316&view=auto
==============================================================================
--- vmkit/trunk/tests/benchmarks/plot_benchmarks.plot (added)
+++ vmkit/trunk/tests/benchmarks/plot_benchmarks.plot Thu Apr 25 11:54:20 2013
@@ -0,0 +1,34 @@
+#!/usr/bin/gnuplot -p
+
+set border 3
+set xtics axis nomirror
+set ytics axis nomirror
+set xlabel "Time"
+set ylabel "Memory usage"
+set xdata time
+set timefmt "%s"
+set format x "%M:%S"
+set format y "%.1s %cB"
+set datafile separator ","
+
+set term wxt 0
+plot \
+	"j3-stale-ref.csv"	\
+	using 2:3	\
+	title "Presence of stale references"	\
+	with lines linewidth "2pt" linecolor rgb "red",	\
+	"j3-stale-ref-corrected.csv"	\
+	using 2:3	\
+	title "Stale references corrected"	\
+	with lines linewidth "3pt" linetype "dotted" linecolor rgb "blue"	\
+
+#set term wxt 1
+#plot \
+#	"j3-stale-ref.csv"	\
+#	using 2:3	\
+#	title "Presence of stale references"	\
+#	with lines linewidth "2pt" linecolor rgb "red",	\
+#	"j3-stale-ref-corrected.csv"	\
+#	using 2:3	\
+#	title "Stale references corrected"	\
+#	with lines linewidth "3pt" linetype "dotted" linecolor rgb "blue"	\

Added: vmkit/trunk/tests/benchmarks/rebase_time.sh
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/benchmarks/rebase_time.sh?rev=180316&view=auto
==============================================================================
--- vmkit/trunk/tests/benchmarks/rebase_time.sh (added)
+++ vmkit/trunk/tests/benchmarks/rebase_time.sh Thu Apr 25 11:54:20 2013
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+input=$1
+headline=$(head -n 1 "$input")
+base_time=$(head -n 2 "$input"|tail -n 1|cut -d ',' -f 2)
+
+echo $headline
+
+oldIFS=$IFS
+IFS='
+'
+for entry in $(cat "$input"|grep '^[0-9]'); do
+	pid=$(echo $entry|cut -d ',' -f 1)
+	time=$(echo $entry|cut -d ',' -f 2)
+	data=$(echo $entry|cut -d ',' -f '3-')
+	
+	echo "$pid,$(($time - $base_time)),$data"
+done
+IFS=oldIFS

Modified: vmkit/trunk/tests/debug.txt
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/debug.txt?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/tests/debug.txt (original)
+++ vmkit/trunk/tests/debug.txt Thu Apr 25 11:54:20 2013
@@ -1,3 +1,12 @@
+/home/koutheir/PhD/VMKit/vmkit_stale_ref/Debug+Asserts/bin/j3 -jar framework.jar -xargs /home/koutheir/PhD/VMKit/vmkit_stale_ref/tests/minimal.xargs
+
 framework call j3.J3Mgr resetReferencesToBundle ijvm.tests.AImpl
 
+framework call j3.J3Mgr resetReferencesToBundle ijvm.tests.Runner
+
 framework meminfo -gc
+
+bundles
+start 18
+
+framework call j3.J3Mgr dumpClassLoaderBundles

Modified: vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/A/A.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/A/A.java?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/A/A.java (original)
+++ vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/A/A.java Thu Apr 25 11:54:20 2013
@@ -3,4 +3,5 @@ package ijvm.tests.A;
 public interface A
 {
 	public void performA();
+	public Token getToken();
 }

Added: vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/A/Token.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/A/Token.java?rev=180316&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/A/Token.java (added)
+++ vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/A/Token.java Thu Apr 25 11:54:20 2013
@@ -0,0 +1,6 @@
+package ijvm.tests.A;
+
+public interface Token
+{
+	public int getValue();
+}

Modified: vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/AImpl.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/AImpl.java?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/AImpl.java (original)
+++ vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/AImpl.java Thu Apr 25 11:54:20 2013
@@ -1,6 +1,7 @@
 package ijvm.tests.AImpl;
 
 import ijvm.tests.A.A;
+import ijvm.tests.A.Token;
 
 public class AImpl
 	implements A
@@ -9,4 +10,9 @@ public class AImpl
 	{
 		System.out.println("AImpl.performA");
 	}
+
+	public Token getToken()
+	{
+		return new TokenImpl((int)(Math.random() * 100.0));
+	}
 }

Modified: vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/Activator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/Activator.java?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/Activator.java (original)
+++ vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/Activator.java Thu Apr 25 11:54:20 2013
@@ -33,13 +33,14 @@ public class Activator
 		cST.open();
 		
 		C service = (C)cST.getService();
-		if (service != null)
+		if (service != null) {
+			System.out.println("AImpl got C @ startup");
+			
 			c.add(service);
+			this.registerMyself();
+		}
 		
 		context.addServiceListener(this, "(objectclass=" + C.class.getName() + ")");
-
-		if (c != null)
-			System.out.println("AImpl got C @ startup");
 		
 		a = new AImpl();
 		context.registerService(A.class.getName(), a, null);	
@@ -69,6 +70,8 @@ public class Activator
 			if (C.class.isInstance(service)) {
 				System.out.println("AImpl got C");
 				c.add((C)service);
+				
+				this.registerMyself();
 			}
 			break;
 			
@@ -79,4 +82,11 @@ public class Activator
 			break;
 		}
 	}
+	
+	private void registerMyself()
+	{
+		C oneC = c.get(c.size() - 1);
+		
+		oneC.registerObject(this);
+	}
 }

Added: vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/TokenImpl.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/TokenImpl.java?rev=180316&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/TokenImpl.java (added)
+++ vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/TokenImpl.java Thu Apr 25 11:54:20 2013
@@ -0,0 +1,19 @@
+package ijvm.tests.AImpl;
+
+import ijvm.tests.A.Token;
+
+public class TokenImpl
+	implements Token
+{
+	int value;
+	
+	public TokenImpl(int value)
+	{
+		this.value = value;
+	}
+	
+	public int getValue()
+	{
+		return value;
+	}
+}

Modified: vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/Activator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/Activator.java?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/Activator.java (original)
+++ vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/Activator.java Thu Apr 25 11:54:20 2013
@@ -3,6 +3,7 @@ package ijvm.tests.BImpl;
 import java.util.ArrayList;
 
 import ijvm.tests.A.A;
+import ijvm.tests.A.Token;
 import ijvm.tests.B.B;
 
 import org.osgi.framework.BundleActivator;
@@ -18,11 +19,13 @@ public class Activator
 
 	private ServiceTracker aST;
 	private ArrayList<A> a;
+	private ArrayList<Token> tokens;
 	private BImpl b;
 	
 	public Activator()
 	{
 		a = new ArrayList<A>();
+		tokens = new ArrayList<Token>();
 	}
 
 	public void start(BundleContext bundleContext) throws Exception
@@ -34,13 +37,14 @@ public class Activator
 		aST.open();
 		
 		A service = (A)aST.getService();
-		if (service != null)
+		if (service != null) {
+			System.out.println("BImpl got A @ startup");
+			
 			a.add(service);
+			this.useA();
+		}
 		
 		context.addServiceListener(this, "(objectclass=" + A.class.getName() + ")");
-
-		if (a != null)
-			System.out.println("BImpl got A @ startup");
 		
 		b = new BImpl();
 		context.registerService(B.class.getName(), b, null);
@@ -70,6 +74,8 @@ public class Activator
 			if (A.class.isInstance(service)) {
 				System.out.println("BImpl got A");
 				a.add((A)service);
+				
+				this.useA();
 			}
 			break;
 			
@@ -80,4 +86,15 @@ public class Activator
 			break;
 		}
 	}
+	
+	private void useA()
+	{
+		A oneA = a.get(a.size() - 1);
+		Token token = oneA.getToken();
+		token.getValue();
+		
+		tokens.add(token);
+		
+		System.out.println("BImpl got Token from A");
+	}
 }

Added: vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/.classpath?rev=180316&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/.classpath (added)
+++ vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/.classpath Thu Apr 25 11:54:20 2013
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Added: vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/.project?rev=180316&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/.project (added)
+++ vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/.project Thu Apr 25 11:54:20 2013
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.tests.BundleMgmtStress</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

Added: vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/META-INF/MANIFEST.MF?rev=180316&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/META-INF/MANIFEST.MF Thu Apr 25 11:54:20 2013
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: BundleMgmtStress
+Bundle-SymbolicName: ijvm.tests.BundleMgmtStress
+Bundle-Version: 1.0.0
+Bundle-Activator: ijvm.tests.BundleMgmtStress.Activator
+Import-Package: j3,
+ org.osgi.framework;version="1.3.0",
+ org.osgi.util.tracker;version="1.0.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5

Added: vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/build.properties
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/build.properties?rev=180316&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/build.properties (added)
+++ vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/build.properties Thu Apr 25 11:54:20 2013
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .

Added: vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/src/ijvm/tests/BundleMgmtStress/Activator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/src/ijvm/tests/BundleMgmtStress/Activator.java?rev=180316&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/src/ijvm/tests/BundleMgmtStress/Activator.java (added)
+++ vmkit/trunk/tests/ijvm.tests.BundleMgmtStress/src/ijvm/tests/BundleMgmtStress/Activator.java Thu Apr 25 11:54:20 2013
@@ -0,0 +1,90 @@
+package ijvm.tests.BundleMgmtStress;
+
+import j3.J3Mgr;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator
+	implements BundleActivator, Runnable
+{
+	BundleContext context;
+	Thread worker;
+	boolean cancelWork;
+	long firstBundleID;
+	ServiceTracker j3mgrST;
+	J3Mgr j3mgr;
+	boolean correctStaleReferences;
+
+	public void start(BundleContext bundleContext) throws Exception
+	{
+		context = bundleContext;
+
+		j3mgrST = new ServiceTracker(context, J3Mgr.class.getName(), null);
+		j3mgrST.open();
+		j3mgr = (J3Mgr)j3mgrST.getService();
+		if (j3mgr == null)
+			throw new BundleException("J3 Management service must be started before this service.");
+		
+		correctStaleReferences = true;
+		firstBundleID = 13;
+		
+		cancelWork = false;
+		worker = new Thread(this, "Stresser");
+		worker.start();
+	}
+
+	public void stop(BundleContext bundleContext) throws Exception
+	{
+		cancelWork = true;
+		
+		if (worker != null) {
+			worker.join();
+			worker = null;
+		}
+		
+		context = null;
+	}
+
+	public void run()
+	{
+		System.out.println("Bundle management stress running...");
+		
+		try {
+			uninstallBundle(context.getBundle(firstBundleID));
+						
+			while (!cancelWork) {
+				Bundle bundle = context.installBundle("file:///home/koutheir/PhD/VMKit/vmkit_stale_ref/tests/plugins/ijvm.tests.AImpl_1.0.0.jar");
+				bundle.start();
+				Thread.sleep(20);
+				
+				System.out.println("Bundle started: " + bundle.getBundleId());
+				
+				uninstallBundle(bundle);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		
+		System.out.println("Bundle management stress done.");
+	}
+	
+	void uninstallBundle(Bundle bundle)
+	{
+		try {
+			if (correctStaleReferences) {
+				j3mgr.resetReferencesToBundle(bundle);
+			} else {
+				bundle.stop();
+				bundle.uninstall();
+			}
+			
+			System.gc();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}

Modified: vmkit/trunk/tests/ijvm.tests.C/src/ijvm/tests/C/C.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.C/src/ijvm/tests/C/C.java?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.C/src/ijvm/tests/C/C.java (original)
+++ vmkit/trunk/tests/ijvm.tests.C/src/ijvm/tests/C/C.java Thu Apr 25 11:54:20 2013
@@ -3,4 +3,5 @@ package ijvm.tests.C;
 public interface C
 {
 	public void performC();
+	public void registerObject(Object o);
 }

Modified: vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/Activator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/Activator.java?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/Activator.java (original)
+++ vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/Activator.java Thu Apr 25 11:54:20 2013
@@ -34,14 +34,14 @@ public class Activator
 		bST.open();
 		
 		B service = (B)bST.getService();
-		if (service != null)
+		if (service != null) {
+			System.out.println("CImpl got B @ startup");
+			
 			b.add(service);
+		}
 		
 		context.addServiceListener(this, "(objectclass=" + B.class.getName() + ")");
 
-		if (b != null)
-			System.out.println("CImpl got B @ startup");
-		
 		c = new CImpl();
 		context.registerService(C.class.getName(), c, null);
 	}

Modified: vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/CImpl.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/CImpl.java?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/CImpl.java (original)
+++ vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/CImpl.java Thu Apr 25 11:54:20 2013
@@ -1,12 +1,26 @@
 package ijvm.tests.CImpl;
 
+import java.util.ArrayList;
+
 import ijvm.tests.C.C;
 
 public class CImpl
 	implements C
 {
+	ArrayList<Object> registeredObjects;
+	
+	CImpl()
+	{
+		registeredObjects = new ArrayList<Object>();
+	}
+	
 	public void performC()
 	{
 		System.out.println("CImpl.performC");
 	}
+
+	public void registerObject(Object o)
+	{
+		registeredObjects.add(o);
+	}
 }

Modified: vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/Activator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/Activator.java?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/Activator.java (original)
+++ vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/Activator.java Thu Apr 25 11:54:20 2013
@@ -34,14 +34,14 @@ public class Activator
 		cST.open();
 		
 		C service = (C)cST.getService();
-		if (service != null)
+		if (service != null) {
+			System.out.println("DImpl got C @ startup");
+			
 			c.add(service);
+		}
 		
 		context.addServiceListener(this, "(objectclass=" + C.class.getName() + ")");
 
-		if (c != null)
-			System.out.println("DImpl got C @ startup");
-		
 		d = new DImpl();
 		context.registerService(D.class.getName(), d, null);
 	}

Modified: vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/Activator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/Activator.java?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/Activator.java (original)
+++ vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/Activator.java Thu Apr 25 11:54:20 2013
@@ -38,8 +38,8 @@ public class Activator
 		runnerThread1.start();
 		runnerThread2.start();
 		
-		cancellerThread = new Thread(this, "Runner Canceller");
-		cancellerThread.start();
+//		cancellerThread = new Thread(this, "Runner Canceller");
+//		cancellerThread.start();
 	}
 
 	public void stop(BundleContext bundleContext) throws Exception
@@ -53,7 +53,10 @@ public class Activator
 		aST = null;
 		// a = null;
 		
-//		runner.join();
+//		runner1.cancel();
+//		runner2.cancel();
+//		runnerThread1.join();
+//		runnerThread2.join();
 	}
 
 	public void run()

Modified: vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/Runner.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/Runner.java?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/Runner.java (original)
+++ vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/Runner.java Thu Apr 25 11:54:20 2013
@@ -19,7 +19,8 @@ public class Runner
 	
 	public void cancel()
 	{
-		cancelRunning = false;
+		System.out.println("Cancelling runner thread: " + Thread.currentThread().getName());
+		cancelRunning = true;
 	}
 	
 	public void run()
@@ -30,7 +31,18 @@ public class Runner
 			while (!cancelRunning) {
 				long delay = 2000 + (long)(Math.random() * 1000.0);
 				
-				ijvm_tests_Runner_loop(delay);
+				synchronized(obj) {
+					while (sleeping)
+						obj.wait();
+					sleeping = true;
+					
+					System.out.println(Thread.currentThread().getName() + ": sleeping for " + delay);
+					Thread.sleep(delay);
+					System.out.println(Thread.currentThread().getName() + ": woke up");
+					
+					sleeping = false;
+					obj.notifyAll();
+				}
 				
 				Thread.sleep(200);
 			}
@@ -40,25 +52,4 @@ public class Runner
 		
 		System.out.println("Stopped runner thread: " + Thread.currentThread().getName());
 	}
-	
-	void ijvm_tests_Runner_loop(long delay) throws InterruptedException
-	{
-		synchronized(obj) {
-			iteration(delay);
-		}
-	}
-	
-	void iteration(long delay) throws InterruptedException
-	{
-		while (sleeping)
-			obj.wait();
-		sleeping = true;
-		
-		System.out.println(Thread.currentThread().getName() + ": sleeping for " + delay);
-		Thread.sleep(delay);
-		System.out.println(Thread.currentThread().getName() + ": woke up");
-		
-		sleeping = false;
-		obj.notifyAll();
-	}
 }

Modified: vmkit/trunk/tests/minimal.xargs
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/minimal.xargs?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/tests/minimal.xargs (original)
+++ vmkit/trunk/tests/minimal.xargs Thu Apr 25 11:54:20 2013
@@ -30,4 +30,6 @@
 -istart  file:///home/koutheir/PhD/VMKit/vmkit_stale_ref/tests/plugins/ijvm.tests.CImpl_1.0.0.jar
 -istart  file:///home/koutheir/PhD/VMKit/vmkit_stale_ref/tests/plugins/ijvm.tests.DImpl_1.0.0.jar
 
--istart  file:///home/koutheir/PhD/VMKit/vmkit_stale_ref/tests/plugins/ijvm.tests.Runner_1.0.0.jar
+-install file:///home/koutheir/PhD/VMKit/vmkit_stale_ref/tests/plugins/ijvm.tests.Runner_1.0.0.jar
+
+-install file:///home/koutheir/PhD/VMKit/vmkit_stale_ref/tests/plugins/ijvm.tests.BundleMgmtStress_1.0.0.jar

Modified: vmkit/trunk/tools/precompiler/trainer/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/precompiler/trainer/Makefile?rev=180316&r1=180315&r2=180316&view=diff
==============================================================================
--- vmkit/trunk/tools/precompiler/trainer/Makefile (original)
+++ vmkit/trunk/tools/precompiler/trainer/Makefile Thu Apr 25 11:54:20 2013
@@ -24,7 +24,7 @@ endif
 
 HelloWorld.class: HelloWorld.java
 	$(Echo) "Compiling trainer"
-	$(Verb) javac $< -d .
+	$(Verb) javac -target $(JAVAC_TARGET) $< -d .
 
 generated.bc: $(PRECOMPILER) HelloWorld.class
 	$(Echo) "Pre-compiling bootstrap code"





More information about the vmkit-commits mailing list