[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