[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