You are viewing a plain text version of this content. The canonical link for it is here.
Posted to kato-commits@incubator.apache.org by mo...@apache.org on 2009/05/13 16:44:20 UTC

svn commit: r774422 - in /incubator/kato/trunk/HprofBinaryReaderPOC: .classpath src/org/apache/kato/hprof/HProfView.java src/org/apache/kato/hprof/datalayer/HProfFile.java

Author: monteith
Date: Wed May 13 16:44:16 2009
New Revision: 774422

URL: http://svn.apache.org/viewvc?rev=774422&view=rev
Log:
Add threads support to hprof.

Modified:
    incubator/kato/trunk/HprofBinaryReaderPOC/.classpath
    incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HProfView.java
    incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/datalayer/HProfFile.java

Modified: incubator/kato/trunk/HprofBinaryReaderPOC/.classpath
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/.classpath?rev=774422&r1=774421&r2=774422&view=diff
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/.classpath (original)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/.classpath Wed May 13 16:44:16 2009
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="testsrc"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="testsrc"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Modified: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HProfView.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HProfView.java?rev=774422&r1=774421&r2=774422&view=diff
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HProfView.java (original)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/HProfView.java Wed May 13 16:44:16 2009
@@ -62,6 +62,9 @@
 	private HashMap<Integer,IJavaClass>  loadedClassesBySerial=new HashMap<Integer,IJavaClass>();
 	private HashMap<Long,IJavaClass>  loadedClassesByID=new HashMap<Long,IJavaClass>();
 	
+	// Thread ID Maps
+	private HashMap<Integer,IJavaThread> activeThreadsBySerial = new HashMap<Integer, IJavaThread>();
+	
 	public HProfView(HProfFile file) {
 		this.file = file;
 	}
@@ -97,22 +100,37 @@
 					// Remove a loaded class if it is subsequently unloaded.
 					loadedClassesBySerial.remove(((IUnloadClassHProfRecord)record).getClassSerialNumber());
 				} else if (record instanceof IThreadActiveHProfRecord) {
-					// SRDM add by serial number
-					threadRecordNO.add(new ActiveJavaThread(r));
+					ActiveJavaThread ajt = new ActiveJavaThread(r);
+
+					threadRecordNO.add( ajt );
+					
+					// add by serial number
+					activeThreadsBySerial.put(ajt.getThreadSerialNumber(), ajt);
 				} else if (record instanceof IThreadEndingHProfRecord) {
-					// SRDM remove thread by serial number.
+					InactiveJavaThread ijt = new InactiveJavaThread(r);
 					
-					threadRecordNO.add(new InactiveJavaThread(r));
-
+					threadRecordNO.add(ijt);
+					// remove thread by serial number.
+					//SRDM activeThreadsBySerial.remove(ijt.getThreadSerialNumber());
 				} else if (record instanceof IJavaStackTraceHProfRecord) {
-					// SRDM Stack traces should be attached to threads
+					// Stack traces should be attached to threads
 					// keep the most recent. Attach to thread so that when thread removed,
 					// stacktrace is removed too.
 					IJavaStackTraceHProfRecord stackTrace = (IJavaStackTraceHProfRecord) record;
 					int sn = stackTrace.getSerialNumber();
+					
 					stackTraces.put(sn, r);
 					javastacks.add(r);
-
+					
+					// Attach this stack trace to its thread if the thread
+					// exists and this trace is newer.
+					int threadSerial = stackTrace.getThreadSerialNumber();				
+					IJavaThread ajt = activeThreadsBySerial.get(threadSerial);
+					
+					if(ajt != null) {
+						((ActiveJavaThread)ajt).setStackTrace(stackTrace);
+					}
+					
 				} else if (record instanceof IJavaStackFrameHProfRecord) {
 					IJavaStackFrameHProfRecord frame = (IJavaStackFrameHProfRecord) record;
 					long id = frame.getStackFrameID();
@@ -668,21 +686,37 @@
 		public int getThreadSerialNumber() {
 			return getActiveJavaThreadRecord(ref).getThreadSerialNumber();
 		}
-
+		
+		private IJavaStackTraceHProfRecord stackTrace;
+		public void setStackTrace(IJavaStackTraceHProfRecord stackTrace) {
+			if (this.stackTrace == null) {
+				this.stackTrace = stackTrace;
+				return;
+			}
+			
+			if (this.stackTrace.getSerialNumber() < stackTrace.getSerialNumber()) {
+				this.stackTrace = stackTrace;
+			}
+		}
+		
 		@Override
 		public IJavaStack getStack() {
 			// stack trace record no
-			int sn = getStackTraceSerialNumber();
-			int recordId = stackTraces.get(sn);
-			IJavaStackTraceHProfRecord record = (IJavaStackTraceHProfRecord) file
-					.getRecord(recordId);
-			int stackElements = record.getFrameCount();
-			final IJavaStackFrame[] data = new IJavaStackFrame[stackElements];
-			for (int i = 0; i < stackElements; i++) {
-				long stackFrameElementID = record.getStackFrameID(i);
-				int stackRecord=stackTraceFrames.get(stackFrameElementID);
-				data[i]=new JavaStackFrame(stackRecord);
+			IJavaStackTraceHProfRecord record = stackTrace;
+
+			final IJavaStackFrame[] data;
+			if (record != null) { // There might not be any frames with this thread.
+				int stackElements = record.getFrameCount();
+				data = new IJavaStackFrame[stackElements];
+				for (int i = 0; i < stackElements; i++) {
+					long stackFrameElementID = record.getStackFrameID(i);
+					int stackRecord=stackTraceFrames.get(stackFrameElementID);
+					data[i]=new JavaStackFrame(stackRecord);
+				}
+			} else {
+				data = new IJavaStackFrame[0]; 
 			}
+			
 			IJavaStack stack = new IJavaStack() {
 
 				@Override
@@ -699,7 +733,6 @@
 
 			return stack;
 		}
-
 	}
 
 	private IThreadEndingHProfRecord getEndingJavaThreadRecord(int ref) {
@@ -774,4 +807,14 @@
 		
 		return heapRecordLocation;
 	}
+	
+	/**
+	 * Returns the IJavaThreads that are active, i.e.
+	 * haven't got corresponding END THREAD records.
+	 * 
+	 * @return Collection of active JavaThreads
+	 */
+	public Collection<IJavaThread> getActiveThreads() {
+		return activeThreadsBySerial.values();
+	}
 }

Modified: incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/datalayer/HProfFile.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/datalayer/HProfFile.java?rev=774422&r1=774421&r2=774422&view=diff
==============================================================================
--- incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/datalayer/HProfFile.java (original)
+++ incubator/kato/trunk/HprofBinaryReaderPOC/src/org/apache/kato/hprof/datalayer/HProfFile.java Wed May 13 16:44:16 2009
@@ -94,6 +94,19 @@
 			return readNumber(0, idSize);
 		}
 
+		/**
+		 * Check equality based on stack frame ID.
+		 */
+		public boolean equals(Object obj) {
+			if ((obj == null) || !(obj instanceof FrameHProfRecord)) {
+				return false;
+			}
+			
+			FrameHProfRecord record = (FrameHProfRecord) obj;
+			
+			return record.getStackFrameID() == getStackFrameID();
+		}
+
 	}
 
 	class HeapDumpHProfRecord extends HProfRecord implements