use of com.ibm.dtfj.java.javacore.JCJavaObject in project openj9 by eclipse.
the class JavaRuntimeBuilder method addJavaThread.
/**
* If successfully added a JavaThread, or updated an existing JavaThread, return the javathread, or otherwise
* throw an exception. Note that a javathread cannot be successfully added if no valid threadID is passed.
* <br><br>
* REQUIREMENT: Thread Id must be valid to properly create a Java Thread, or exception is thrown.
*
* @throws BuilderFailureException if arguments lead to an invalid DTFJ object, particularly an invalid threadID
* @return a non null JavaThread that was successfully added or updated.
*/
public JavaThread addJavaThread(ImageThread imageThread, String name, long tid, long j9thread_t, long javaObjID, long jniEnv, String state, int priority, long blockingObject, String blockingObjectClass) throws BuilderFailureException {
try {
if (j9thread_t != IBuilderData.NOT_AVAILABLE && jniEnv != IBuilderData.NOT_AVAILABLE) {
// Save the JNIEnv for later
ImagePointer pointer = fAddressSpace.getPointer(jniEnv);
j9ThreadToJNIEnv.put(new Long(j9thread_t), pointer);
}
if (!fAddressSpace.isValidAddressID(tid)) {
throw new JCInvalidArgumentsException("Must pass a valid thread id");
}
JCJavaThread javaThread = getJavaRuntime().findJavaThread(tid);
if (javaThread == null) {
ImagePointer pointer = fAddressSpace.getPointer(tid);
javaThread = new JCJavaThread(getJavaRuntime(), pointer);
}
javaThread.setName(name);
javaThread.setPriority(priority);
javaThread.setState(state);
javaThread.setImageThread((JCImageThread) imageThread);
if (jniEnv == IBuilderData.NOT_AVAILABLE) {
// Retrieve the JNIEnv
ImagePointer pointer = (ImagePointer) j9ThreadToJNIEnv.get(new Long(j9thread_t));
if (pointer != null) {
// Set it for 1.4.2
javaThread.setJNIEnv(pointer);
} else {
// Else TID for J9 seems to be JNIEnv
javaThread.setJNIEnv(javaThread.getThreadID());
}
}
/*
* Add the object only if the object ID is valid.
*/
if (fAddressSpace.isValidAddressID(javaObjID)) {
// Make the type just java.lang.Thread - later we can do better if there is a stack trace.
JCJavaClass jClass = generateJavaClass(getJavaRuntime(), "java/lang/Thread", IBuilderData.NOT_AVAILABLE);
ImagePointer pointerObjectID = fAddressSpace.getPointer(javaObjID);
JCJavaObject jobject = new JCJavaObject(pointerObjectID, jClass);
javaThread.setObject(jobject);
}
if (fAddressSpace.isValidAddressID(blockingObject)) {
JCJavaClass jClass = generateJavaClass(getJavaRuntime(), blockingObjectClass, IBuilderData.NOT_AVAILABLE);
ImagePointer pointerObjectID = fAddressSpace.getPointer(javaObjID);
JCJavaObject jobject = new JCJavaObject(pointerObjectID, jClass);
javaThread.setBlockingObject(jobject);
}
return javaThread;
} catch (JCInvalidArgumentsException e) {
throw new BuilderFailureException(e);
}
}
use of com.ibm.dtfj.java.javacore.JCJavaObject in project openj9 by eclipse.
the class JavaRuntimeBuilder method addJavaStackFrame.
/**
*/
public JavaStackFrame addJavaStackFrame(JavaThread javaThread, String className, String classFileName, String methodName, String methodType, String compilationLevel, int lineNumber) throws BuilderFailureException {
try {
JCJavaThread jThread = (JCJavaThread) javaThread;
JCJavaClass jclass = getJavaRuntime().findJavaClass(className);
if (jclass == null) {
jclass = new JCJavaClass(getJavaRuntime(), className);
}
JCJavaMethod method = new JCJavaMethod(methodName, jclass);
JCJavaLocation location = new JCJavaLocation(method);
location.setFilename(classFileName);
location.setCompilation(compilationLevel);
location.setLineNumber(lineNumber);
JCJavaStackFrame stackFrame = new JCJavaStackFrame(jThread, location);
if ("run".equals(methodName)) {
/*
* Perhaps the type of the thread is the type of the last run() method.
* Not strictly accurate if the class was extended without overriding run().
* Add the object only if the object ID is valid.
*/
try {
JavaObject jo = jThread.getObject();
if (jo != null) {
ImagePointer tid = jo.getID();
if (fAddressSpace.isValidAddressID(tid.getAddress())) {
JCJavaObject jobject = new JCJavaObject(tid, jclass);
jThread.setObject(jobject);
}
}
} catch (CorruptDataException e) {
// Ignore
}
}
return stackFrame;
} catch (JCInvalidArgumentsException e) {
throw new BuilderFailureException(e);
}
}
use of com.ibm.dtfj.java.javacore.JCJavaObject in project openj9 by eclipse.
the class JavaRuntimeBuilder method addClassLoader.
/**
* Must pass a valid class loader ID in order to generate a class loader object. Else exception
* is thrown.
*
* @param classLoaderName optional
* @param clID required, or else exception is throw and class loader is not created.
* @param objectID optional (although generally this is the same as the clID for most javacores)
* @return successfully created JavaClassLoader
* @throws BuilderFailureException if class loader ID is invalid.
*/
public JavaClassLoader addClassLoader(String classLoaderName, long clID, long objectID) throws BuilderFailureException {
try {
JCJavaClassLoader classLoader = getJavaRuntime().findJavaClassLoader(clID);
if (classLoader == null) {
classLoader = new JCJavaClassLoader(getJavaRuntime(), clID);
}
JCJavaObject javaObject = classLoader.getInternalObject();
if (javaObject == null) {
JCJavaClass javaClass = getJavaRuntime().findJavaClass(classLoaderName);
if (javaClass == null) {
javaClass = new JCJavaClass(getJavaRuntime(), classLoaderName);
}
ImagePointer objectPointer = fAddressSpace.getPointer(objectID);
javaObject = new JCJavaObject(objectPointer, javaClass);
classLoader.setObject(javaObject);
}
return classLoader;
} catch (JCInvalidArgumentsException e) {
throw new BuilderFailureException(e);
}
}
use of com.ibm.dtfj.java.javacore.JCJavaObject in project openj9 by eclipse.
the class JavaRuntimeBuilder method addJavaMonitor.
/**
* Required: monitor ID (throws exception if invalid)
* <br>
* Optional: object ID, class name, monitor name, owning thread
* @return successfully created JavaMonitor
* @throws BuilderFailureException if an invalid monitor ID is passed.
*/
public JavaMonitor addJavaMonitor(String monitorName, long monitorID, long objectID, String className, long owningThread) throws BuilderFailureException {
try {
JCJavaMonitor monitor = getJavaRuntime().findMonitor(monitorID);
if (monitor == null) {
ImagePointer pointerMonitorID = fAddressSpace.getPointer(monitorID);
monitor = new JCJavaMonitor(getJavaRuntime(), pointerMonitorID, monitorName);
}
monitor.setOwner(owningThread);
if (className != null) {
JCJavaClass jClass = generateJavaClass(getJavaRuntime(), className, IBuilderData.NOT_AVAILABLE);
/*
* Add the object only if the class is also present and object ID is valid.
*/
if (jClass != null && fAddressSpace.isValidAddressID(objectID)) {
ImagePointer pointerObjectID = fAddressSpace.getPointer(objectID);
JCJavaObject jobject = new JCJavaObject(pointerObjectID, jClass);
monitor.setObject(jobject);
}
}
return monitor;
} catch (JCInvalidArgumentsException e) {
throw new BuilderFailureException(e);
}
}
Aggregations