[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