[vmkit-commits] [vmkit] r180521 - Reverted to the old Incinerator method. The new method needs more thorough analysis.

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


Author: peter.senna
Date: Thu Apr 25 12:19:35 2013
New Revision: 180521

URL: http://llvm.org/viewvc/llvm-project?rev=180521&view=rev
Log:
Reverted to the old Incinerator method. The new method needs more thorough analysis.
(cherry picked from commit 7865f032f1be3d0fe0f142755641ebeae97302eb)

Modified:
    vmkit/trunk/incinerator/osgi/src/j3/vm/OSGi.java
    vmkit/trunk/incinerator/osgi/src/j3mgr/J3MgrImpl.java
    vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp
    vmkit/trunk/lib/j3/LLVMRuntime/runtime-single.ll
    vmkit/trunk/lib/j3/VMCore/JavaClass.h
    vmkit/trunk/lib/j3/VMCore/Jnjvm.h
    vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h
    vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp
    vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp

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=180521&r1=180520&r2=180521&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:19:35 2013
@@ -4,9 +4,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 notifyServiceUnregistered(long bundleID, Class classObject);
 	
 	// 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=180521&r1=180520&r2=180521&view=diff
==============================================================================
--- vmkit/trunk/incinerator/osgi/src/j3mgr/J3MgrImpl.java (original)
+++ vmkit/trunk/incinerator/osgi/src/j3mgr/J3MgrImpl.java Thu Apr 25 12:19:35 2013
@@ -2,15 +2,15 @@ package j3mgr;
 
 import j3.J3Mgr;
 
-import org.osgi.framework.AllServiceListener;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
 import org.osgi.framework.BundleListener;
-import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.PackageAdmin;
 
 public class J3MgrImpl
-	implements J3Mgr, BundleListener, AllServiceListener
+	implements J3Mgr, BundleListener
 {
 	BundleContext context;
 	
@@ -19,13 +19,11 @@ public class J3MgrImpl
 		context = bundleContext;
 		
 		context.addBundleListener(this);
-		context.addServiceListener(this);
 	}
 
 	public void close()
 	{
 		context.removeBundleListener(this);
-		context.removeServiceListener(this);
 		context = null;
 	}
 
@@ -39,20 +37,20 @@ public class J3MgrImpl
 		return j3.vm.OSGi.isBundleStaleReferenceCorrected(bundle.getBundleId());
 	}
 
-	public void serviceChanged(ServiceEvent event)
-	{
-		if (event.getType() != ServiceEvent.UNREGISTERING) return;
-		// WARNING: Service is NOT yet unregistered here. Find a solution to know when it is.
-		j3.vm.OSGi.notifyServiceUnregistered(
-			event.getServiceReference().getBundle().getBundleId(),
-			context.getService(event.getServiceReference()).getClass()
-			);
-	}
-
 	public void bundleChanged(BundleEvent event)
 	{
 		if (event.getType() != BundleEvent.UNINSTALLED) return;
 		j3.vm.OSGi.notifyBundleUninstalled(event.getBundle().getBundleId());
+		refreshFramework();
+	}
+	
+	void refreshFramework()
+	{
+		ServiceReference<?> pkgAdminRef = (ServiceReference<?>)context.getServiceReference(
+			"org.osgi.service.packageadmin.PackageAdmin");
+		PackageAdmin pkgAdmin = (PackageAdmin)context.getService(pkgAdminRef);
+		pkgAdmin.refreshPackages(null);
+		context.ungetService(pkgAdminRef);
 	}
 	
 	// THE FOLLOWING METHODS ARE DEBUGGING HELPERS

Modified: vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp?rev=180521&r1=180520&r2=180521&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp Thu Apr 25 12:19:35 2013
@@ -1393,9 +1393,6 @@ Constant* JavaAOTCompiler::CreateConstan
   // minJDKVersionBuild
   ClassElts.push_back(ConstantInt::get(Type::getInt16Ty(getLLVMContext()), cl->minJDKVersionBuild));
 
-  // zombie
-  ClassElts.push_back(ConstantInt::get(Type::getInt8Ty(getLLVMContext()), cl->zombie));
-
   return ConstantStruct::get(STy, ClassElts);
 }
 

Modified: vmkit/trunk/lib/j3/LLVMRuntime/runtime-single.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/LLVMRuntime/runtime-single.ll?rev=180521&r1=180520&r2=180521&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/LLVMRuntime/runtime-single.ll (original)
+++ vmkit/trunk/lib/j3/LLVMRuntime/runtime-single.ll Thu Apr 25 12:19:35 2013
@@ -10,4 +10,4 @@
 %JavaClass = type { %JavaCommonClass, i32, i32, [1 x %TaskClassMirror],
                     %JavaField*, i16, %JavaField*, i16, %JavaMethod*, i16,
                     %JavaMethod*, i16, i8*, %ClassBytes*, %JavaConstantPool*, %Attribute*,
-                    i16, %JavaClass**, i16, %JavaClass*, i16, i8, i8, i32, i32, i16, i16, i16, i8 }
+                    i16, %JavaClass**, i16, %JavaClass*, i16, i8, i8, i32, i32, i16, i16, i16 }

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.h?rev=180521&r1=180520&r2=180521&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.h Thu Apr 25 12:19:35 2013
@@ -532,11 +532,6 @@ public:
 
   uint16_t minJDKVersionMajor, minJDKVersionMinor, minJDKVersionBuild;
 
-  // A class becomes zombie when strong references to it exist in memory while:
-  // - Its defining bundle is uninstalled;
-  // - or it is an interface for an unregistered service.
-  bool zombie;
-
   /// getVirtualSize - Get the virtual size of instances of this class.
   ///
   uint32 getVirtualSize() const { return virtualSize; }
@@ -831,9 +826,6 @@ public:
 
   static void getMinimalJDKVersion(uint16_t major, uint16_t minor, uint16_t& JDKMajor, uint16_t& JDKMinor, uint16_t& JDKBuild);
   bool isClassVersionSupported(uint16_t major, uint16_t minor);
-
-  bool isZombie() const {return zombie;}
-  void markZombie(bool becomeZombie = true) {zombie = becomeZombie;}
 };
 
 /// ClassArray - This class represents Java array classes.

Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.h?rev=180521&r1=180520&r2=180521&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.h Thu Apr 25 12:19:35 2013
@@ -376,7 +376,6 @@ public:
   void notifyBundleUninstalled(int64_t bundleID);
 
   void notifyBundleUninstalled(int64_t bundleID);
-  void notifyServiceUnregistered(int64_t bundleID, class JavaObjectClass* classObject);
 
   int64_t getClassLoaderBundleID(JnjvmClassLoader* loader);
   JnjvmClassLoader* getBundleClassLoader(int64_t bundleID);

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp?rev=180521&r1=180520&r2=180521&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp Thu Apr 25 12:19:35 2013
@@ -215,7 +215,7 @@ JnjvmBootstrapLoader::JnjvmBootstrapLoad
 JnjvmClassLoader::JnjvmClassLoader(vmkit::BumpPtrAllocator& Alloc) :
 	allocator(Alloc)
 #if RESET_STALE_REFERENCES
-	,staleRefCorrected(false)
+	,staleRefCorrected(false), zombie(false)
 #endif
 {
 }
@@ -225,7 +225,7 @@ JnjvmClassLoader::JnjvmClassLoader(vmkit
                                    VMClassLoader* vmdata,
                                    Jnjvm* VM) : allocator(Alloc)
 #if RESET_STALE_REFERENCES
-	,staleRefCorrected(false)
+	,staleRefCorrected(false), zombie(false)
 #endif
 {
   llvm_gcroot(loader, 0);
@@ -1144,19 +1144,4 @@ void JnjvmClassLoader::setAssociatedBund
 	vm->setBundleClassLoader(newID, this);
 }
 
-void JnjvmClassLoader::markZombie(bool becomeZombie)
-{
-	classes->lock.lock();
-
-	for (ClassMap::iterator i = classes->map.begin(), e = classes->map.end(); i != e; ++i) {
-		CommonClass* ccl = i->second;
-		if (ccl->classLoader != this) continue;
-		if (!ccl->isClass() && !ccl->isInterface()) continue;
-
-		ccl->asClass()->markZombie(becomeZombie);
-	}
-
-	classes->lock.unlock();
-}
-
 #endif

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h?rev=180521&r1=180520&r2=180521&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h Thu Apr 25 12:19:35 2013
@@ -333,9 +333,11 @@ public:
 
 protected:
   bool staleRefCorrected;
+  bool zombie;
 
 public:
-  void markZombie(bool becomeZombie = true);
+  bool isZombie() const {return zombie;}
+  void markZombie(bool becomeZombie = true) {zombie = becomeZombie;}
   bool isStaleReferencesCorrectionEnabled() {return staleRefCorrected;}
   void setStaleReferencesCorrectionEnabled(bool enable) {staleRefCorrected = enable;}
 

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp?rev=180521&r1=180520&r2=180521&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmIntOSGi.cpp Thu Apr 25 12:19:35 2013
@@ -10,10 +10,10 @@
 
 using namespace std;
 
-#define DEBUG_VERBOSE_STALE_REF		1
-
 #if RESET_STALE_REFERENCES
 
+#define DEBUG_VERBOSE_STALE_REF		1
+
 namespace j3 {
 
 void Jnjvm::setBundleStaleReferenceCorrected(int64_t bundleID, bool corrected)
@@ -61,29 +61,6 @@ void Jnjvm::notifyBundleUninstalled(int6
 	vmkit::Collector::collect();	// Start a garbage collection now
 }
 
-void Jnjvm::notifyServiceUnregistered(int64_t bundleID, JavaObjectClass* classObject)
-{
-	llvm_gcroot(classObject, 0);
-
-	JnjvmClassLoader* loader = this->getBundleClassLoader(bundleID);
-	if (!loader) return;
-
-	if (!loader->isStaleReferencesCorrectionEnabled()) return;
-
-	CommonClass* ccl = JavaObjectClass::getClass(classObject);
-	if (!ccl->isClass() && !ccl->isInterface()) {
-		this->illegalArgumentException("Service class is not a class or an interface"); return;}
-
-#if DEBUG_VERBOSE_STALE_REF
-	cerr << "Service unregistered: bundleID=" << bundleID << " class=" << *ccl->name << endl;
-#endif
-
-	ccl->asClass()->markZombie(true);
-
-	scanStaleReferences = true;		// Enable stale references scanning
-	vmkit::Collector::collect();	// Start a garbage collection now
-}
-
 void Jnjvm::dumpClassLoaderBundles()
 {
 	for (bundleClassLoadersType::const_iterator i = bundleClassLoaders.begin(), e = bundleClassLoaders.end(); i != e; ++i) {
@@ -163,18 +140,6 @@ extern "C" void Java_j3_vm_OSGi_notifyBu
 
 #endif
 }
-
-extern "C" void Java_j3_vm_OSGi_notifyServiceUnregistered(jlong bundleID, JavaObjectClass* classObject)
-{
-	llvm_gcroot(classObject, 0);
-
-#if RESET_STALE_REFERENCES
-
-	Jnjvm* vm = JavaThread::get()->getJVM();
-	vm->notifyServiceUnregistered(bundleID, classObject);
-
-#endif
-}
 
 extern "C" void Java_j3_vm_OSGi_setBundleStaleReferenceCorrected(jlong bundleID, jboolean corrected)
 {

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp?rev=180521&r1=180520&r2=180521&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp Thu Apr 25 12:19:35 2013
@@ -40,6 +40,17 @@ void Jnjvm::resetReferenceIfStale(const
 
 	// 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)
@@ -48,6 +59,17 @@ void Jnjvm::resetReferenceIfStale(const
 
 	// 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)
@@ -58,9 +80,8 @@ void Jnjvm::resetReferenceIfStale(const
 
 	if (source) {
 		CommonClass* ccl = JavaObject::getClass(source);
-		if (ccl->isClass() || ccl->isInterface())
-			if (ccl->asClass()->isZombie())
-				cerr << "WARNING: Source object is stale source=" << *source << endl;
+		if (ccl->classLoader->isZombie())
+			cerr << "WARNING: Source object is stale source=" << *source << endl;
 	}
 
 #endif
@@ -68,8 +89,7 @@ void Jnjvm::resetReferenceIfStale(const
 	CommonClass* ccl = JavaObject::getClass(*ref);
 	assert (ccl && "Object Class is not null.");
 
-	if (!ccl->isClass() && !ccl->isInterface()) return;
-	if (!ccl->asClass()->isZombie()) return;
+	if (!ccl->classLoader->isZombie()) return;
 
 #if DEBUG_VERBOSE_STALE_REF
 





More information about the vmkit-commits mailing list