[vmkit-commits] [vmkit] r180557 - Working on bundle update.

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


Author: peter.senna
Date: Thu Apr 25 12:23:57 2013
New Revision: 180557

URL: http://llvm.org/viewvc/llvm-project?rev=180557&view=rev
Log:
Working on bundle update.
(cherry picked from commit 68e281b8f2355a757c1eacc412956a14401c5167)

Modified:
    vmkit/trunk/incinerator/osgi/src/j3/J3Mgr.java
    vmkit/trunk/incinerator/osgi/src/j3/vm/OSGi.java
    vmkit/trunk/incinerator/osgi/src/j3mgr/J3MgrImpl.java
    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

Modified: vmkit/trunk/incinerator/osgi/src/j3/J3Mgr.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/incinerator/osgi/src/j3/J3Mgr.java?rev=180557&r1=180556&r2=180557&view=diff
==============================================================================
--- vmkit/trunk/incinerator/osgi/src/j3/J3Mgr.java (original)
+++ vmkit/trunk/incinerator/osgi/src/j3/J3Mgr.java Thu Apr 25 12:23:57 2013
@@ -14,7 +14,5 @@ public interface J3Mgr
 	public void setBundleStaleReferenceCorrected(
 		String bundleNameOrID, String corrected) throws Throwable;
 	public void isBundleStaleReferenceCorrected(
-			String bundleNameOrID) throws Throwable;
-	public void dumpReferencesToObject(
-			String objectPointer) throws Throwable;
+		String bundleNameOrID) throws Throwable;
 }

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=180557&r1=180556&r2=180557&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:23:57 2013
@@ -5,10 +5,6 @@ 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);
 	
 	// Commands
     public static native void setBundleStaleReferenceCorrected(long bundleID, boolean corrected);

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=180557&r1=180556&r2=180557&view=diff
==============================================================================
--- vmkit/trunk/incinerator/osgi/src/j3mgr/J3MgrImpl.java (original)
+++ vmkit/trunk/incinerator/osgi/src/j3mgr/J3MgrImpl.java Thu Apr 25 12:23:57 2013
@@ -1,6 +1,5 @@
 package j3mgr;
 
-import java.util.Set;
 import j3.J3Mgr;
 
 import org.osgi.framework.Bundle;
@@ -50,18 +49,12 @@ public class J3MgrImpl
 
 	public void bundleChanged(BundleEvent event)
 	{
-		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) {}
-		}
+		if (event.getType() != BundleEvent.UNINSTALLED) return;
+		
+		try {
+			refreshFramework();
+			j3.vm.OSGi.notifyBundleUninstalled(event.getBundle().getBundleId());
+		} catch (Throwable e) {}
 	}
 	
 	void refreshFramework()
@@ -126,53 +119,4 @@ public class J3MgrImpl
 	{
 		j3.vm.OSGi.dumpClassLoaderBundles();
 	}
-
-	public void dumpReferencesToObject(String objectPointer) throws Throwable
-	{
-		int radix = 10;
-		if (objectPointer.startsWith("0x")) {
-			objectPointer = objectPointer.substring(2);
-			radix = 16;
-		}
-
-		long obj = Long.parseLong(objectPointer, radix);
-		
-		dumpReferencesToObject(obj, null, 4);
-		System.out.println(";");
-	}
-	
-	public void dumpReferencesToObject(long obj, Set<Long> objects, int depth) throws Throwable
-	{
-		if (obj == 0) {
-			System.out.print("0x0");
-			return;
-		}
-/*		
-		if (objects == null)
-			objects = new TreeSet<Long>();
-		
-		Long Obj = new Long(obj);
-		if ((depth <= 0) || objects.contains(Obj)) {
-			System.out.print(j3.vm.OSGi.dumpObject(obj));
-			return;	// Already dumped or depth reached
-		}
-		objects.add(Obj);
-*/	
-		if (depth <= 0) {
-			System.out.print(j3.vm.OSGi.dumpObject(obj));
-			return;	// Already dumped or depth reached
-		}
-		
-		System.out.print(j3.vm.OSGi.dumpObject(obj) + "<<{");
-		long[] refs = j3.vm.OSGi.getReferencesToObject(obj);
-		if (refs != null && refs.length > 0) {
-			dumpReferencesToObject(refs[0], objects, depth - 1);
-			
-			for (int i=1; i < refs.length; ++i) {
-				System.out.print(",");
-				dumpReferencesToObject(refs[i], objects, depth - 1);
-			}
-		}
-		System.out.print("}");
-	}
 }

Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.h?rev=180557&r1=180556&r2=180557&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.h Thu Apr 25 12:23:57 2013
@@ -370,21 +370,17 @@ public:
 #if RESET_STALE_REFERENCES
 
 public:
-  typedef std::list<JnjvmClassLoader*>				classLoadersListType;
-  typedef std::map<int64_t, classLoadersListType>	bundleClassLoadersType;
+  typedef std::map<int64_t, std::list<JnjvmClassLoader*> >	staleBundleClassLoadersType;
+  typedef std::map<int64_t, JnjvmClassLoader*>	bundleClassLoadersType;
 
   void setBundleStaleReferenceCorrected(int64_t bundleID, bool corrected);
   bool isBundleStaleReferenceCorrected(int64_t bundleID);
   void dumpClassLoaderBundles();
-//  class ArrayLong* getReferencesToObject(const JavaObject* obj);
-
-  void notifyBundleUninstalled(int64_t bundleID);
-  void notifyBundleUpdated(int64_t bundleID);
 
+  JnjvmClassLoader* getBundleClassLoader(int64_t bundleID);
   int64_t getClassLoaderBundleID(JnjvmClassLoader* loader);
-  void getBundleClassLoaders(int64_t bundleID, classLoadersListType& class_loaders);
-  void addBundleClassLoader(int64_t bundleID, JnjvmClassLoader* loader);
-  void removeClassLoaderFromBundles(JnjvmClassLoader* loader);
+  void setBundleClassLoader(int64_t bundleID, JnjvmClassLoader* loader);
+  void classLoaderUnloaded(JnjvmClassLoader* loader);
 
   virtual void resetReferenceIfStale(const void* source, void** ref);
 
@@ -396,9 +392,8 @@ protected:
   // Link between OSGi (bundle ID) and Java (class loaders).
   vmkit::LockRecursive bundleClassLoadersLock;
   bundleClassLoadersType bundleClassLoaders;
+  staleBundleClassLoadersType staleBundleClassLoaders;
   volatile bool scanStaleReferences;
-//  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=180557&r1=180556&r2=180557&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp Thu Apr 25 12:23:57 2013
@@ -215,7 +215,7 @@ JnjvmBootstrapLoader::JnjvmBootstrapLoad
 JnjvmClassLoader::JnjvmClassLoader(vmkit::BumpPtrAllocator& Alloc) :
 	allocator(Alloc)
 #if RESET_STALE_REFERENCES
-	,staleRefCorrected(true), zombie(false)
+	,staleRefFlags(CLASS_LOADER_STALE_REF_CORRECTED)
 #endif
 {
 }
@@ -225,7 +225,7 @@ JnjvmClassLoader::JnjvmClassLoader(vmkit
                                    VMClassLoader* vmdata,
                                    Jnjvm* VM) : allocator(Alloc)
 #if RESET_STALE_REFERENCES
-	,staleRefCorrected(true), zombie(false)
+	,staleRefFlags(CLASS_LOADER_STALE_REF_CORRECTED)
 #endif
 {
   llvm_gcroot(loader, 0);
@@ -879,7 +879,7 @@ const UTF8* JnjvmClassLoader::readerCons
 JnjvmClassLoader::~JnjvmClassLoader() {
 
 #if RESET_STALE_REFERENCES
-  vm->removeClassLoaderFromBundles(this);
+  vm->classLoaderUnloaded(this);
 #endif
 
   if (vm) {
@@ -1140,9 +1140,30 @@ ArrayObject* JnjvmBootstrapLoader::getBo
 
 #if RESET_STALE_REFERENCES
 
-void JnjvmClassLoader::setAssociatedBundleID(int64_t newID)
+bool JnjvmClassLoader::isStale() const
 {
-	vm->addBundleClassLoader(newID, this);
+	return (staleRefFlags & CLASS_LOADER_STALE_REF_STALE) != 0;
+}
+
+void JnjvmClassLoader::markStale(bool stale)
+{
+	if (stale)
+		staleRefFlags |= CLASS_LOADER_STALE_REF_STALE;
+	else
+		staleRefFlags &= ~CLASS_LOADER_STALE_REF_STALE;
+}
+
+bool JnjvmClassLoader::isStaleReferencesCorrectionEnabled() const
+{
+	return (staleRefFlags & CLASS_LOADER_STALE_REF_CORRECTED) != 0;
+}
+
+void JnjvmClassLoader::setStaleReferencesCorrectionEnabled(bool enable)
+{
+	if (enable)
+		staleRefFlags |= CLASS_LOADER_STALE_REF_CORRECTED;
+	else
+		staleRefFlags &= ~CLASS_LOADER_STALE_REF_CORRECTED;
 }
 
 #endif

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h?rev=180557&r1=180556&r2=180557&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h Thu Apr 25 12:23:57 2013
@@ -52,6 +52,9 @@ class ZipArchive;
 template <class T> class TJavaArray;
 typedef TJavaArray<JavaObject*> ArrayObject;
 
+#define CLASS_LOADER_STALE_REF_CORRECTED	0x1
+#define CLASS_LOADER_STALE_REF_STALE		0x2
+
 /// JnjvmClassLoader - Runtime representation of a class loader. It contains
 /// its own tables (signatures, UTF8, types) which are mapped to a single
 /// table for non-isolate environments.
@@ -342,17 +345,13 @@ public:
 #if RESET_STALE_REFERENCES
 
 protected:
-  bool staleRefCorrected;
-  bool zombie;
+  uint8_t staleRefFlags;
 
 public:
-  bool isZombie() const {return zombie;}
-  void markZombie(bool becomeZombie = true) {zombie = becomeZombie;}
-  bool isStaleReferencesCorrectionEnabled() {return staleRefCorrected;}
-  void setStaleReferencesCorrectionEnabled(bool enable) {staleRefCorrected = enable;}
-
-  // This bridges the OSGi world (bundles) to the Java world (class loaders).
-  void setAssociatedBundleID(int64_t newID);
+  bool isStale() const;
+  void markStale(bool stale = true);
+  bool isStaleReferencesCorrectionEnabled() const;
+  void setStaleReferencesCorrectionEnabled(bool enable);
 
 #endif
 

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp?rev=180557&r1=180556&r2=180557&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp Thu Apr 25 12:23:57 2013
@@ -19,44 +19,31 @@ using namespace std;
 
 namespace j3 {
 
-
-std::ostream& operator << (
-	std::ostream& os, const Jnjvm::classLoadersListType& obj)
-{
-	Jnjvm::classLoadersListType::const_iterator
-		i = obj.begin(), e = obj.end();
-	for (; i != e; ++i)
-		os << " " << (*i);
-	return os;
-}
-
-std::ostream& operator << (
-	std::ostream& os, const Jnjvm::bundleClassLoadersType::value_type& obj)
-{
-	return os << "bundleID=" << obj.first
-		<< " classLoaders={" << obj.second << "}" << endl;
-}
-
-std::ostream& operator << (
-	std::ostream& os, const j3::Jnjvm::bundleClassLoadersType& obj)
+void Jnjvm::dumpClassLoaderBundles()
 {
+	vmkit::LockGuard lg(bundleClassLoadersLock);
 	Jnjvm::bundleClassLoadersType::const_iterator
-		i = obj.begin(), e = obj.end();
+		i = bundleClassLoaders.begin(), e = bundleClassLoaders.end();
+
 	for (; i != e; ++i)
-		os << *i;
-	return os;
-}
+		cerr << "bundleID=" << i->first << " classLoader=" << i->second << endl;
 
-void Jnjvm::dumpClassLoaderBundles()
-{
-	cerr << bundleClassLoaders;
+	staleBundleClassLoadersType::const_iterator
+		si = staleBundleClassLoaders.begin(), se = staleBundleClassLoaders.end();
+	staleBundleClassLoadersType::mapped_type::const_iterator li, le;
+	for (; si != se; ++si) {
+		cerr << "stale bundleID=" << si->first << " classLoaders={";
+		le = si->second.end();
+		li = si->second.begin();
+		for (; li != le; ++li) cerr << " " << *li;
+		cerr << "}" << endl;
+	}
 }
 
 void Jnjvm::setBundleStaleReferenceCorrected(int64_t bundleID, bool corrected)
 {
-	classLoadersListType class_loaders;
-	this->getBundleClassLoaders(bundleID, class_loaders);
-	if (class_loaders.size() == 0) {
+	JnjvmClassLoader* loader = this->getBundleClassLoader(bundleID);
+	if (!loader) {
 		this->illegalArgumentException("Invalid bundle ID"); return;}
 
 #if DEBUG_VERBOSE_STALE_REF
@@ -67,132 +54,50 @@ void Jnjvm::setBundleStaleReferenceCorre
 		cerr << "no more corrected." << endl;
 #endif
 
-	classLoadersListType::iterator
-		i = class_loaders.begin(),
-		e = class_loaders.end();
-	for (; i != e; ++i)
-		(**i).setStaleReferencesCorrectionEnabled(corrected);
+	loader->setStaleReferencesCorrectionEnabled(corrected);
 }
 
 bool Jnjvm::isBundleStaleReferenceCorrected(int64_t bundleID)
 {
-	classLoadersListType class_loaders;
-	this->getBundleClassLoaders(bundleID, class_loaders);
-	if (class_loaders.size() == 0) {
+	JnjvmClassLoader* loader = this->getBundleClassLoader(bundleID);
+	if (!loader) {
 		this->illegalArgumentException("Invalid bundle ID"); return false;}
 
-	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)
-{
-	classLoadersListType class_loaders;
-	this->getBundleClassLoaders(bundleID, class_loaders);
-	if (class_loaders.size() == 0) return;
-
-	// Mark all bundle's class loaders as a zombies.
-	// Strong references to all its loaded classes will be reset in the next garbage collection.
-	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
-		<< " classLoaders={" << bundleClassLoaders[bundleID] << "}" << endl;
-#endif
-
-	scanStaleReferences = true;		// Enable stale references scanning
-//	vmkit::Collector::collect();	// Start a garbage collection now
-}
-
-void Jnjvm::notifyBundleUpdated(int64_t bundleID)
-{
-	classLoadersListType class_loaders;
-	this->getBundleClassLoaders(bundleID, class_loaders);
-	if (class_loaders.size() <= 1)
-		return; // An updated bundle must have at least two attached class loaders
-
-#if DEBUG_VERBOSE_STALE_REF
-	cerr << "Bundle updated: bundleID=" << bundleID
-		<< " classLoaders={" << bundleClassLoaders[bundleID] << "}" << endl;
-#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);
-	}
-
-	scanStaleReferences = true;		// Enable stale references scanning
-//	vmkit::Collector::collect();	// Start a garbage collection now
+	return loader->isStaleReferencesCorrectionEnabled();
 }
 
-/*
-ArrayLong* Jnjvm::getReferencesToObject(const JavaObject* obj)
-{
-	if (!obj) return NULL;
-
-	findReferencesToObject = obj;
-	vmkit::Collector::collect();
-
-	size_t count = foundReferencerObjects.size();
-	ArrayLong* r = static_cast<ArrayLong*>(upcalls->ArrayOfLong->doNew(count, this));
-	if (!r) {this->outOfMemoryError(); return r;}
-
-	ArrayLong::ElementType* elements = ArrayLong::getElements(r);
-	for (size_t i=0; i < count; ++i) {
-		elements[i] = reinterpret_cast<ArrayLong::ElementType>(foundReferencerObjects[i]);
-	}
-
-	return r;
-}
-*/
-void Jnjvm::getBundleClassLoaders(
-	int64_t bundleID, classLoadersListType& class_loaders)
+JnjvmClassLoader* Jnjvm::getBundleClassLoader(int64_t bundleID)
 {
-	class_loaders.clear();
-	if (bundleID == -1) return;
+	if (bundleID == -1) return NULL;
 
 	vmkit::LockGuard lg(bundleClassLoadersLock);
 
 	bundleClassLoadersType::const_iterator
-		i = bundleClassLoaders.find(bundleID),
-		e = bundleClassLoaders.end();
-
-	if (i == e) return;		// Bundle not found
-	class_loaders = i->second;
+		i = bundleClassLoaders.find(bundleID), e = bundleClassLoaders.end();
+	return (i == e) ? NULL : i->second;
 }
 
-struct Jnjvm_getClassLoaderBundleID_finder {
+struct Jnjvm_getClassLoaderBundleID_InstalledBundles_finder {
 	JnjvmClassLoader* loader;
-	Jnjvm_getClassLoaderBundleID_finder(JnjvmClassLoader* l) : loader(l) {}
+	Jnjvm_getClassLoaderBundleID_InstalledBundles_finder(
+		JnjvmClassLoader* l) : loader(l) {}
+
+	bool operator() (const Jnjvm::bundleClassLoadersType::value_type& pair) {
+		return (loader == pair.second);
+	}
+};
 
-	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();
+struct Jnjvm_getClassLoaderBundleID_UninstalledBundles_finder {
+	JnjvmClassLoader* loader;
+	Jnjvm_getClassLoaderBundleID_UninstalledBundles_finder(
+		JnjvmClassLoader* l) : loader(l) {}
 
-		return std::find(b, e, loader) != e;
+	bool operator() (const Jnjvm::staleBundleClassLoadersType::value_type& pair) {
+		Jnjvm::staleBundleClassLoadersType::mapped_type::const_iterator
+			b = pair.second.begin(), e = pair.second.end();
+		Jnjvm::staleBundleClassLoadersType::mapped_type::const_iterator
+			i = std::find(b, e, loader);
+		return (i != e);
 	}
 };
 
@@ -202,68 +107,92 @@ int64_t Jnjvm::getClassLoaderBundleID(Jn
 	vmkit::LockGuard lg(bundleClassLoadersLock);
 
 	bundleClassLoadersType::const_iterator
-		first = bundleClassLoaders.begin(),
-		last = bundleClassLoaders.end();
-
+		b = bundleClassLoaders.begin(),
+		e = bundleClassLoaders.end();
 	bundleClassLoadersType::const_iterator
-		i = std::find_if(first, last, Jnjvm_getClassLoaderBundleID_finder(loader));
+		i = std::find_if(b, e,
+			Jnjvm_getClassLoaderBundleID_InstalledBundles_finder(loader));
+
+	if (i != e) return i->first;
+
+	// Look up in stale bundles list
+	staleBundleClassLoadersType::const_iterator
+		sb = staleBundleClassLoaders.begin(),
+		se = staleBundleClassLoaders.end();
+	staleBundleClassLoadersType::const_iterator
+		si = std::find_if(sb, se,
+			Jnjvm_getClassLoaderBundleID_UninstalledBundles_finder(loader));
 
-	return (i == last) ? -1 : i->first;
+	return (si == se) ? -1 : si->first;
 }
 
 // Link a bundle ID (OSGi world) to a class loader (Java world).
-void Jnjvm::addBundleClassLoader(int64_t bundleID, JnjvmClassLoader* loader)
+void Jnjvm::setBundleClassLoader(int64_t bundleID, JnjvmClassLoader* loader)
 {
 	if (bundleID == -1) return;
 	vmkit::LockGuard lg(bundleClassLoadersLock);
 
-	classLoadersListType& class_loaders = bundleClassLoaders[bundleID];
+	JnjvmClassLoader* previous_loader = bundleClassLoaders[bundleID];
+
+	if (!loader) {
+		// Unloaded bundle
+		bundleClassLoaders.erase(bundleID);
 
-	classLoadersListType::const_iterator
-		b = class_loaders.begin(),
-		e = class_loaders.end();
-	if (std::find(b, e, loader) != e)
-		return;	// Class loader already associated with the bundle, do nothing
-
-	class_loaders.push_front(loader);
-
-	// If there are more than one class loaders associated with the bundle then
-	// this must be an updated bundle, signal this
-	if (class_loaders.size() > 1)
-		notifyBundleUpdated(bundleID);
 #if DEBUG_VERBOSE_STALE_REF
-	else {
-		cerr << "Bundle installed: bundleID=" << bundleID
-			<< " classLoader={" << bundleClassLoaders[bundleID] << "}" << endl;
-	}
+	cerr << "Bundle uninstalled: bundleID=" << bundleID
+		<< " classLoader=" << previous_loader << endl;
 #endif
-}
+	} else {
+		// Installed/Updated bundle
+		if (previous_loader == loader)
+			return;	// Same class loader already associated with the bundle, do nothing
 
-void Jnjvm::removeClassLoaderFromBundles(JnjvmClassLoader* loader)
-{
-	if (loader == NULL) return;
-	vmkit::LockGuard lg(bundleClassLoadersLock);
+		// Associate the class loader with the bundle
+		bundleClassLoaders[bundleID] = loader;
+
+#if DEBUG_VERBOSE_STALE_REF
+		if (!previous_loader) {
+			cerr << "Bundle installed: bundleID=" << bundleID
+				<< " classLoader=" << loader << endl;
+		} else {
+			cerr << "Bundle updated: bundleID=" << bundleID
+				<< " classLoader=" << loader
+				<< " previousClassLoader=" << previous_loader << endl;
+		}
+#endif
+	}
 
-	bundleClassLoadersType::iterator
-		first = bundleClassLoaders.begin(),
-		last = bundleClassLoaders.end();
+	if (previous_loader != NULL) {
+		// Mark the previous class loader as stale
+		if (previous_loader->isStaleReferencesCorrectionEnabled()) {
+			previous_loader->markStale(true);
+			staleBundleClassLoaders[bundleID].push_front(previous_loader);
+		}
 
-	bundleClassLoadersType::iterator
-		i = std::find_if(first, last, Jnjvm_getClassLoaderBundleID_finder(loader));
+		// Enable stale references scanning
+		scanStaleReferences = true;
 
-	if (i == last) return;
+		// Start a garbage collection now
+		//vmkit::Collector::collect();
+	}
+}
 
-	i->second.remove(loader);
+void Jnjvm::classLoaderUnloaded(JnjvmClassLoader* loader)
+{
+	int64_t bundleID = getClassLoaderBundleID(loader);
+	if (bundleID == -1) {
+		cerr << "Class loader unloaded: " << loader << endl;
+		return;
+	}
 
-	if (i->second.size() == 0) {
-		bundleClassLoaders.erase(i->first);
+	staleBundleClassLoaders[bundleID].remove(loader);
+	if (staleBundleClassLoaders[bundleID].size() == 0)
+		staleBundleClassLoaders.erase(bundleID);
 
 #if DEBUG_VERBOSE_STALE_REF
-		cerr << "Bundle unloaded: " << *i;
-	} else {
-		cerr << "Bundle class loader unloaded: classLoader=" << loader << " " << *i;
+	cerr << "Class loader unloaded: " << loader
+		<< " bundleID=" << bundleID << endl;
 #endif
-	}
 }
 
 }
@@ -283,8 +212,9 @@ extern "C" void Java_j3_vm_OSGi_associat
 
 #if RESET_STALE_REFERENCES
 
+	Jnjvm* vm = JavaThread::get()->getJVM();
 	CommonClass* ccl = JavaObjectClass::getClass(classObject);
-	ccl->classLoader->setAssociatedBundleID(bundleID);
+	vm->setBundleClassLoader(bundleID, ccl->classLoader);
 
 #endif
 }
@@ -294,17 +224,7 @@ extern "C" void Java_j3_vm_OSGi_notifyBu
 #if RESET_STALE_REFERENCES
 
 	Jnjvm* vm = JavaThread::get()->getJVM();
-	vm->notifyBundleUninstalled(bundleID);
-
-#endif
-}
-
-extern "C" void Java_j3_vm_OSGi_notifyBundleUpdated(jlong bundleID)
-{
-#if RESET_STALE_REFERENCES
-
-	Jnjvm* vm = JavaThread::get()->getJVM();
-	vm->notifyBundleUpdated(bundleID);
+	vm->setBundleClassLoader(bundleID, NULL);
 
 #endif
 }
@@ -340,32 +260,3 @@ extern "C" void Java_j3_vm_OSGi_dumpClas
 
 #endif
 }
-/*
-extern "C" ArrayLong* Java_j3_vm_OSGi_getReferencesToObject(jlong objectPointer)
-{
-#if RESET_STALE_REFERENCES
-
-	Jnjvm* vm = JavaThread::get()->getJVM();
-	return vm->getReferencesToObject(reinterpret_cast<const JavaObject*>((intptr_t)objectPointer));
-
-#else
-	return NULL;
-#endif
-}
-*/
-extern "C" JavaString* Java_j3_vm_OSGi_dumpObject(jlong objectPointer)
-{
-#if RESET_STALE_REFERENCES
-
-	if (!objectPointer) return NULL;
-	const JavaObject& obj = *reinterpret_cast<const JavaObject*>((intptr_t)objectPointer);
-	std::ostringstream ss;
-	ss << obj;
-
-	Jnjvm* vm = JavaThread::get()->getJVM();
-	return vm->asciizToStr(ss.str().c_str());
-	
-#else
-	return NULL;
-#endif
-}

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp?rev=180557&r1=180556&r2=180557&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp Thu Apr 25 12:23:57 2013
@@ -47,7 +47,7 @@ void Jnjvm::resetReferenceIfStale(const
 #if DEBUG_VERBOSE_STALE_REF
 
 	JnjvmClassLoader* loader = (**ref).getClassLoader();
-	if (!loader->isZombie()) return;
+	if (!loader->isStale()) return;
 /*
 	cerr << "WARNING: Ignored stale reference ref=" << ref << " obj=" << **ref;
 	if (source) cerr << " source=" << *source;
@@ -66,7 +66,7 @@ void Jnjvm::resetReferenceIfStale(const
 #if DEBUG_VERBOSE_STALE_REF
 
 	JnjvmClassLoader* loader = (**ref).getOwningClass()->classLoader;
-	if (!loader->isZombie()) return;
+	if (!loader->isStale()) return;
 /*
 	cerr << "WARNING: Ignored stale reference ref=" << ref << " obj=" << **ref;
 	if (source) cerr << " source=" << *source;
@@ -83,7 +83,7 @@ void Jnjvm::resetReferenceIfStale(const
 
 	if (source) {
 		CommonClass* ccl = JavaObject::getClass(source);
-		if (ccl->classLoader->isZombie())
+		if (ccl->classLoader->isStale())
 			cerr << "WARNING: Source object is stale source=" << *source << endl;
 	}
 
@@ -92,7 +92,7 @@ void Jnjvm::resetReferenceIfStale(const
 	CommonClass* ccl = JavaObject::getClass(*ref);
 	assert (ccl && "Object Class is not null.");
 
-	if (!ccl->classLoader->isZombie()) return;
+	if (!ccl->classLoader->isStale()) return;
 
 #if DEBUG_VERBOSE_STALE_REF
 





More information about the vmkit-commits mailing list