[vmkit-commits] [vmkit] r191887 - Improve debugging and tracing of objects and references.

Koutheir Attouchi koutheir at gmail.com
Thu Oct 3 04:31:36 PDT 2013


Author: koutheir
Date: Thu Oct  3 06:31:35 2013
New Revision: 191887

URL: http://llvm.org/viewvc/llvm-project?rev=191887&view=rev
Log:
Improve debugging and tracing of objects and references.

Modified:
    vmkit/branches/incinerator/incinerator/knopflerfish.patch
    vmkit/branches/incinerator/incinerator/osgi/src/j3/J3Mgr.java
    vmkit/branches/incinerator/incinerator/osgi/src/j3/vm/OSGi.java
    vmkit/branches/incinerator/incinerator/osgi/src/j3mgr/J3MgrImpl.java
    vmkit/branches/incinerator/incinerator/tests/debug.txt
    vmkit/branches/incinerator/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp
    vmkit/branches/incinerator/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h
    vmkit/branches/incinerator/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp
    vmkit/branches/incinerator/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h
    vmkit/branches/incinerator/lib/j3/VMCore/Incinerator.cpp
    vmkit/branches/incinerator/lib/j3/VMCore/Incinerator.h
    vmkit/branches/incinerator/lib/j3/VMCore/JavaClass.cpp
    vmkit/branches/incinerator/lib/j3/VMCore/JavaObject.cpp
    vmkit/branches/incinerator/lib/j3/VMCore/JavaObject.h
    vmkit/branches/incinerator/lib/j3/VMCore/JavaString.cpp
    vmkit/branches/incinerator/lib/j3/VMCore/JavaString.h

Modified: vmkit/branches/incinerator/incinerator/knopflerfish.patch
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/incinerator/knopflerfish.patch?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/incinerator/knopflerfish.patch (original)
+++ vmkit/branches/incinerator/incinerator/knopflerfish.patch Thu Oct  3 06:31:35 2013
@@ -1,6 +1,6 @@
-diff -U 4 -H -d -p -r -N -- a/osgi/framework/src/j3/vm/OSGi.java b/osgi/framework/src/j3/vm/OSGi.java
+diff -U 4 -H -d -p -r -N -- knopflerfish.verbatim/osgi/framework/src/j3/vm/OSGi.java knopflerfish/osgi/framework/src/j3/vm/OSGi.java
 --- a/osgi/framework/src/j3/vm/OSGi.java	1970-01-01 01:00:00.000000000 +0100
-+++ b/osgi/framework/src/j3/vm/OSGi.java	2013-07-03 17:15:27.382558975 +0200
++++ b/osgi/framework/src/j3/vm/OSGi.java	2013-09-26 12:05:27.000000000 +0200
 @@ -0,0 +1,6 @@
 +package j3.vm;
 +
@@ -8,26 +8,26 @@ diff -U 4 -H -d -p -r -N -- a/osgi/frame
 +{
 +	public static native void setBundleClassLoader(long bundleID, ClassLoader loaderObject);
 +}
-diff -U 4 -H -d -p -r -N -- a/osgi/framework/src/org/knopflerfish/framework/BundleGeneration.java b/osgi/framework/src/org/knopflerfish/framework/BundleGeneration.java
---- a/osgi/framework/src/org/knopflerfish/framework/BundleGeneration.java	2013-07-03 17:24:51.446553603 +0200
-+++ b/osgi/framework/src/org/knopflerfish/framework/BundleGeneration.java	2013-07-03 17:17:48.950557625 +0200
-@@ -162,8 +162,9 @@ public class BundleGeneration implements
-     lazyExcludes = null;
+diff -U 4 -H -d -p -r -N -- knopflerfish.verbatim/osgi/framework/src/org/knopflerfish/framework/BundleGeneration.java knopflerfish/osgi/framework/src/org/knopflerfish/framework/BundleGeneration.java
+--- a/osgi/framework/src/org/knopflerfish/framework/BundleGeneration.java	2013-10-01 09:37:41.702234351 +0200
++++ b/osgi/framework/src/org/knopflerfish/framework/BundleGeneration.java	2013-10-01 09:52:27.346257030 +0200
+@@ -208,8 +208,9 @@ public class BundleGeneration implements
      timeStamp = System.currentTimeMillis();
      bpkgs = new BundlePackages(this, exportStr);
+     bundleRevision = new BundleRevisionImpl(this);
      classLoader = b.getClassLoader();
 +    j3.vm.OSGi.setBundleClassLoader(bundle.getBundleId(), classLoader);
+     processCapabilities(capabilityStr);
    }
  
  
-   /**
-@@ -440,8 +441,9 @@ public class BundleGeneration implements
+@@ -513,8 +514,9 @@ public class BundleGeneration implements
              }
            }
- 	}
+         }
          classLoader = bundle.secure.newBundleClassLoader(this);
 +        j3.vm.OSGi.setBundleClassLoader(bundle.getBundleId(), classLoader);
  
          return true;
        }
-       if (fragments != null) {
+       if (isFragmentHost()) {

Modified: vmkit/branches/incinerator/incinerator/osgi/src/j3/J3Mgr.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/incinerator/osgi/src/j3/J3Mgr.java?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/incinerator/osgi/src/j3/J3Mgr.java (original)
+++ vmkit/branches/incinerator/incinerator/osgi/src/j3/J3Mgr.java Thu Oct  3 06:31:35 2013
@@ -17,4 +17,5 @@ public interface J3Mgr
 	public void isBundleStaleReferenceCorrected(
 		String bundleNameOrID) throws Throwable;
 	public void forceStaleReferenceScanning() throws Throwable;
+	public void forceSoftReferencesCollection();
 }

Modified: vmkit/branches/incinerator/incinerator/osgi/src/j3/vm/OSGi.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/incinerator/osgi/src/j3/vm/OSGi.java?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/incinerator/osgi/src/j3/vm/OSGi.java (original)
+++ vmkit/branches/incinerator/incinerator/osgi/src/j3/vm/OSGi.java Thu Oct  3 06:31:35 2013
@@ -4,7 +4,7 @@ public class OSGi
 {
 	// OSGi hooks and information gathering
 	public static native void setBundleClassLoader(long bundleID, ClassLoader loaderObject);
-    public static native void notifyBundleUninstalled(long bundleID);
+	public static native void notifyBundleUninstalled(long bundleID);
 	
 	// Commands
     public static native void setBundleStaleReferenceCorrected(long bundleID, boolean corrected);

Modified: vmkit/branches/incinerator/incinerator/osgi/src/j3mgr/J3MgrImpl.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/incinerator/osgi/src/j3mgr/J3MgrImpl.java?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/incinerator/osgi/src/j3mgr/J3MgrImpl.java (original)
+++ vmkit/branches/incinerator/incinerator/osgi/src/j3mgr/J3MgrImpl.java Thu Oct  3 06:31:35 2013
@@ -1,5 +1,7 @@
 package j3mgr;
 
+import java.util.ArrayList;
+
 import j3.J3Mgr;
 
 import org.osgi.framework.Bundle;
@@ -134,4 +136,21 @@ public class J3MgrImpl
 	{
 		j3.vm.OSGi.forceStaleReferenceScanning();
 	}
+
+	public void forceSoftReferencesCollection()
+	{
+		// In short, try to cause an OutOfMemory Exception
+		int maxmem = (int)Runtime.getRuntime().maxMemory();
+		ArrayList<Short[]> dummy = new ArrayList<Short[]>();
+		
+		try {
+			for (;;) {
+				dummy.add(new Short[maxmem]);
+			}
+		} catch (Throwable e) {
+		} finally {
+			dummy = null;
+			System.gc();
+		}
+	}
 }

Modified: vmkit/branches/incinerator/incinerator/tests/debug.txt
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/incinerator/tests/debug.txt?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/incinerator/tests/debug.txt (original)
+++ vmkit/branches/incinerator/incinerator/tests/debug.txt Thu Oct  3 06:31:35 2013
@@ -1,3 +1,4 @@
+-X:gc:verbose=0 -jar framework.jar -xargs /home/koutheir/PhD/VMKit/incinerator/incinerator/tests/minimal.bug.xargs
 framework call j3.J3Mgr setBundleStaleReferenceCorrected ijvm.tests.AImpl yes
 framework call j3.J3Mgr setBundleStaleReferenceCorrected ijvm.tests.BImpl yes
 framework call j3.J3Mgr setBundleStaleReferenceCorrected ijvm.tests.CImpl yes
@@ -41,3 +42,11 @@ STALE = {http/http_all-3.1.2.jar, userad
 call j3.J3Mgr forceStaleReferenceScanning
 
 fromupdate 15 file:/media/Data/Documents/PhD/VMKit/incinerator/incinerator/tests/ijvm.tests.Alarm_v2.0/out/ijvm.tests.Alarm_v2.0-2.0.0.jar
+
+enter framework
+start 13
+stop 13
+uninstall 13
+refresh
+meminfo -gc
+call j3.J3Mgr dumpReferencesToObject 

Modified: vmkit/branches/incinerator/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp (original)
+++ vmkit/branches/incinerator/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp Thu Oct  3 06:31:35 2013
@@ -206,6 +206,7 @@ JavaMethod* Classpath::InitArithmeticExc
 JavaMethod* Classpath::InitCloneNotSupportedException;
 JavaMethod* Classpath::InitObject;
 JavaMethod* Classpath::FinalizeObject;
+JavaMethod* Classpath::toString;
 JavaMethod* Classpath::IntToString;
 
 JavaMethod* Classpath::SystemArraycopy;
@@ -905,6 +906,9 @@ void Classpath::initialiseClasspath(Jnjv
   
   FinalizeObject = UPCALL_METHOD(loader, "java/lang/Object", "finalize", "()V",
                                  ACC_VIRTUAL);
+
+  toString = UPCALL_METHOD(loader, "java/lang/Object", "toString",
+          "()Ljava/lang/String;", ACC_VIRTUAL);
   
   IntToString = UPCALL_METHOD(loader, "java/lang/Integer", "toString",
                               "(II)Ljava/lang/String;", ACC_STATIC);

Modified: vmkit/branches/incinerator/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h (original)
+++ vmkit/branches/incinerator/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h Thu Oct  3 06:31:35 2013
@@ -251,6 +251,7 @@ public:
 
   ISOLATE_STATIC JavaMethod* InitObject;
   ISOLATE_STATIC JavaMethod* FinalizeObject;
+  ISOLATE_STATIC JavaMethod* toString;
 
   ISOLATE_STATIC JavaMethod* ErrorWithExcpNoClassDefFoundError;
   ISOLATE_STATIC JavaMethod* ErrorWithExcpExceptionInInitializerError;

Modified: vmkit/branches/incinerator/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp (original)
+++ vmkit/branches/incinerator/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp Thu Oct  3 06:31:35 2013
@@ -197,6 +197,7 @@ JavaMethod* Classpath::InitArithmeticExc
 JavaMethod* Classpath::InitCloneNotSupportedException;
 JavaMethod* Classpath::InitObject;
 JavaMethod* Classpath::FinalizeObject;
+JavaMethod* Classpath::toString;
 JavaMethod* Classpath::IntToString;
 
 JavaMethod* Classpath::SystemArraycopy;
@@ -787,6 +788,9 @@ void Classpath::initialiseClasspath(Jnjv
   FinalizeObject = UPCALL_METHOD(loader, "java/lang/Object", "finalize", "()V",
                                  ACC_VIRTUAL);
 
+  toString = UPCALL_METHOD(loader, "java/lang/Object", "toString",
+          "()Ljava/lang/String;", ACC_VIRTUAL);
+
   IntToString = UPCALL_METHOD(loader, "java/lang/Integer", "toString",
                               "(II)Ljava/lang/String;", ACC_STATIC);
 

Modified: vmkit/branches/incinerator/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h (original)
+++ vmkit/branches/incinerator/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h Thu Oct  3 06:31:35 2013
@@ -240,6 +240,7 @@ public:
 
   ISOLATE_STATIC JavaMethod* InitObject;
   ISOLATE_STATIC JavaMethod* FinalizeObject;
+  ISOLATE_STATIC JavaMethod* toString;
 
   ISOLATE_STATIC JavaMethod* ErrorWithExcpNoClassDefFoundError;
   ISOLATE_STATIC JavaMethod* ErrorWithExcpExceptionInInitializerError;

Modified: vmkit/branches/incinerator/lib/j3/VMCore/Incinerator.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/lib/j3/VMCore/Incinerator.cpp?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/lib/j3/VMCore/Incinerator.cpp (original)
+++ vmkit/branches/incinerator/lib/j3/VMCore/Incinerator.cpp Thu Oct  3 06:31:35 2013
@@ -12,8 +12,6 @@
 
 #if RESET_STALE_REFERENCES
 
-#define DEBUG_VERBOSE_STALE_REF		0
-
 using namespace std;
 
 namespace j3 {
@@ -22,8 +20,12 @@ Incinerator::Incinerator(Jnjvm* j3vm) :
 	scanRef(Incinerator::scanRef_Disabled),
 	scanStackRef(Incinerator::scanStackRef_Disabled),
 	vm(j3vm),
-	needsStaleRefRescan(false),
-	findReferencesToObject(NULL) {}
+	needsStaleRefRescan(false)
+#if DEBUG_OBJECT_REF_DUMPING
+	, findReferencesToObject(NULL)
+#endif
+{
+}
 
 Incinerator::~Incinerator()
 {
@@ -171,12 +173,32 @@ void Incinerator::classLoaderUnloaded(Jn
 #endif
 }
 
-void Incinerator::dumpReferencesToObject(JavaObject* object) const
+#if DEBUG_OBJECT_REF_DUMPING
+
+void Incinerator::dumpReferencesToObject(const JavaObject* object)
 {
-	findReferencesToObject = object;
-	vmkit::Collector::collect();
+	pendingRefObject.clear();
+	pendingRefObject.push_back(object);
+	seenObjects.clear();
+
+	const JavaObject* obj = NULL;
+	do {
+		obj = pendingRefObject.back();
+		pendingRefObject.pop_back();
+		seenObjects.insert(obj);
+
+		cerr << "dumpReferencesToObject: " << *obj << ", toString=";
+		obj->dumpToString();
+
+		findReferencesToObject = obj;
+		foundReferencerObjects.clear();
+		setScanningInclusive();
+		vmkit::Collector::collect();
+	} while (!pendingRefObject.empty());
 }
 
+#endif
+
 void Incinerator::forceStaleReferenceScanning()
 {
 	setScanningInclusive();
@@ -194,7 +216,7 @@ void Incinerator::setScanningDisabled()
 	scanStackRef = Incinerator::scanStackRef_Disabled;
 
 #if DEBUG_VERBOSE_STALE_REF
-	cerr << "Looking for stale references done." << endl;
+	cerr << "References scan done." << endl;
 #endif
 }
 
@@ -204,34 +226,43 @@ void Incinerator::setScanningInclusive()
 	scanStackRef = Incinerator::scanStackRef_Inclusive;
 
 #if DEBUG_VERBOSE_STALE_REF
-	cerr << "Looking for stale references..." << endl;
+	cerr << "References scan enabled." << endl;
 #endif
 }
 
 void Incinerator::setScanningExclusive()
 {
+#if DEBUG_EXCLUDE_FINALIZABLE_STALE_OBJECTS
 	scanRef = Incinerator::scanRef_Exclusive;
 	scanStackRef = Incinerator::scanStackRef_Exclusive;
 
 #if DEBUG_VERBOSE_STALE_REF
 	cerr << "Excluding stale references..." << endl;
 #endif
+
+#endif
 }
 
 void Incinerator::beforeCollection()
 {
+#if DEBUG_OBJECT_REF_DUMPING
 	if (findReferencesToObject != NULL)
 		foundReferencerObjects.clear();
+#endif
 
 #if DEBUG_VERBOSE_STALE_REF
 	if (needsStaleRefRescan) {
 		cerr << "Some stale references were previously ignored due to"
-				" finalizable stale objects."
-				" Scanning for stale references enabled." << endl;
+				" finalizable stale objects." << endl;
 	}
 #endif
 
-	if (!needsStaleRefRescan && !isScanningEnabled()) return;
+	if (!needsStaleRefRescan && !isScanningEnabled()) {
+#if DEBUG_OBJECT_REF_DUMPING
+		if (!findReferencesToObject)
+#endif
+			return;
+	}
 
 	needsStaleRefRescan = false;
 	setScanningInclusive();
@@ -239,6 +270,10 @@ void Incinerator::beforeCollection()
 
 void Incinerator::markingFinalizersDone()
 {
+#if DEBUG_OBJECT_REF_DUMPING
+	if (findReferencesToObject != NULL) return;
+#endif
+
 	if (!isScanningEnabled()) return;
 	setScanningExclusive();
 }
@@ -256,7 +291,9 @@ void Incinerator::collectorPhaseComplete
 
 void Incinerator::afterCollection()
 {
+#if DEBUG_OBJECT_REF_DUMPING
 	findReferencesToObject = NULL;
+#endif
 
 	if (!isScanningEnabled()) return;
 
@@ -273,12 +310,21 @@ void Incinerator::afterCollection()
 bool Incinerator::isStaleObject(const JavaObject* obj)
 {
 	llvm_gcroot(obj, 0);
-	if (!obj || isVMObject(obj)) return false;
 
-	CommonClass* ccl = JavaObject::getClass(obj);
-	assert (ccl && "Object Class is not null.");
+	if (!obj) return false;
+
+	const JnjvmClassLoader* loader = NULL;
+	if (VMClassLoader::isVMClassLoader(obj)) {
+		loader = ((const VMClassLoader*)obj)->getClassLoader();
+	} else if (VMStaticInstance::isVMStaticInstance(obj)) {
+		loader = ((const VMStaticInstance*)obj)->getOwningClass()->classLoader;
+	} else {
+		CommonClass* ccl = JavaObject::getClass(obj);
+		assert (ccl && "Object Class is not null.");
+
+		loader = ccl->classLoader;
+	}
 
-	JnjvmClassLoader* loader = ccl->classLoader;
 	return loader->isStale() && loader->isStaleReferencesCorrectionEnabled();
 }
 
@@ -319,12 +365,51 @@ bool Incinerator::scanRef_Inclusive(Inci
 {
 	llvm_gcroot(source, 0);
 
-	if (!ref || !isStaleObject(*ref)) return true;
+	if (!ref) return true;
+
+#if DEBUG_OBJECT_REF_DUMPING
+	if (incinerator.findReferencesToObject != NULL) {
+		if (incinerator.findReferencesToObject == *ref) {
+			if (!source) {
+				cout << *ref << " <-- (unknown)" << endl;
+			} else {
+				if (incinerator.foundReferencerObjects.insert(source).second) {
+					cout << *ref << " <-- " << *source << endl;
+
+					if (incinerator.seenObjects.find(source) == incinerator.seenObjects.end()) {
+						// The source ref was not scanned before
+						std::deque<const JavaObject*>::iterator
+							b = incinerator.pendingRefObject.begin(),
+							e = incinerator.pendingRefObject.end();
+
+						if (std::find(b, e, source) == e) {
+							// The source ref is not currently pending for scan
+							incinerator.pendingRefObject.push_front(source);
+						}
+					}
+				}
+			}
+		}
+		return true;
+	}
+#endif
+
+	if (!isStaleObject(*ref)) return true;
 
 #if DEBUG_VERBOSE_STALE_REF
-	cerr << "Stale ref: " << ref << "==>" << **ref << endl;
+	if (isVMObject(*ref))
+		cerr << "Stale ref (VMObject): ";
+	else
+		cerr << "Stale ref: ";
+
+	cerr << ref << " ==> " << **ref;
+	if (source) cerr << " source=" << *source;
+	cerr << endl;
 #endif
 
+	if (isVMObject(*ref))
+		return true;
+
 	// Queue the stale reference to be eliminated.
 	incinerator.staleRefList[ref] = source;
 
@@ -334,6 +419,14 @@ bool Incinerator::scanRef_Inclusive(Inci
 
 bool Incinerator::scanStackRef_Inclusive(Incinerator& incinerator, const JavaMethod* method, JavaObject** ref)
 {
+#if DEBUG_OBJECT_REF_DUMPING
+	if (ref != NULL && incinerator.findReferencesToObject != NULL) {
+		if (incinerator.findReferencesToObject == *ref) {
+			cout << "On stack of method=" << *method->name << " ,class=" << *method->classDef << endl;
+		}
+	}
+#endif
+
 #if DEBUG_VERBOSE_STALE_REF
 	if (!ref || !(*ref)) return true;
 	if (method && method->classDef->name->elements[0] == 'i')
@@ -358,9 +451,12 @@ bool Incinerator::scanRef_Exclusive(Inci
 
 #if DEBUG_VERBOSE_STALE_REF
 		if (!removed)
-			cerr << "Stale ref (ignored): " << ref << "==>" << **ref << endl;
+			cerr << "Stale ref (ignored): " << ref << " ==> " << **ref;
 		else
-			cerr << "Excluded stale ref: " << ref << "==>" << **ref << endl;
+			cerr << "Excluded stale ref: " << ref << " ==> " << **ref;
+
+		if (source) cerr << " source=" << *source;
+		cerr << endl;
 #endif
 	}
 	return true;	// Trace this reference.
@@ -379,6 +475,9 @@ bool Incinerator::scanStackRef_Exclusive
 
 void Incinerator::eliminateStaleRef(const JavaObject *source, JavaObject** ref)
 {
+	if (isVMObject(*ref))
+		return;
+
 	CommonClass* ccl = JavaObject::getClass(*ref);
 	assert (ccl && "Object Class is not null.");
 
@@ -430,13 +529,17 @@ extern "C" jboolean Java_j3_vm_OSGi_isBu
 #endif
 }
 
+#if DEBUG_OBJECT_REF_DUMPING
+
 extern "C" void Java_j3_vm_OSGi_dumpReferencesToObject(jlong obj)
 {
 #if RESET_STALE_REFERENCES
-	j3::Incinerator::get()->dumpReferencesToObject(reinterpret_cast<j3::JavaObject*>(obj));
+	j3::Incinerator::get()->dumpReferencesToObject(reinterpret_cast<const j3::JavaObject*>(obj));
 #endif
 }
 
+#endif
+
 extern "C" void Java_j3_vm_OSGi_forceStaleReferenceScanning()
 {
 #if RESET_STALE_REFERENCES

Modified: vmkit/branches/incinerator/lib/j3/VMCore/Incinerator.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/lib/j3/VMCore/Incinerator.h?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/lib/j3/VMCore/Incinerator.h (original)
+++ vmkit/branches/incinerator/lib/j3/VMCore/Incinerator.h Thu Oct  3 06:31:35 2013
@@ -9,8 +9,14 @@
 #include <map>
 #include <list>
 #include <vector>
+#include <set>
+#include <deque>
 #include <stdint.h>
 
+#define DEBUG_VERBOSE_STALE_REF		1
+#define DEBUG_EXCLUDE_FINALIZABLE_STALE_OBJECTS		0
+#define DEBUG_OBJECT_REF_DUMPING	0
+
 namespace j3 {
 
 class Jnjvm;
@@ -30,9 +36,12 @@ public:
 	void setBundleStaleReferenceCorrected(OSGiGateway::bundle_id_t bundleID, bool corrected);
 	bool isBundleStaleReferenceCorrected(OSGiGateway::bundle_id_t bundleID) const;
 	void dumpClassLoaderBundles() const;
-	void dumpReferencesToObject(JavaObject* object) const;
 	void forceStaleReferenceScanning();
 
+#if DEBUG_OBJECT_REF_DUMPING
+	void dumpReferencesToObject(const JavaObject* object);
+#endif
+
 	OSGiGateway::bundle_id_t getClassLoaderBundleID(JnjvmClassLoader const * loader) const;
 	void setBundleClassLoader(OSGiGateway::bundle_id_t bundleID, JnjvmClassLoader* loader);
 
@@ -96,8 +105,15 @@ protected:
 	StaleRefListType staleRefList;
 	bool needsStaleRefRescan;
 
-	mutable JavaObject* findReferencesToObject;
-	std::vector<const JavaObject*> foundReferencerObjects;
+#if DEBUG_OBJECT_REF_DUMPING
+
+	mutable const JavaObject* findReferencesToObject;
+	std::set<const JavaObject*> foundReferencerObjects;
+
+	std::deque<const JavaObject*> pendingRefObject;
+	std::set<const JavaObject*> seenObjects;
+
+#endif
 };
 
 class IncineratorManagedClassLoader
@@ -134,7 +150,10 @@ public:
 
 extern "C" void Java_j3_vm_OSGi_setBundleStaleReferenceCorrected(jlong bundleID, jboolean corrected);
 extern "C" jboolean Java_j3_vm_OSGi_isBundleStaleReferenceCorrected(jlong bundleID);
-extern "C" void Java_j3_vm_OSGi_dumpReferencesToObject(jlong obj);
 extern "C" void Java_j3_vm_OSGi_forceStaleReferenceScanning();
 
+#if DEBUG_OBJECT_REF_DUMPING
+extern "C" void Java_j3_vm_OSGi_dumpReferencesToObject(jlong obj);
+#endif
+
 #endif

Modified: vmkit/branches/incinerator/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/lib/j3/VMCore/JavaClass.cpp?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/branches/incinerator/lib/j3/VMCore/JavaClass.cpp Thu Oct  3 06:31:35 2013
@@ -2349,8 +2349,8 @@ void JavaField::setStaticField(JavaObjec
 
 std::ostream& j3::operator << (std::ostream& os, const CommonClass& ccl)
 {
-	os << *ccl.name;
-	return (!ccl.super) ? (os << ';') : (os << ':' << *ccl.super);
+	return os << *ccl.name << ';';
+//	return (!ccl.super) ? (os << ';') : (os << ':' << *ccl.super);
 }
 
 void CommonClass::dump() const

Modified: vmkit/branches/incinerator/lib/j3/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/lib/j3/VMCore/JavaObject.cpp?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/lib/j3/VMCore/JavaObject.cpp (original)
+++ vmkit/branches/incinerator/lib/j3/VMCore/JavaObject.cpp Thu Oct  3 06:31:35 2013
@@ -387,9 +387,11 @@ bool JavaObject::instanceOf(JavaObject*
 std::ostream& j3::operator << (std::ostream& os, const JavaObject& obj)
 {
 	JavaObject* javaLoader = NULL;
-	const JavaString* threadNameObj = NULL;
+	const JavaString* jstr = NULL;
+	const JavaObjectVMThread* vmthObj = NULL;
 	llvm_gcroot(javaLoader, 0);
-	llvm_gcroot(threadNameObj, 0);
+	llvm_gcroot(jstr, 0);
+	llvm_gcroot(vmthObj, 0);
 
 	if (VMClassLoader::isVMClassLoader(&obj)) {
 		JnjvmClassLoader* loader = ((const VMClassLoader&)obj).getClassLoader();
@@ -416,24 +418,31 @@ std::ostream& j3::operator << (std::ostr
 		os << &obj << "(class=" << *ccl;
 
 		if (ccl == vm->upcalls->newThread) {
-			threadNameObj = static_cast<const JavaString*>(
+			jstr = static_cast<const JavaString*>(
 				vm->upcalls->threadName->getInstanceObjectField(
 					const_cast<JavaObject*>(&obj)));
 
-			char *threadName = JavaString::strToAsciiz(threadNameObj);
-			os << ",name=\"" << threadName << '\"';
-			delete [] threadName;
+			os << ",name=" << *jstr;
 		}
 #ifndef	 OpenJDKPath
 		else if (ccl == vm->upcalls->newVMThread) {
-			const JavaObjectVMThread& vmthObj = (const JavaObjectVMThread&)obj;
-			for (int retries = 10; (!vmthObj.vmdata) && (retries >= 0); --retries)
+			vmthObj = static_cast<const JavaObjectVMThread*>(&obj);
+			for (int retries = 10; (!vmthObj->vmdata) && (retries >= 0); --retries)
 				usleep(100);
 
-			if (const JavaObject* thObj = vmthObj.vmdata->currentThread())
+			if (const JavaObject* thObj = vmthObj->vmdata->currentThread())
 				os << ",thread=" << *thObj;
 		}
 #endif
+		else if (ccl == vm->upcalls->newClass) {
+			ccl = JavaObjectClass::getClass(
+				const_cast<JavaObjectClass*>(
+					static_cast<const JavaObjectClass*>(&obj)));
+
+			os << ",name=\"" << *ccl->asClass() << '\"';
+		} else if (ccl == vm->upcalls->newString) {
+			os << ',' << static_cast<const JavaString&>(obj);
+		}
 
 		os << ')';
 	}
@@ -450,3 +459,22 @@ void JavaObject::dumpClass() const
 {
 	JavaObject::getClass(this)->dump();
 }
+
+void JavaObject::dumpToString() const
+{
+	JavaString* jstr = NULL;
+	llvm_gcroot(jstr, 0);
+
+	if (VMClassLoader::isVMClassLoader(this) || VMStaticInstance::isVMStaticInstance(this))
+	{cerr << "<invalid>" << endl; return;}
+
+	Class* cl = JavaObject::getClass(this)->asClass();
+	if (!cl) {cerr << "<invalid>" << endl; return;}
+
+	Jnjvm* vm = cl->classLoader->getJVM();
+	jstr = static_cast<JavaString*>(
+		vm->upcalls->toString->invokeJavaObjectVirtual(
+			vm, cl, const_cast<JavaObject*>(this)));
+
+	cerr << *jstr << endl;
+}

Modified: vmkit/branches/incinerator/lib/j3/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/lib/j3/VMCore/JavaObject.h?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/lib/j3/VMCore/JavaObject.h (original)
+++ vmkit/branches/incinerator/lib/j3/VMCore/JavaObject.h Thu Oct  3 06:31:35 2013
@@ -334,6 +334,7 @@ public:
   void dumpClass() const __attribute__((noinline));
   void dump() const __attribute__((noinline));
   friend std::ostream& operator << (std::ostream&, const JavaObject&);
+  void dumpToString() const __attribute__((noinline));
 };
 
 

Modified: vmkit/branches/incinerator/lib/j3/VMCore/JavaString.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/lib/j3/VMCore/JavaString.cpp?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/lib/j3/VMCore/JavaString.cpp (original)
+++ vmkit/branches/incinerator/lib/j3/VMCore/JavaString.cpp Thu Oct  3 06:31:35 2013
@@ -120,4 +120,12 @@ const UTF8* JavaString::javaToInternal(c
   return res;
 }
 
+std::ostream& operator << (std::ostream& os, const JavaString& jstr)
+{
+	char *str = JavaString::strToAsciiz(&jstr);
+	os << '\"' << str << '\"';
+	delete [] str;
+	return os;
+}
+
 }

Modified: vmkit/branches/incinerator/lib/j3/VMCore/JavaString.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/incinerator/lib/j3/VMCore/JavaString.h?rev=191887&r1=191886&r2=191887&view=diff
==============================================================================
--- vmkit/branches/incinerator/lib/j3/VMCore/JavaString.h (original)
+++ vmkit/branches/incinerator/lib/j3/VMCore/JavaString.h Thu Oct  3 06:31:35 2013
@@ -62,6 +62,8 @@ class JavaString : public JavaObject {
 
   /// javaToInternal - Replaces all '/' into '.'.
   static const UTF8* javaToInternal(const JavaString* self, UTF8Map* map);
+
+  friend std::ostream& operator << (std::ostream&, const JavaString&);
 };
 
 } // end namespace j3





More information about the vmkit-commits mailing list