[vmkit-commits] [vmkit] r180308 - Correcting stale references problem. Testing...

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


Author: peter.senna
Date: Thu Apr 25 11:52:43 2013
New Revision: 180308

URL: http://llvm.org/viewvc/llvm-project?rev=180308&view=rev
Log:
Correcting stale references problem. Testing...
(cherry picked from commit e5d39d549b2f0b752968ff253044af9e4049a590)

Added:
    vmkit/trunk/knopflerfish.patch
    vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp
    vmkit/trunk/osgi/
    vmkit/trunk/osgi/.classpath
    vmkit/trunk/osgi/.project
    vmkit/trunk/osgi/META-INF/
    vmkit/trunk/osgi/META-INF/MANIFEST.MF
    vmkit/trunk/osgi/build.properties
    vmkit/trunk/osgi/src/
    vmkit/trunk/osgi/src/j3/
    vmkit/trunk/osgi/src/j3/J3Mgr.java
    vmkit/trunk/osgi/src/j3/vm/
    vmkit/trunk/osgi/src/j3/vm/OSGi.java
    vmkit/trunk/osgi/src/j3mgr/
    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/
    vmkit/trunk/tests/ijvm.tests.A/.classpath
    vmkit/trunk/tests/ijvm.tests.A/.project
    vmkit/trunk/tests/ijvm.tests.A/META-INF/
    vmkit/trunk/tests/ijvm.tests.A/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.tests.A/build.properties
    vmkit/trunk/tests/ijvm.tests.A/src/
    vmkit/trunk/tests/ijvm.tests.A/src/ijvm/
    vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/
    vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/A/
    vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/A/A.java
    vmkit/trunk/tests/ijvm.tests.AImpl/
    vmkit/trunk/tests/ijvm.tests.AImpl/.classpath
    vmkit/trunk/tests/ijvm.tests.AImpl/.project
    vmkit/trunk/tests/ijvm.tests.AImpl/META-INF/
    vmkit/trunk/tests/ijvm.tests.AImpl/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.tests.AImpl/build.properties
    vmkit/trunk/tests/ijvm.tests.AImpl/src/
    vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/
    vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/
    vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/
    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/
    vmkit/trunk/tests/ijvm.tests.BImpl/.classpath
    vmkit/trunk/tests/ijvm.tests.BImpl/.project
    vmkit/trunk/tests/ijvm.tests.BImpl/META-INF/
    vmkit/trunk/tests/ijvm.tests.BImpl/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.tests.BImpl/build.properties
    vmkit/trunk/tests/ijvm.tests.BImpl/src/
    vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/
    vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/
    vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/B/
    vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/B/B.java
    vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/
    vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/Activator.java
    vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/BImpl.java
    vmkit/trunk/tests/ijvm.tests.C/
    vmkit/trunk/tests/ijvm.tests.C/.classpath
    vmkit/trunk/tests/ijvm.tests.C/.project
    vmkit/trunk/tests/ijvm.tests.C/META-INF/
    vmkit/trunk/tests/ijvm.tests.C/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.tests.C/build.properties
    vmkit/trunk/tests/ijvm.tests.C/src/
    vmkit/trunk/tests/ijvm.tests.C/src/ijvm/
    vmkit/trunk/tests/ijvm.tests.C/src/ijvm/tests/
    vmkit/trunk/tests/ijvm.tests.C/src/ijvm/tests/C/
    vmkit/trunk/tests/ijvm.tests.C/src/ijvm/tests/C/C.java
    vmkit/trunk/tests/ijvm.tests.CImpl/
    vmkit/trunk/tests/ijvm.tests.CImpl/.classpath
    vmkit/trunk/tests/ijvm.tests.CImpl/.project
    vmkit/trunk/tests/ijvm.tests.CImpl/META-INF/
    vmkit/trunk/tests/ijvm.tests.CImpl/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.tests.CImpl/build.properties
    vmkit/trunk/tests/ijvm.tests.CImpl/src/
    vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/
    vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/
    vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/
    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/
    vmkit/trunk/tests/ijvm.tests.DImpl/.classpath
    vmkit/trunk/tests/ijvm.tests.DImpl/.project
    vmkit/trunk/tests/ijvm.tests.DImpl/META-INF/
    vmkit/trunk/tests/ijvm.tests.DImpl/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.tests.DImpl/build.properties
    vmkit/trunk/tests/ijvm.tests.DImpl/src/
    vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/
    vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/
    vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/D/
    vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/D/D.java
    vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/
    vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/Activator.java
    vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/DImpl.java
    vmkit/trunk/tests/ijvm.tests.Runner/
    vmkit/trunk/tests/ijvm.tests.Runner/.classpath
    vmkit/trunk/tests/ijvm.tests.Runner/.project
    vmkit/trunk/tests/ijvm.tests.Runner/META-INF/
    vmkit/trunk/tests/ijvm.tests.Runner/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.tests.Runner/build.properties
    vmkit/trunk/tests/ijvm.tests.Runner/src/
    vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/
    vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/
    vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/
    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
Modified:
    vmkit/trunk/README.TXT
    vmkit/trunk/include/vmkit/Locks.h
    vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp
    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/JnjvmStaleRef.cpp
    vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp

Modified: vmkit/trunk/README.TXT
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/README.TXT?rev=180308&r1=180307&r2=180308&view=diff
==============================================================================
--- vmkit/trunk/README.TXT (original)
+++ vmkit/trunk/README.TXT Thu Apr 25 11:52:43 2013
@@ -93,3 +93,16 @@ svn co http://llvm.org/svn/llvm-project/
 
 ./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
 make -j12 ENABLE_OPTIMIZED=0 REQUIRES_FRAME_POINTER=1 KEEP_SYMBOLS=1 DEBUG_RUNTIME=1 DEBUG_SYMBOLS=1
+
+=============
+Knopflerfish:
+=============
+
+* Apply patch:
+cd knopflerfish
+patch -p1 < ../ijvm/knopflerfish.patch
+cd ..
+
+* Recompile Knopflerfish:
+cd knopflerfish/osgi
+ant default

Modified: vmkit/trunk/include/vmkit/Locks.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/Locks.h?rev=180308&r1=180307&r2=180308&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/Locks.h (original)
+++ vmkit/trunk/include/vmkit/Locks.h Thu Apr 25 11:52:43 2013
@@ -176,6 +176,28 @@ public:
 };
 
 
+class LockGuard
+{
+protected:
+	Lock& lock;
+
+private:	//Disabled constructors
+	LockGuard();
+	LockGuard(const LockGuard&);
+
+public:
+	LockGuard(Lock& l) :
+		lock(l)
+	{
+		lock.lock();
+	}
+
+	virtual ~LockGuard()
+	{
+		lock.unlock();
+	}
+};
+
 } // end namespace vmkit
 
 #endif // VMKIT_LOCKS_H

Added: vmkit/trunk/knopflerfish.patch
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/knopflerfish.patch?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/knopflerfish.patch (added)
+++ vmkit/trunk/knopflerfish.patch Thu Apr 25 11:52:43 2013
@@ -0,0 +1,29 @@
+Index: knopflerfish/osgi/framework/src/j3/vm/OSGi.java
+===================================================================
+--- knopflerfish/osgi/framework/src/j3/vm/OSGi.java	1970-01-01 01:00:00.000000000 +0100
++++ knopflerfish/osgi/framework/src/j3/vm/OSGi.java	2012-10-27 00:08:43.000000000 +0200
+@@ -0,0 +1,6 @@
++package j3.vm;
++
++public class OSGi
++{
++	public static native void associateBundleClass(long bundleID, Class classObject);
++}
+Index: knopflerfish/osgi/framework/src/org/knopflerfish/framework/BundleClassLoader.java
+===================================================================
+--- knopflerfish/osgi/framework/src/org/knopflerfish/framework/BundleClassLoader.java	2012-10-27 02:29:49.852807353 +0200
++++ knopflerfish/osgi/framework/src/org/knopflerfish/framework/BundleClassLoader.java	2012-10-27 02:36:22.287024825 +0200
+@@ -819,9 +819,12 @@
+     }
+     Vector av = classPath.componentExists(path, onlyFirst);
+     if (av != null) {
+       try {
+-        return action.get(av, path, name, pkg, this);
++        Object cl = action.get(av, path, name, pkg, this);
++        if (cl instanceof Class)
++          j3.vm.OSGi.associateBundleClass(getBundle().getBundleId(), (Class)cl);
++        return cl;
+       } catch (IOException ioe) {
+         fwCtx.listeners.frameworkError(bpkgs.bg.bundle, ioe);
+         return null;
+       }

Modified: vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp?rev=180308&r1=180307&r2=180308&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp Thu Apr 25 11:52:43 2013
@@ -1266,6 +1266,9 @@ llvm::Function* JavaJIT::javaCompile() {
     }
   }
  
+  if (compilingMethod->name->compare("ijvm_tests_Runner_loop") == 0) {
+	  llvmFunction->dump();
+  }
   return llvmFunction;
 }
 

Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.h?rev=180308&r1=180307&r2=180308&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.h Thu Apr 25 11:52:43 2013
@@ -11,6 +11,7 @@
 #define JNJVM_JAVA_VM_H
 
 #include <vector>
+#include <map>
 
 #include "types.h"
 
@@ -351,10 +352,23 @@ public:
   ///
   void loadBootstrap();
 
+public:
+  void resetReferencesToBundle(int64_t bundleID);
   virtual void resetReferenceIfStale(const void* source, void** ref);
+
+  int64_t getClassLoaderBundleID(JnjvmClassLoader* loader);
+  JnjvmClassLoader* getBundleClassLoader(int64_t bundleID);
+  void setBundleClassLoader(int64_t bundleID, JnjvmClassLoader* loader);
+
+  typedef std::map<int64_t, JnjvmClassLoader*>	bundleClassLoadersType;
+
+protected:
   void resetReferenceIfStale(const JavaObject *source, class VMClassLoader** ref);
   void resetReferenceIfStale(const JavaObject *source, class VMStaticInstance** ref);
   void resetReferenceIfStale(const JavaObject *source, class JavaObject** ref);
+
+  vmkit::LockRecursive bundleClassLoadersLock;
+  bundleClassLoadersType bundleClassLoaders;
 };
 
 } // 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=180308&r1=180307&r2=180308&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp Thu Apr 25 11:52:43 2013
@@ -240,6 +240,24 @@ 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;

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h?rev=180308&r1=180307&r2=180308&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h Thu Apr 25 11:52:43 2013
@@ -331,6 +331,9 @@ public:
   bool isZombie() const {return zombie;}
   void markZombie(bool becomeZombie = true) {zombie = becomeZombie;}
 
+  int64_t getAssociatedBundleID();
+  void setAssociatedBundleID(int64_t newID);
+
   friend class Class;
   friend class CommonClass;
   friend class StringList;

Added: vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp (added)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp Thu Apr 25 11:52:43 2013
@@ -0,0 +1,67 @@
+
+#include <algorithm>
+
+#include "VmkitGC.h"
+#include "Jnjvm.h"
+#include "ClasspathReflect.h"
+#include "j3/jni.h"
+
+namespace j3 {
+
+JnjvmClassLoader* Jnjvm::getBundleClassLoader(int64_t bundleID)
+{
+	if (bundleID == -1) return NULL;
+	vmkit::LockGuard lg(bundleClassLoadersLock);
+
+	bundleClassLoadersType::const_iterator i = bundleClassLoaders.find(bundleID);
+	return (i == bundleClassLoaders.end()) ? NULL : i->second;
+}
+
+struct Jnjvm_getClassLoaderBundleID_finder {
+	JnjvmClassLoader* loader;
+	Jnjvm_getClassLoaderBundleID_finder(JnjvmClassLoader* l) : loader(l) {}
+	bool operator() (const Jnjvm::bundleClassLoadersType::value_type& pair) {return pair.second == loader;}
+};
+
+int64_t Jnjvm::getClassLoaderBundleID(JnjvmClassLoader* loader)
+{
+	if (loader == NULL) return -1;
+	vmkit::LockGuard lg(bundleClassLoadersLock);
+
+	bundleClassLoadersType::const_iterator
+		first = bundleClassLoaders.begin(),
+		last = bundleClassLoaders.end(),
+		i = std::find_if(first, last, Jnjvm_getClassLoaderBundleID_finder(loader));
+
+	return (i == last) ? -1 : i->first;
+}
+
+void Jnjvm::setBundleClassLoader(int64_t bundleID, JnjvmClassLoader* loader)
+{
+	if (bundleID == -1) return;
+	vmkit::LockGuard lg(bundleClassLoadersLock);
+
+	if (!loader)
+		bundleClassLoaders.erase(bundleID);
+	else
+		bundleClassLoaders[bundleID] = loader;
+}
+
+}
+
+
+using namespace j3;
+
+extern "C" void Java_j3_vm_OSGi_associateBundleClass(jlong bundleID, JavaObjectClass* classObject)
+{
+	llvm_gcroot(classObject, 0);
+
+	CommonClass* ccl = JavaObjectClass::getClass(classObject);
+	ccl->classLoader->setAssociatedBundleID(bundleID);
+}
+
+extern "C" void Java_j3_vm_OSGi_resetReferencesToBundle(jlong bundleID)
+{
+	Jnjvm* vm = JavaThread::get()->getJVM();
+	vm->resetReferencesToBundle(bundleID);
+}

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp?rev=180308&r1=180307&r2=180308&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp Thu Apr 25 11:52:43 2013
@@ -9,6 +9,16 @@ using namespace std;
 
 namespace j3 {
 
+void Jnjvm::resetReferencesToBundle(int64_t bundleID)
+{
+	JnjvmClassLoader* loader = this->getBundleClassLoader(bundleID);
+	assert(loader && "No class loader is associated with the bundle");
+
+	loader->markZombie();
+
+	vmkit::Collector::collect();
+}
+
 void Jnjvm::resetReferenceIfStale(const void* source, void** ref)
 {
 	if (!ref || !(*ref)) return;
@@ -29,6 +39,40 @@ void Jnjvm::resetReferenceIfStale(const
 	}
 }
 
+void Jnjvm::resetReferenceIfStale(const JavaObject *source, VMClassLoader** ref)
+{
+	// Don't touch fake Java objects that exist only as bridges between the
+	// Java object model and the C++ object model.
+
+#if DEBUG_VERBOSE_STALE_REF
+
+	JnjvmClassLoader* loader = (**ref).getClassLoader();
+	if (!loader->isZombie()) return;
+
+	cerr << "WARNING: Ignored stale reference ref=" << ref << " obj=" << **ref;
+	if (source) cerr << " source=" << *source;
+	cerr << endl;
+
+#endif
+}
+
+void Jnjvm::resetReferenceIfStale(const JavaObject *source, VMStaticInstance** ref)
+{
+	// Don't touch fake Java objects that exist only as bridges between the
+	// Java object model and the C++ object model.
+
+#if DEBUG_VERBOSE_STALE_REF
+
+	JnjvmClassLoader* loader = (**ref).getOwningClass()->classLoader;
+	if (!loader->isZombie()) return;
+
+	cerr << "WARNING: Ignored stale reference ref=" << ref << " obj=" << **ref;
+	if (source) cerr << " source=" << *source;
+	cerr << endl;
+
+#endif
+}
+
 void Jnjvm::resetReferenceIfStale(const JavaObject *source, JavaObject** ref)
 {
 #if DEBUG_VERBOSE_STALE_REF
@@ -69,38 +113,4 @@ void Jnjvm::resetReferenceIfStale(const
 	*ref = NULL;	// Reset the reference
 }
 
-void Jnjvm::resetReferenceIfStale(const JavaObject *source, VMClassLoader** ref)
-{
-	// Don't touch fake Java objects that exist only as bridges between the
-	// Java object model and the C++ object model.
-
-#if DEBUG_VERBOSE_STALE_REF
-
-	JnjvmClassLoader* loader = (**ref).getClassLoader();
-	if (!loader->isZombie()) return;
-
-	cerr << "WARNING: Ignored stale reference ref=" << ref << " obj=" << **ref;
-	if (source) cerr << " source=" << *source;
-	cerr << endl;
-
-#endif
-}
-
-void Jnjvm::resetReferenceIfStale(const JavaObject *source, VMStaticInstance** ref)
-{
-	// Don't touch fake Java objects that exist only as bridges between the
-	// Java object model and the C++ object model.
-
-#if DEBUG_VERBOSE_STALE_REF
-
-	JnjvmClassLoader* loader = (**ref).getOwningClass()->classLoader;
-	if (!loader->isZombie()) return;
-
-	cerr << "WARNING: Ignored stale reference ref=" << ref << " obj=" << **ref;
-	if (source) cerr << " source=" << *source;
-	cerr << endl;
-
-#endif
-}
-
 }

Modified: vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp?rev=180308&r1=180307&r2=180308&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp Thu Apr 25 11:52:43 2013
@@ -187,8 +187,8 @@ void Class::tracer(word_t closure) {
   for (uint32 i = 0; i < NR_ISOLATES; ++i) {
     TaskClassMirror &M = IsolateInfo[i];
     if (M.staticInstance != NULL) {
-      for (uint32 i = 0; i < nbStaticFields; ++i) {
-        JavaField& field = staticFields[i];
+      for (uint32 j = 0; j < nbStaticFields; ++j) {
+        JavaField& field = staticFields[j];
         if (field.isReference()) {
           JavaObject** ptr = field.getStaticObjectFieldPtr();
           vmkit::Collector::markAndTraceRoot(delegatee[i], ptr, closure);

Added: vmkit/trunk/osgi/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/osgi/.classpath?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/osgi/.classpath (added)
+++ vmkit/trunk/osgi/.classpath Thu Apr 25 11:52:43 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/osgi/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/osgi/.project?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/osgi/.project (added)
+++ vmkit/trunk/osgi/.project Thu Apr 25 11:52:43 2013
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>j3mgr</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/osgi/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/osgi/META-INF/MANIFEST.MF?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/osgi/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/osgi/META-INF/MANIFEST.MF Thu Apr 25 11:52:43 2013
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: J3 Virtual Machine Manager
+Bundle-SymbolicName: j3mgr;singleton:=true
+Bundle-Version: 1.0.0
+Bundle-Activator: j3mgr.Activator
+Import-Package: org.osgi.framework;version="1.3.0",
+ org.osgi.service.packageadmin;version="1.0.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: j3

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

Added: vmkit/trunk/osgi/src/j3/J3Mgr.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/osgi/src/j3/J3Mgr.java?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/osgi/src/j3/J3Mgr.java (added)
+++ vmkit/trunk/osgi/src/j3/J3Mgr.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,13 @@
+package j3;
+
+import org.osgi.framework.Bundle;
+
+public interface J3Mgr
+{
+	public void resetReferencesToBundle(Bundle bundle) throws Exception;
+	
+	// THE FOLLOWING METHODS ARE DEBUGGING HELPERS
+	// THEY SHOULD BE REMOVED IN PRODUCTION
+	
+	public void resetReferencesToBundle(String bundleName) throws Exception;
+}

Added: vmkit/trunk/osgi/src/j3/vm/OSGi.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/osgi/src/j3/vm/OSGi.java?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/osgi/src/j3/vm/OSGi.java (added)
+++ vmkit/trunk/osgi/src/j3/vm/OSGi.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,7 @@
+package j3.vm;
+
+public class OSGi
+{
+	public static native void associateBundleClass(long bundleID, Class classObject);
+	public static native void resetReferencesToBundle(long bundleID);
+}

Added: vmkit/trunk/osgi/src/j3mgr/Activator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/osgi/src/j3mgr/Activator.java?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/osgi/src/j3mgr/Activator.java (added)
+++ vmkit/trunk/osgi/src/j3mgr/Activator.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,32 @@
+package j3mgr;
+
+import j3.J3Mgr;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator
+	implements BundleActivator
+{
+	J3MgrImpl mgr;
+
+	public void start(BundleContext bundleContext) throws Exception
+	{
+		System.out.println("J3MgrImpl exports and provides J3Mgr");
+
+		mgr = new J3MgrImpl();
+		mgr.open(bundleContext);
+		
+		bundleContext.registerService(J3Mgr.class.getName(), mgr, null);
+	}
+
+	public void stop(BundleContext bundleContext) throws Exception
+	{
+		System.out.println("J3MgrImpl no more provides J3Mgr");
+
+		if (mgr != null) {
+			mgr.close();
+			mgr = null;
+		}
+	}
+}

Added: vmkit/trunk/osgi/src/j3mgr/J3MgrImpl.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/osgi/src/j3mgr/J3MgrImpl.java?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/osgi/src/j3mgr/J3MgrImpl.java (added)
+++ vmkit/trunk/osgi/src/j3mgr/J3MgrImpl.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,89 @@
+package j3mgr;
+
+import j3.J3Mgr;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+public class J3MgrImpl
+	implements J3Mgr, FrameworkListener
+{
+	BundleContext context;
+	long bundleToKill;
+
+	public J3MgrImpl()
+	{
+		bundleToKill = -1;
+	}
+	
+	public void open(BundleContext bundleContext)
+	{
+		context = bundleContext;
+		
+		// We need to know when packages are refreshed
+		context.addFrameworkListener(this);
+	}
+
+	public void close()
+	{
+		context.removeFrameworkListener(this);
+		context = 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();
+
+		System.out.println("Refreshing framework...");
+		refreshFramework(bundle);
+	}
+	
+	void refreshFramework(Bundle bundle)
+	{
+		ServiceReference<?> pkgAdminRef = (ServiceReference<?>)context.getServiceReference(
+			"org.osgi.service.packageadmin.PackageAdmin");
+		PackageAdmin pkgAdmin = (PackageAdmin)context.getService(pkgAdminRef);
+		pkgAdmin.refreshPackages(new Bundle[] {bundle});		
+	}
+
+	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);
+		
+		bundleToKill = -1;
+	}
+	
+	// THE FOLLOWING METHODS ARE DEBUGGING HELPERS
+	// THEY SHOULD BE REMOVED IN PRODUCTION
+	
+	public void resetReferencesToBundle(String bundleName) throws Exception
+	{
+		resetReferencesToBundle(getBundle(bundleName));
+	}
+
+	Bundle getBundle(String symbolicName)
+	{
+		Bundle[] bundles = context.getBundles();
+		for (int i=0; i < bundles.length; ++i) {
+			if (symbolicName.equals(bundles[i].getSymbolicName()))
+				return bundles[i];
+		}
+		return null;
+	}
+}

Added: vmkit/trunk/tests/debug.txt
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/debug.txt?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/debug.txt (added)
+++ vmkit/trunk/tests/debug.txt Thu Apr 25 11:52:43 2013
@@ -0,0 +1,3 @@
+framework call j3.J3Mgr resetReferencesToBundle ijvm.tests.AImpl
+
+framework meminfo -gc

Added: vmkit/trunk/tests/ijvm.tests.A/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.A/.classpath?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.A/.classpath (added)
+++ vmkit/trunk/tests/ijvm.tests.A/.classpath Thu Apr 25 11:52:43 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.A/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.A/.project?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.A/.project (added)
+++ vmkit/trunk/tests/ijvm.tests.A/.project Thu Apr 25 11:52:43 2013
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.tests.A</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.A/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.A/META-INF/MANIFEST.MF?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.A/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.tests.A/META-INF/MANIFEST.MF Thu Apr 25 11:52:43 2013
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: A
+Bundle-SymbolicName: ijvm.tests.A;singleton:=true
+Bundle-Version: 1.0.0
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: ijvm.tests.A

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

Added: 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=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/A/A.java (added)
+++ vmkit/trunk/tests/ijvm.tests.A/src/ijvm/tests/A/A.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,6 @@
+package ijvm.tests.A;
+
+public interface A
+{
+	public void performA();
+}

Added: vmkit/trunk/tests/ijvm.tests.AImpl/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.AImpl/.classpath?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.AImpl/.classpath (added)
+++ vmkit/trunk/tests/ijvm.tests.AImpl/.classpath Thu Apr 25 11:52:43 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.AImpl/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.AImpl/.project?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.AImpl/.project (added)
+++ vmkit/trunk/tests/ijvm.tests.AImpl/.project Thu Apr 25 11:52:43 2013
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.tests.AImpl</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.AImpl/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.AImpl/META-INF/MANIFEST.MF?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.AImpl/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.tests.AImpl/META-INF/MANIFEST.MF Thu Apr 25 11:52:43 2013
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: A Implementation
+Bundle-SymbolicName: ijvm.tests.AImpl
+Bundle-Version: 1.0.0
+Bundle-Activator: ijvm.tests.AImpl.Activator
+Import-Package: ijvm.tests.A,
+ ijvm.tests.C,
+ 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.AImpl/build.properties
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.AImpl/build.properties?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.AImpl/build.properties (added)
+++ vmkit/trunk/tests/ijvm.tests.AImpl/build.properties Thu Apr 25 11:52:43 2013
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .

Added: 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=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/AImpl.java (added)
+++ vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/AImpl.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,12 @@
+package ijvm.tests.AImpl;
+
+import ijvm.tests.A.A;
+
+public class AImpl
+	implements A
+{
+	public void performA()
+	{
+		System.out.println("AImpl.performA");
+	}
+}

Added: 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=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/Activator.java (added)
+++ vmkit/trunk/tests/ijvm.tests.AImpl/src/ijvm/tests/AImpl/Activator.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,82 @@
+package ijvm.tests.AImpl;
+
+import java.util.ArrayList;
+
+import ijvm.tests.A.A;
+import ijvm.tests.C.C;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator
+	implements BundleActivator, ServiceListener
+{
+	private BundleContext context;
+	private ServiceTracker cST;
+	private ArrayList<C> c;
+	private A a;
+
+	public Activator()
+	{
+		c = new ArrayList<C>();
+	}
+
+	public void start(BundleContext bundleContext) throws Exception
+	{
+		System.out.println("AImpl provides A");
+		context = bundleContext;
+
+		cST = new ServiceTracker(context, C.class.getName(), null);
+		cST.open();
+		
+		C service = (C)cST.getService();
+		if (service != null)
+			c.add(service);
+		
+		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);	
+	}
+
+	public void stop(BundleContext bundleContext) throws Exception
+	{
+		System.out.println("AImpl no more provides A");
+		
+		context.removeServiceListener(this);
+		context = null;
+
+		System.out.println("AImpl lost C but keeps a stale reference to it");
+		cST.close();
+		cST = null;
+		// c = null;
+		
+		a = null;
+	}
+
+	public void serviceChanged(ServiceEvent event)
+	{
+		Object service = context.getService(event.getServiceReference());
+		
+		switch(event.getType()) {
+		case ServiceEvent.REGISTERED:
+			if (C.class.isInstance(service)) {
+				System.out.println("AImpl got C");
+				c.add((C)service);
+			}
+			break;
+			
+		case ServiceEvent.UNREGISTERING:
+			if (C.class.isInstance(service)) {
+				System.out.println("AImpl lost C but keeps a stale reference to it");
+			}
+			break;
+		}
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.BImpl/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.BImpl/.classpath?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.BImpl/.classpath (added)
+++ vmkit/trunk/tests/ijvm.tests.BImpl/.classpath Thu Apr 25 11:52:43 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.BImpl/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.BImpl/.project?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.BImpl/.project (added)
+++ vmkit/trunk/tests/ijvm.tests.BImpl/.project Thu Apr 25 11:52:43 2013
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.tests.BImpl</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.BImpl/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.BImpl/META-INF/MANIFEST.MF?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.BImpl/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.tests.BImpl/META-INF/MANIFEST.MF Thu Apr 25 11:52:43 2013
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: B Implementation
+Bundle-SymbolicName: ijvm.tests.BImpl
+Bundle-Version: 1.0.0
+Bundle-Activator: ijvm.tests.BImpl.Activator
+Import-Package: ijvm.tests.A,
+ org.osgi.framework;version="1.3.0",
+ org.osgi.util.tracker;version="1.0.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: ijvm.tests.B

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

Added: vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/B/B.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/B/B.java?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/B/B.java (added)
+++ vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/B/B.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,6 @@
+package ijvm.tests.B;
+
+public interface B
+{
+	public void performB();
+}

Added: 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=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/Activator.java (added)
+++ vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/Activator.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,83 @@
+package ijvm.tests.BImpl;
+
+import java.util.ArrayList;
+
+import ijvm.tests.A.A;
+import ijvm.tests.B.B;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator
+	implements BundleActivator, ServiceListener
+{
+	private BundleContext context;
+
+	private ServiceTracker aST;
+	private ArrayList<A> a;
+	private BImpl b;
+	
+	public Activator()
+	{
+		a = new ArrayList<A>();
+	}
+
+	public void start(BundleContext bundleContext) throws Exception
+	{
+		System.out.println("BImpl exports and provides B");
+		context = bundleContext;
+
+		aST = new ServiceTracker(context, A.class.getName(), null);
+		aST.open();
+		
+		A service = (A)aST.getService();
+		if (service != null)
+			a.add(service);
+		
+		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);
+	}
+
+	public void stop(BundleContext bundleContext) throws Exception
+	{
+		System.out.println("BImpl no more provides B");
+
+		context.removeServiceListener(this);
+		context = null;
+		
+		System.out.println("BImpl lost A but keeps a stale reference to it");
+		aST.close();
+		aST = null;
+		// a = null;
+		
+		b = null;
+	}
+
+	public void serviceChanged(ServiceEvent event)
+	{
+		Object service = context.getService(event.getServiceReference());
+		
+		switch(event.getType()) {
+		case ServiceEvent.REGISTERED:
+			if (A.class.isInstance(service)) {
+				System.out.println("BImpl got A");
+				a.add((A)service);
+			}
+			break;
+			
+		case ServiceEvent.UNREGISTERING:
+			if (A.class.isInstance(service)) {
+				System.out.println("BImpl lost A but keeps a stale reference to it");
+			}
+			break;
+		}
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/BImpl.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/BImpl.java?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/BImpl.java (added)
+++ vmkit/trunk/tests/ijvm.tests.BImpl/src/ijvm/tests/BImpl/BImpl.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,12 @@
+package ijvm.tests.BImpl;
+
+import ijvm.tests.B.B;
+
+public class BImpl
+	implements B
+{
+	public void performB()
+	{
+		System.out.println("BImpl.performB");
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.C/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.C/.classpath?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.C/.classpath (added)
+++ vmkit/trunk/tests/ijvm.tests.C/.classpath Thu Apr 25 11:52:43 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.C/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.C/.project?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.C/.project (added)
+++ vmkit/trunk/tests/ijvm.tests.C/.project Thu Apr 25 11:52:43 2013
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.tests.C</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.C/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.C/META-INF/MANIFEST.MF?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.C/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.tests.C/META-INF/MANIFEST.MF Thu Apr 25 11:52:43 2013
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: C
+Bundle-SymbolicName: ijvm.tests.C
+Bundle-Version: 1.0.0
+Import-Package: org.osgi.framework;version="1.3.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: ijvm.tests.C

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

Added: 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=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.C/src/ijvm/tests/C/C.java (added)
+++ vmkit/trunk/tests/ijvm.tests.C/src/ijvm/tests/C/C.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,6 @@
+package ijvm.tests.C;
+
+public interface C
+{
+	public void performC();
+}

Added: vmkit/trunk/tests/ijvm.tests.CImpl/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.CImpl/.classpath?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.CImpl/.classpath (added)
+++ vmkit/trunk/tests/ijvm.tests.CImpl/.classpath Thu Apr 25 11:52:43 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.CImpl/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.CImpl/.project?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.CImpl/.project (added)
+++ vmkit/trunk/tests/ijvm.tests.CImpl/.project Thu Apr 25 11:52:43 2013
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.tests.CImpl</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.CImpl/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.CImpl/META-INF/MANIFEST.MF?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.CImpl/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.tests.CImpl/META-INF/MANIFEST.MF Thu Apr 25 11:52:43 2013
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: C Implementation
+Bundle-SymbolicName: ijvm.tests.CImpl
+Bundle-Version: 1.0.0
+Bundle-Activator: ijvm.tests.CImpl.Activator
+Import-Package: ijvm.tests.B,
+ ijvm.tests.C,
+ 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.CImpl/build.properties
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.CImpl/build.properties?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.CImpl/build.properties (added)
+++ vmkit/trunk/tests/ijvm.tests.CImpl/build.properties Thu Apr 25 11:52:43 2013
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .

Added: 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=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/Activator.java (added)
+++ vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/Activator.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,83 @@
+package ijvm.tests.CImpl;
+
+import java.util.ArrayList;
+
+import ijvm.tests.B.B;
+import ijvm.tests.C.C;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator
+	implements BundleActivator, ServiceListener
+{
+	private BundleContext context;
+
+	private ServiceTracker bST;
+	private ArrayList<B> b;
+	private CImpl c;
+	
+	public Activator()
+	{
+		b = new ArrayList<B>();
+	}
+
+	public void start(BundleContext bundleContext) throws Exception
+	{
+		System.out.println("CImpl exports and provides C");
+		context = bundleContext;
+
+		bST = new ServiceTracker(context, B.class.getName(), null);
+		bST.open();
+		
+		B service = (B)bST.getService();
+		if (service != null)
+			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);
+	}
+
+	public void stop(BundleContext bundleContext) throws Exception
+	{
+		System.out.println("CImpl no more provides C");
+
+		context.removeServiceListener(this);
+		context = null;
+		
+		System.out.println("CImpl lost B but keeps a stale reference to it");
+		bST.close();
+		bST = null;
+		// b = null;
+		
+		c = null;
+	}
+
+	public void serviceChanged(ServiceEvent event)
+	{
+		Object service = context.getService(event.getServiceReference());
+		
+		switch(event.getType()) {
+		case ServiceEvent.REGISTERED:
+			if (B.class.isInstance(service)) {
+				System.out.println("CImpl got B");
+				b.add((B)service);
+			}
+			break;
+			
+		case ServiceEvent.UNREGISTERING:
+			if (B.class.isInstance(service)) {
+				System.out.println("CImpl lost B but keeps a stale reference to it");
+			}
+			break;
+		}
+	}
+}

Added: 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=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/CImpl.java (added)
+++ vmkit/trunk/tests/ijvm.tests.CImpl/src/ijvm/tests/CImpl/CImpl.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,12 @@
+package ijvm.tests.CImpl;
+
+import ijvm.tests.C.C;
+
+public class CImpl
+	implements C
+{
+	public void performC()
+	{
+		System.out.println("CImpl.performC");
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.DImpl/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.DImpl/.classpath?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.DImpl/.classpath (added)
+++ vmkit/trunk/tests/ijvm.tests.DImpl/.classpath Thu Apr 25 11:52:43 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.DImpl/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.DImpl/.project?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.DImpl/.project (added)
+++ vmkit/trunk/tests/ijvm.tests.DImpl/.project Thu Apr 25 11:52:43 2013
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.tests.DImpl</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.DImpl/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.DImpl/META-INF/MANIFEST.MF?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.DImpl/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.tests.DImpl/META-INF/MANIFEST.MF Thu Apr 25 11:52:43 2013
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: D Implementation
+Bundle-SymbolicName: ijvm.tests.DImpl
+Bundle-Version: 1.0.0
+Bundle-Activator: ijvm.tests.DImpl.Activator
+Import-Package: ijvm.tests.C,
+ org.osgi.framework;version="1.3.0",
+ org.osgi.util.tracker;version="1.0.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: ijvm.tests.D

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

Added: vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/D/D.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/D/D.java?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/D/D.java (added)
+++ vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/D/D.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,6 @@
+package ijvm.tests.D;
+
+public interface D
+{
+	public void performD();
+}

Added: 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=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/Activator.java (added)
+++ vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/Activator.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,83 @@
+package ijvm.tests.DImpl;
+
+import java.util.ArrayList;
+
+import ijvm.tests.C.C;
+import ijvm.tests.D.D;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator
+	implements BundleActivator, ServiceListener
+{
+	private BundleContext context;
+
+	private ServiceTracker cST;
+	private ArrayList<C> c;
+	private DImpl d;
+	
+	public Activator()
+	{
+		c = new ArrayList<C>();
+	}
+
+	public void start(BundleContext bundleContext) throws Exception
+	{
+		System.out.println("DImpl exports and provides D");
+		context = bundleContext;
+
+		cST = new ServiceTracker(context, C.class.getName(), null);
+		cST.open();
+		
+		C service = (C)cST.getService();
+		if (service != null)
+			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);
+	}
+
+	public void stop(BundleContext bundleContext) throws Exception
+	{
+		System.out.println("DImpl no more provides D");
+
+		context.removeServiceListener(this);
+		context = null;
+		
+		System.out.println("DImpl lost C but keeps a stale reference to it");
+		cST.close();
+		cST = null;
+		// c = null;
+		
+		d = null;
+	}
+
+	public void serviceChanged(ServiceEvent event)
+	{
+		Object service = context.getService(event.getServiceReference());
+		
+		switch(event.getType()) {
+		case ServiceEvent.REGISTERED:
+			if (C.class.isInstance(service)) {
+				System.out.println("DImpl got C");
+				c.add((C)service);
+			}
+			break;
+			
+		case ServiceEvent.UNREGISTERING:
+			if (C.class.isInstance(service)) {
+				System.out.println("DImpl lost C but keeps a stale reference to it");
+			}
+			break;
+		}
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/DImpl.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/DImpl.java?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/DImpl.java (added)
+++ vmkit/trunk/tests/ijvm.tests.DImpl/src/ijvm/tests/DImpl/DImpl.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,12 @@
+package ijvm.tests.DImpl;
+
+import ijvm.tests.D.D;
+
+public class DImpl
+	implements D
+{
+	public void performD()
+	{
+		System.out.println("DImpl.performB");
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.Runner/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.Runner/.classpath?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.Runner/.classpath (added)
+++ vmkit/trunk/tests/ijvm.tests.Runner/.classpath Thu Apr 25 11:52:43 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.Runner/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.Runner/.project?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.Runner/.project (added)
+++ vmkit/trunk/tests/ijvm.tests.Runner/.project Thu Apr 25 11:52:43 2013
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.tests.Runner</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.Runner/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.Runner/META-INF/MANIFEST.MF?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.Runner/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.tests.Runner/META-INF/MANIFEST.MF Thu Apr 25 11:52:43 2013
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Runner
+Bundle-SymbolicName: ijvm.tests.Runner
+Bundle-Version: 1.0.0
+Bundle-Activator: ijvm.tests.Runner.Activator
+Import-Package: ijvm.tests.A,
+ 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.Runner/build.properties
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.Runner/build.properties?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.Runner/build.properties (added)
+++ vmkit/trunk/tests/ijvm.tests.Runner/build.properties Thu Apr 25 11:52:43 2013
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .

Added: 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=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/Activator.java (added)
+++ vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/Activator.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,68 @@
+package ijvm.tests.Runner;
+
+import ijvm.tests.A.A;
+
+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
+{
+	private BundleContext context;
+	private ServiceTracker aST;
+	private A a;
+	private Runner runner1, runner2;
+	private Thread runnerThread1, runnerThread2, cancellerThread;
+
+	public void start(BundleContext bundleContext) throws Exception
+	{
+		System.out.println("Started runner bundle.");
+		context = bundleContext;
+		
+		aST = new ServiceTracker(context, A.class.getName(), null);
+		aST.open();
+		
+		a = (A)aST.getService();
+		if (a == null) {
+			aST.close();
+			aST = null;
+			
+			throw new BundleException("Runner bundle could not get A @ startup");
+		}
+		System.out.println("Runner bundle got A @ startup.");
+
+		runnerThread1 = new Thread(runner1 = new Runner(a), "Runner 1");
+		runnerThread2 = new Thread(runner2 = new Runner(a), "Runner 2");
+		runnerThread1.start();
+		runnerThread2.start();
+		
+		cancellerThread = new Thread(this, "Runner Canceller");
+		cancellerThread.start();
+	}
+
+	public void stop(BundleContext bundleContext) throws Exception
+	{
+		System.out.println("Stopped runner bundle.");
+		
+		context = null;
+		
+		System.out.println("Runner bundle lost A but keeps a stale reference to it");
+		aST.close();
+		aST = null;
+		// a = null;
+		
+//		runner.join();
+	}
+
+	public void run()
+	{
+		try {
+			Thread.sleep(5000);
+			runner1.cancel();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}

Added: 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=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/Runner.java (added)
+++ vmkit/trunk/tests/ijvm.tests.Runner/src/ijvm/tests/Runner/Runner.java Thu Apr 25 11:52:43 2013
@@ -0,0 +1,64 @@
+package ijvm.tests.Runner;
+
+public class Runner
+	implements Runnable
+{
+	private Object obj;
+	private static boolean sleeping;
+	private boolean cancelRunning;
+	
+	{
+		sleeping = false;
+	}
+	
+	public Runner(Object o)
+	{
+		cancelRunning = false;
+		obj = o;
+	}
+	
+	public void cancel()
+	{
+		cancelRunning = false;
+	}
+	
+	public void run()
+	{
+		System.out.println("Started runner thread: " + Thread.currentThread().getName());
+		
+		try {
+			while (!cancelRunning) {
+				long delay = 2000 + (long)(Math.random() * 1000.0);
+				
+				ijvm_tests_Runner_loop(delay);
+				
+				Thread.sleep(200);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		
+		System.out.println("Stopped runner thread: " + Thread.currentThread().getName());
+	}
+	
+	void ijvm_tests_Runner_loop(long delay) throws Exception
+	{
+		synchronized(obj) {
+			iteration(delay);
+		}
+	}
+	
+	void iteration(long delay) throws Exception
+	{
+		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();
+	}
+}

Added: vmkit/trunk/tests/minimal.xargs
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/minimal.xargs?rev=180308&view=auto
==============================================================================
--- vmkit/trunk/tests/minimal.xargs (added)
+++ vmkit/trunk/tests/minimal.xargs Thu Apr 25 11:52:43 2013
@@ -0,0 +1,33 @@
+-Dorg.knopflerfish.framework.main.verbosity=0
+-Dorg.knopflerfish.gosg.jars=file:jars/
+-Forg.knopflerfish.framework.debug.errors=true
+-Forg.knopflerfish.framework.debug.packages=false
+-Forg.knopflerfish.framework.debug.classloader=false
+-Forg.osgi.framework.system.packages.extra=
+
+-Forg.knopflerfish.startlevel.use=true
+
+-init
+
+-install log/log_api-3.1.2.jar
+-install console/console_api-3.0.3.jar
+-istart  cm/cm_api-3.0.4.jar
+-istart  log/log-3.1.2.jar
+-istart  console/console-3.0.3.jar
+-istart  consoletty/consoletty-3.0.1.jar
+-istart  frameworkcommands/frameworkcommands-3.1.0.jar
+-istart  logcommands/logcommands-3.1.1.jar
+-istart  useradmin/useradmin_api-3.0.2.jar
+
+-launch
+
+-istart  file:///home/koutheir/PhD/VMKit/vmkit_stale_ref/tests/plugins/j3mgr_1.0.0.jar
+
+-istart  file:///home/koutheir/PhD/VMKit/vmkit_stale_ref/tests/plugins/ijvm.tests.A_1.0.0.jar
+-istart  file:///home/koutheir/PhD/VMKit/vmkit_stale_ref/tests/plugins/ijvm.tests.C_1.0.0.jar
+-istart  file:///home/koutheir/PhD/VMKit/vmkit_stale_ref/tests/plugins/ijvm.tests.AImpl_1.0.0.jar
+-istart  file:///home/koutheir/PhD/VMKit/vmkit_stale_ref/tests/plugins/ijvm.tests.BImpl_1.0.0.jar
+-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





More information about the vmkit-commits mailing list