[vmkit-commits] [vmkit] r180553 - Working on bundle update in Incinerator.

Peter Senna Tschudin peter.senna at gmail.com
Thu Apr 25 10:24:20 PDT 2013


Author: peter.senna
Date: Thu Apr 25 12:22:49 2013
New Revision: 180553

URL: http://llvm.org/viewvc/llvm-project?rev=180553&view=rev
Log:
Working on bundle update in Incinerator.
(cherry picked from commit baa4d86db903c8a8455977d2ebbc853b93b4953c)

Modified:
    vmkit/trunk/incinerator/osgi/src/j3/vm/OSGi.java
    vmkit/trunk/incinerator/osgi/src/j3mgr/J3MgrImpl.java
    vmkit/trunk/incinerator/tests/debug.txt
    vmkit/trunk/incinerator/tests/minimal.xargs
    vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/j3/VMCore/Jnjvm.h
    vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp
    vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp

Modified: vmkit/trunk/incinerator/osgi/src/j3/vm/OSGi.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/incinerator/osgi/src/j3/vm/OSGi.java?rev=180553&r1=180552&r2=180553&view=diff
==============================================================================
--- vmkit/trunk/incinerator/osgi/src/j3/vm/OSGi.java (original)
+++ vmkit/trunk/incinerator/osgi/src/j3/vm/OSGi.java Thu Apr 25 12:22:49 2013
@@ -5,6 +5,7 @@ public class OSGi
 	// OSGi hooks and information gathering
 	public static native void associateBundleClass(long bundleID, Class classObject);
     public static native void notifyBundleUninstalled(long bundleID);
+    public static native void notifyBundleUpdated(long bundleID);
     
     public static native long[] getReferencesToObject(long objectPointer);
     public static native String dumpObject(long objectPointer);

Modified: vmkit/trunk/incinerator/osgi/src/j3mgr/J3MgrImpl.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/incinerator/osgi/src/j3mgr/J3MgrImpl.java?rev=180553&r1=180552&r2=180553&view=diff
==============================================================================
--- vmkit/trunk/incinerator/osgi/src/j3mgr/J3MgrImpl.java (original)
+++ vmkit/trunk/incinerator/osgi/src/j3mgr/J3MgrImpl.java Thu Apr 25 12:22:49 2013
@@ -52,12 +52,18 @@ public class J3MgrImpl
 
 	public void bundleChanged(BundleEvent event)
 	{
-		if (event.getType() != BundleEvent.UNINSTALLED) return;
-		
-		try {
-			j3.vm.OSGi.notifyBundleUninstalled(event.getBundle().getBundleId());
-			refreshFramework();
-		} catch (Throwable e) {}
+		int type = event.getType();
+		if (type == BundleEvent.UNINSTALLED) {
+			try {
+				refreshFramework();
+				j3.vm.OSGi.notifyBundleUninstalled(event.getBundle().getBundleId());
+			} catch (Throwable e) {}
+		} else if (type == BundleEvent.UPDATED) {
+			try {
+				refreshFramework();
+				j3.vm.OSGi.notifyBundleUpdated(event.getBundle().getBundleId());
+			} catch (Throwable e) {}
+		}
 	}
 	
 	void refreshFramework()

Modified: vmkit/trunk/incinerator/tests/debug.txt
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/incinerator/tests/debug.txt?rev=180553&r1=180552&r2=180553&view=diff
==============================================================================
--- vmkit/trunk/incinerator/tests/debug.txt (original)
+++ vmkit/trunk/incinerator/tests/debug.txt Thu Apr 25 12:22:49 2013
@@ -13,12 +13,16 @@ stop 12
 framework call j3.J3Mgr isBundleStaleReferenceCorrected 39
 framework call j3.J3Mgr setBundleStaleReferenceCorrected 8 yes
 
+enter framework
+call j3.J3Mgr isBundleStaleReferenceCorrected 14
+call j3.J3Mgr setBundleStaleReferenceCorrected 14 yes
+update 14
+
 call j3.J3Mgr dumpClassLoaderBundles
 
-enter framework
 stop 8
 uninstall 8
 refresh
 meminfo -gc
-call j3.J3Mgr setBundleStaleReferenceCorrected 8 yes
+call j3.J3Mgr setBundleStaleReferenceCorrected 14 yes
 call j3.J3Mgr dumpReferencesToObject 0x51934ab4

Modified: vmkit/trunk/incinerator/tests/minimal.xargs
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/incinerator/tests/minimal.xargs?rev=180553&r1=180552&r2=180553&view=diff
==============================================================================
--- vmkit/trunk/incinerator/tests/minimal.xargs (original)
+++ vmkit/trunk/incinerator/tests/minimal.xargs Thu Apr 25 12:22:49 2013
@@ -39,12 +39,12 @@
 
 -istart  j3mgr_1.0.0.jar
 
--install  ijvm.tests.A_1.0.0.jar
--install  ijvm.tests.C_1.0.0.jar
--install  ijvm.tests.AImpl_1.0.0.jar
--install  ijvm.tests.BImpl_1.0.0.jar
--install  ijvm.tests.CImpl_1.0.0.jar
--install  ijvm.tests.DImpl_1.0.0.jar
+-istart  ijvm.tests.A_1.0.0.jar
+-istart  ijvm.tests.C_1.0.0.jar
+-istart  ijvm.tests.AImpl_1.0.0.jar
+-istart  ijvm.tests.BImpl_1.0.0.jar
+-istart  ijvm.tests.CImpl_1.0.0.jar
+-istart  ijvm.tests.DImpl_1.0.0.jar
 
 -install ijvm.tests.Runner_1.0.0.jar
 

Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp?rev=180553&r1=180552&r2=180553&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp Thu Apr 25 12:22:49 2013
@@ -1352,7 +1352,7 @@ Jnjvm::Jnjvm(vmkit::BumpPtrAllocator& Al
              JnjvmBootstrapLoader* loader) : 
   VirtualMachine(Alloc, frames), lockSystem(Alloc)
 #if RESET_STALE_REFERENCES
-	, scanStaleReferences(false), findReferencesToObject(NULL)
+	, scanStaleReferences(false) //, findReferencesToObject(NULL)
 #endif
 {
 
@@ -1401,8 +1401,8 @@ void Jnjvm::startCollection() {
 
 #endif
 
-	if (findReferencesToObject != NULL)
-		foundReferencerObjects.clear();
+//	if (findReferencesToObject != NULL)
+//		foundReferencerObjects.clear();
 
 #endif
 
@@ -1425,7 +1425,7 @@ void Jnjvm::endCollectionBeforeUnlocking
 
 	// Stale references can no more exist, until a bundle is uninstalled later.
 	scanStaleReferences = false;
-	findReferencesToObject = NULL;
+//	findReferencesToObject = NULL;
 
 #endif
 }

Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.h?rev=180553&r1=180552&r2=180553&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.h Thu Apr 25 12:22:49 2013
@@ -12,6 +12,7 @@
 
 #include <vector>
 #include <map>
+#include <list>
 
 #include "types.h"
 
@@ -369,18 +370,23 @@ public:
 #if RESET_STALE_REFERENCES
 
 public:
+  typedef std::list<JnjvmClassLoader*>				classLoadersListType;
+  typedef std::map<int64_t, classLoadersListType>	bundleClassLoadersType;
+
   void setBundleStaleReferenceCorrected(int64_t bundleID, bool corrected);
   bool isBundleStaleReferenceCorrected(int64_t bundleID);
+  void dumpClassLoaders(const classLoadersListType& class_loaders);
+  void dumpBundleClassLoaders(int64_t bundleID);
   void dumpClassLoaderBundles();
-  class ArrayLong* getReferencesToObject(const JavaObject* obj);
+//  class ArrayLong* getReferencesToObject(const JavaObject* obj);
 
   void notifyBundleUninstalled(int64_t bundleID);
+  void notifyBundleUpdated(int64_t bundleID);
 
   int64_t getClassLoaderBundleID(JnjvmClassLoader* loader);
-  JnjvmClassLoader* getBundleClassLoader(int64_t bundleID);
-  void setBundleClassLoader(int64_t bundleID, JnjvmClassLoader* loader);
-
-  typedef std::map<int64_t, JnjvmClassLoader*>	bundleClassLoadersType;
+  void getBundleClassLoaders(int64_t bundleID, classLoadersListType& class_loaders);
+  void addBundleClassLoader(int64_t bundleID, JnjvmClassLoader* loader);
+  void removeClassLoaderFromBundles(JnjvmClassLoader* loader);
 
   virtual void resetReferenceIfStale(const void* source, void** ref);
 
@@ -393,8 +399,8 @@ protected:
   vmkit::LockRecursive bundleClassLoadersLock;
   bundleClassLoadersType bundleClassLoaders;
   volatile bool scanStaleReferences;
-  const JavaObject* findReferencesToObject;
-  std::vector<const JavaObject*> foundReferencerObjects;
+//  const JavaObject* findReferencesToObject;
+//  std::vector<const JavaObject*> foundReferencerObjects;
 
 #endif
 };

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp?rev=180553&r1=180552&r2=180553&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp Thu Apr 25 12:22:49 2013
@@ -215,7 +215,7 @@ JnjvmBootstrapLoader::JnjvmBootstrapLoad
 JnjvmClassLoader::JnjvmClassLoader(vmkit::BumpPtrAllocator& Alloc) :
 	allocator(Alloc)
 #if RESET_STALE_REFERENCES
-	,staleRefCorrected(false), zombie(false)
+	,staleRefCorrected(true), zombie(false)
 #endif
 {
 }
@@ -225,7 +225,7 @@ JnjvmClassLoader::JnjvmClassLoader(vmkit
                                    VMClassLoader* vmdata,
                                    Jnjvm* VM) : allocator(Alloc)
 #if RESET_STALE_REFERENCES
-	,staleRefCorrected(false), zombie(false)
+	,staleRefCorrected(true), zombie(false)
 #endif
 {
   llvm_gcroot(loader, 0);
@@ -884,7 +884,7 @@ JnjvmClassLoader::~JnjvmClassLoader() {
   cerr << "Bundle class loader unloaded, bundleID=" << this->getAssociatedBundleID() << endl;
 #endif
 
-  this->setAssociatedBundleID(-1);
+  vm->removeClassLoaderFromBundles(this);
 
 #endif
 
@@ -1153,15 +1153,7 @@ int64_t JnjvmClassLoader::getAssociatedB
 
 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);
+	vm->addBundleClassLoader(newID, this);
 }
 
 #endif

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp?rev=180553&r1=180552&r2=180553&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp Thu Apr 25 12:22:49 2013
@@ -21,8 +21,9 @@ namespace j3 {
 
 void Jnjvm::setBundleStaleReferenceCorrected(int64_t bundleID, bool corrected)
 {
-	JnjvmClassLoader* loader = this->getBundleClassLoader(bundleID);
-	if (!loader) {
+	classLoadersListType class_loaders;
+	this->getBundleClassLoaders(bundleID, class_loaders);
+	if (class_loaders.size() == 0) {
 		this->illegalArgumentException("Invalid bundle ID"); return;}
 
 #if DEBUG_VERBOSE_STALE_REF
@@ -33,28 +34,45 @@ void Jnjvm::setBundleStaleReferenceCorre
 		cerr << "no more corrected." << endl;
 #endif
 
-	loader->setStaleReferencesCorrectionEnabled(corrected);
+	classLoadersListType::iterator
+		i = class_loaders.begin(),
+		e = class_loaders.end();
+	for (; i != e; ++i)
+		(**i).setStaleReferencesCorrectionEnabled(corrected);
 }
 
 bool Jnjvm::isBundleStaleReferenceCorrected(int64_t bundleID)
 {
-	JnjvmClassLoader* loader = this->getBundleClassLoader(bundleID);
-	if (!loader) {
+	classLoadersListType class_loaders;
+	this->getBundleClassLoaders(bundleID, class_loaders);
+	if (class_loaders.size() == 0) {
 		this->illegalArgumentException("Invalid bundle ID"); return false;}
 
-	return loader->isStaleReferencesCorrectionEnabled();
+	classLoadersListType::const_iterator
+		i = class_loaders.begin(),
+		e = class_loaders.end();
+	bool corrected = true;
+	for (; corrected && (i != e); ++i)
+		corrected &= (**i).isStaleReferencesCorrectionEnabled();
+
+	return corrected;
 }
 
 void Jnjvm::notifyBundleUninstalled(int64_t bundleID)
 {
-	JnjvmClassLoader* loader = this->getBundleClassLoader(bundleID);
-	if (!loader) return;
-
-	if (!loader->isStaleReferencesCorrectionEnabled()) return;
+	classLoadersListType class_loaders;
+	this->getBundleClassLoaders(bundleID, class_loaders);
+	if (class_loaders.size() == 0) return;
 
-	// Mark this class loader as a zombie.
+	// Mark all bundle's class loaders as a zombies.
 	// Strong references to all its loaded classes will be reset in the next garbage collection.
-	loader->markZombie(true);
+	classLoadersListType::iterator
+		i = class_loaders.begin(),
+		e = class_loaders.end();
+	for (; i != e; ++i) {
+		if ((**i).isStaleReferencesCorrectionEnabled())
+			(**i).markZombie(true);
+	}
 
 #if DEBUG_VERBOSE_STALE_REF
 	cerr << "Bundle uninstalled: bundleID=" << bundleID << endl;
@@ -64,13 +82,73 @@ void Jnjvm::notifyBundleUninstalled(int6
 	vmkit::Collector::collect();	// Start a garbage collection now
 }
 
-void Jnjvm::dumpClassLoaderBundles()
+void Jnjvm::notifyBundleUpdated(int64_t bundleID)
 {
-	for (bundleClassLoadersType::const_iterator i = bundleClassLoaders.begin(), e = bundleClassLoaders.end(); i != e; ++i) {
-		cerr << "classLoader=" << i->second << "\tbundleID=" << i->first << endl;
+	classLoadersListType class_loaders;
+	this->getBundleClassLoaders(bundleID, class_loaders);
+	if (class_loaders.size() == 0) return;
+
+#if DEBUG_VERBOSE_STALE_REF
+	cerr << "Bundle updated: bundleID=" << bundleID
+		<< ", previousClassLoaders:";
+#endif
+
+	// Mark previous bundle's class loaders as a zombies.
+	classLoadersListType::iterator
+		i = class_loaders.begin(),
+		e = class_loaders.end();
+
+	// The first class loader is the current one, the rest are previous
+	// class loaders that should be scanned for stale references.
+	++i;
+
+	for (; i != e; ++i) {
+		if ((**i).isStaleReferencesCorrectionEnabled())
+			(**i).markZombie(true);
+
+#if DEBUG_VERBOSE_STALE_REF
+		cerr << " " << (*i);
+#endif
 	}
+
+#if DEBUG_VERBOSE_STALE_REF
+	cerr << endl;
+#endif
+
+	scanStaleReferences = true;		// Enable stale references scanning
+	vmkit::Collector::collect();	// Start a garbage collection now
 }
 
+void Jnjvm::dumpClassLoaders(const classLoadersListType& class_loaders)
+{
+	classLoadersListType::const_iterator
+		j = class_loaders.begin(),
+		je = class_loaders.end();
+
+	for (; j != je; ++j)
+		cerr << " " << (*j);
+}
+
+void Jnjvm::dumpBundleClassLoaders(int64_t bundleID)
+{
+	cerr << "bundleID=" << bundleID << " classLoaders:";
+	dumpClassLoaders(bundleClassLoaders[bundleID]);
+	cerr << endl;
+}
+
+void Jnjvm::dumpClassLoaderBundles()
+{
+	bundleClassLoadersType::const_iterator
+		i = bundleClassLoaders.begin(),
+		ie = bundleClassLoaders.end();
+	classLoadersListType::const_iterator j, je;
+
+	cerr << "bundleID=" << i->first << " classLoaders:";
+	for (; i != ie; ++i)
+		dumpClassLoaders(i->second);
+	cerr << endl;
+}
+/*
 ArrayLong* Jnjvm::getReferencesToObject(const JavaObject* obj)
 {
 	if (!obj) return NULL;
@@ -89,20 +167,35 @@ ArrayLong* Jnjvm::getReferencesToObject(
 
 	return r;
 }
-
-JnjvmClassLoader* Jnjvm::getBundleClassLoader(int64_t bundleID)
+*/
+void Jnjvm::getBundleClassLoaders(
+	int64_t bundleID, classLoadersListType& class_loaders)
 {
-	if (bundleID == -1) return NULL;
+	class_loaders.clear();
+	if (bundleID == -1) return;
+
 	vmkit::LockGuard lg(bundleClassLoadersLock);
 
-	bundleClassLoadersType::const_iterator i = bundleClassLoaders.find(bundleID);
-	return (i == bundleClassLoaders.end()) ? NULL : i->second;
+	bundleClassLoadersType::const_iterator
+		i = bundleClassLoaders.find(bundleID),
+		e = bundleClassLoaders.end();
+
+	if (i == e) return;		// Bundle not found
+	class_loaders = 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;}
+
+	bool operator() (const Jnjvm::bundleClassLoadersType::value_type& pair)
+	{
+		const Jnjvm::classLoadersListType& class_loaders = pair.second;
+		Jnjvm::classLoadersListType::const_iterator
+			b = class_loaders.begin(), e = class_loaders.end();
+
+		return std::find(b, e, loader) != e;
+	}
 };
 
 int64_t Jnjvm::getClassLoaderBundleID(JnjvmClassLoader* loader)
@@ -112,22 +205,51 @@ int64_t Jnjvm::getClassLoaderBundleID(Jn
 
 	bundleClassLoadersType::const_iterator
 		first = bundleClassLoaders.begin(),
-		last = bundleClassLoaders.end(),
+		last = bundleClassLoaders.end();
+
+	bundleClassLoadersType::const_iterator
 		i = std::find_if(first, last, Jnjvm_getClassLoaderBundleID_finder(loader));
 
 	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)
+void Jnjvm::addBundleClassLoader(int64_t bundleID, JnjvmClassLoader* loader)
 {
 	if (bundleID == -1) return;
 	vmkit::LockGuard lg(bundleClassLoadersLock);
 
-	if (!loader)
-		bundleClassLoaders.erase(bundleID);
-	else
-		bundleClassLoaders[bundleID] = loader;
+	classLoadersListType& class_loaders = bundleClassLoaders[bundleID];
+
+	classLoadersListType::const_iterator
+		b = class_loaders.begin(),
+		e = class_loaders.end();
+	if (std::find(b, e, loader) != e) return;
+
+	class_loaders.push_front(loader);
+	dumpBundleClassLoaders(bundleID);
+}
+
+void Jnjvm::removeClassLoaderFromBundles(JnjvmClassLoader* loader)
+{
+	if (loader == NULL) return;
+	vmkit::LockGuard lg(bundleClassLoadersLock);
+
+	bundleClassLoadersType::iterator
+		first = bundleClassLoaders.begin(),
+		last = bundleClassLoaders.end();
+
+	bundleClassLoadersType::iterator
+		i = std::find_if(first, last, Jnjvm_getClassLoaderBundleID_finder(loader));
+
+	if (i == last) return;
+
+	i->second.remove(loader);
+
+	dumpBundleClassLoaders(i->first);
+
+	if (i->second.size() == 0)
+		bundleClassLoaders.erase(i->first);
 }
 
 }
@@ -163,6 +285,16 @@ extern "C" void Java_j3_vm_OSGi_notifyBu
 #endif
 }
 
+extern "C" void Java_j3_vm_OSGi_notifyBundleUpdated(jlong bundleID)
+{
+#if RESET_STALE_REFERENCES
+
+	Jnjvm* vm = JavaThread::get()->getJVM();
+	vm->notifyBundleUpdated(bundleID);
+
+#endif
+}
+
 extern "C" void Java_j3_vm_OSGi_setBundleStaleReferenceCorrected(jlong bundleID, jboolean corrected)
 {
 #if RESET_STALE_REFERENCES
@@ -194,7 +326,7 @@ extern "C" void Java_j3_vm_OSGi_dumpClas
 
 #endif
 }
-
+/*
 extern "C" ArrayLong* Java_j3_vm_OSGi_getReferencesToObject(jlong objectPointer)
 {
 #if RESET_STALE_REFERENCES
@@ -206,7 +338,7 @@ extern "C" ArrayLong* Java_j3_vm_OSGi_ge
 	return NULL;
 #endif
 }
-
+*/
 extern "C" JavaString* Java_j3_vm_OSGi_dumpObject(jlong objectPointer)
 {
 #if RESET_STALE_REFERENCES

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp?rev=180553&r1=180552&r2=180553&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp Thu Apr 25 12:22:49 2013
@@ -22,8 +22,8 @@ void Jnjvm::resetReferenceIfStale(const
 	src = const_cast<JavaObject*>(reinterpret_cast<const JavaObject*>(source));
 	JavaObject **objRef = reinterpret_cast<JavaObject**>(ref);
 
-	if (findReferencesToObject == *objRef)
-		foundReferencerObjects.push_back(src);
+//	if (findReferencesToObject == *objRef)
+//		foundReferencerObjects.push_back(src);
 
 	if (!scanStaleReferences) return;	// Stale references scanning disabled
 





More information about the vmkit-commits mailing list