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 sp...@apache.org on 2009/05/11 10:10:55 UTC
svn commit: r773520 - in /incubator/kato/branches/experimental/PyJVMTI: ./
kato/JThread.py kato/JThreadGroup.py kato/__init__.py load.py pyjvmti.c
pyjvmti.h run.sh
Author: spoole
Date: Mon May 11 10:10:55 2009
New Revision: 773520
URL: http://svn.apache.org/viewvc?rev=773520&view=rev
Log:
more updates to pyjvmti - more jvmti methods exposed.
Modified:
incubator/kato/branches/experimental/PyJVMTI/ (props changed)
incubator/kato/branches/experimental/PyJVMTI/kato/JThread.py
incubator/kato/branches/experimental/PyJVMTI/kato/JThreadGroup.py
incubator/kato/branches/experimental/PyJVMTI/kato/__init__.py
incubator/kato/branches/experimental/PyJVMTI/load.py
incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c
incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h
incubator/kato/branches/experimental/PyJVMTI/run.sh
Propchange: incubator/kato/branches/experimental/PyJVMTI/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Mon May 11 10:10:55 2009
@@ -1 +1,3 @@
build
+
+kato.dump
Modified: incubator/kato/branches/experimental/PyJVMTI/kato/JThread.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/JThread.py?rev=773520&r1=773519&r2=773520&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/JThread.py (original)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/JThread.py Mon May 11 10:10:55 2009
@@ -13,6 +13,7 @@
#******************************************************************************"
import jvmti
+from kato.JThreadGroup import *
'''
Created on 2 May 2009
@@ -24,6 +25,9 @@
'''
info=None
threadid=0;
+ monitors=None
+ hasContendedMonitor=None
+ contendedMonitorID=None
def __init__(self,tid=0):
'''
@@ -50,27 +54,45 @@
return self.info[2]
@property
- def threadGroup(self):
+ def threadGroupID(self):
self.fill()
- return JThreadGroup(self.info[3])
+ return self.info[3]
@property
- def contextClassLoader(self):
+ def contextClassLoaderID(self):
self.fill()
- if self.info[4]==None:
- return None
+ return self.info[4]
+
+ @property
+ def ownedMonitorIDs(self):
+ if self.monitors==None :
+ self.monitors=jvmti.getOwnedMonitorInfo(self.threadid)
+ return self.monitors
+
+ @property
+ def contendedMonitor(self):
+ if self.hasContendedMonitor==None :
+ self.contendedMonitorID=jvmti.getCurrentContendedMonitor(self.threadid)
+ if self.contendedMonitorID==None :
+ self.hasContendedMonitor=False
+ else :
+ self.hasContendedMonitor=True
+
+ return self.contendedMonitorID
- return JClassLoader(self.info[4])
-
def __getstate__(self):
"""Return state values to be pickled."""
self.fill()
- return self.info
+ return [self.threadid,self.info,self.ownedMonitors,self.contendedMonitor]
def __setstate__(self, state):
"""Restore state from the unpickled state values."""
- self.info = state
+ self.threadid=state[0]
+ self.info = state[1]
+ self.monitors = state[2]
+ self.contendedMonitorID=state[3]
+ self.hasContendedMonitor= self.contendedMonitorID!=None
def __repr__(self):
- return "JThread id=%i name=%s" % (self.threadid , self.name)
+ return "JThread id=%i name=%s contendedMonitor %s" % (self.threadid , self.name,self.contendedMonitor)
\ No newline at end of file
Modified: incubator/kato/branches/experimental/PyJVMTI/kato/JThreadGroup.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/JThreadGroup.py?rev=773520&r1=773519&r2=773520&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/JThreadGroup.py (original)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/JThreadGroup.py Mon May 11 10:10:55 2009
@@ -16,8 +16,33 @@
class JThreadGroup(object):
- def __init__(self,threadid=0):
+ threadid=0
+ info=None
+
+ def __init__(self,tid=0):
'''
Constructor
'''
- info=jvmti.getThreadInfo(threadid);
\ No newline at end of file
+ self.threadid=tid;
+
+
+ def fill(self):
+
+ if info==None :
+ info=jvmti.getThreadGroupInfo(threadid)
+
+ def parentThreadGroupID(self):
+ fill()
+ return info[0]
+
+ def name(self):
+ fill()
+ return info[1]
+
+ def maxpriority(self):
+ fill()
+ return info[2]
+
+ def isdaemon(self):
+ fill()
+ return info[3]
Modified: incubator/kato/branches/experimental/PyJVMTI/kato/__init__.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/__init__.py?rev=773520&r1=773519&r2=773520&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/__init__.py (original)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/__init__.py Mon May 11 10:10:55 2009
@@ -1 +1,3 @@
-print "in init for org.kato.jvmti"
\ No newline at end of file
+
+
+
Modified: incubator/kato/branches/experimental/PyJVMTI/load.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/load.py?rev=773520&r1=773519&r2=773520&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/load.py (original)
+++ incubator/kato/branches/experimental/PyJVMTI/load.py Mon May 11 10:10:55 2009
@@ -9,5 +9,12 @@
print d
print "loaded"
-print d.getThreads()
+for t in d.getThreads() :
+ print "name=" ,t.name
+ print "priority=" , t.priority
+ print "thread id=",t.threadid
+ print "contendedMonitor=",t.contendedMonitorID
+ print "thread group=", t.threadGroup
+
+
\ No newline at end of file
Modified: incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c?rev=773520&r1=773519&r2=773520&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c (original)
+++ incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c Mon May 11 10:10:55 2009
@@ -45,6 +45,8 @@
}
+
+
static PyObject * jvmti_getStackTrace(PyObject *self, PyObject *args) {
@@ -67,7 +69,7 @@
jvmtiError err=(*jvmtiptr)->GetStackTrace(jvmtiptr,thread,jstart,jmax,info,&count);
- CHECK_OK("get stack trace")
+ CHECK_OK("get stack trace");
@@ -85,7 +87,7 @@
static PyObject * jvmti_getFrameCount(PyObject *self, PyObject *args) {
- CHECK_VALID()
+ CHECK_VALID();
// get required thread...
int threadID=0;
@@ -97,16 +99,43 @@
jvmtiError err=(*jvmtiptr)->GetFrameCount(jvmtiptr,thread,&count);
- CHECK_OK("get frame count")
+ CHECK_OK("get frame count");
return Py_BuildValue("i", count);
}
+/**
+ * Takes threadid and returns a python list of object ids
+ */
+static PyObject * jvmti_getCurrentContendedMonitor(PyObject *self, PyObject *args) {
+
+
+ CHECK_VALID();
+
+ // get required thread...
+ int threadID=0;
+
+ PyArg_ParseTuple(args, "i", &threadID);
+
+ jthread thread=(jthread)threadID;
+ jobject monitor;
+
+ jvmtiError err=(*jvmtiptr)->GetCurrentContendedMonitor(jvmtiptr,thread,&monitor);
+
+ CHECK_OK("get contended monitor");
+
+ return Py_BuildValue("i",monitor);
+
+}
+
+/**
+ * Takes threadid and returns a python list of object ids
+ */
static PyObject * jvmti_getOwnedMonitorInfo(PyObject *self, PyObject *args) {
- CHECK_VALID()
+ CHECK_VALID();
// get required thread...
int threadID=0;
@@ -119,7 +148,7 @@
jvmtiError err=(*jvmtiptr)->GetOwnedMonitorInfo(jvmtiptr,thread,&count,&monitors);
- CHECK_OK("get owned monitor info")
+ CHECK_OK("get owned monitor info");
PyObject* list= PyList_New(count);
@@ -136,7 +165,7 @@
static PyObject * jvmti_getThreadGroupInfo(PyObject *self, PyObject *args) {
- CHECK_VALID()
+ CHECK_VALID();
// get required threadgroup
int ID=0;
@@ -149,9 +178,9 @@
jvmtiError err=(*jvmtiptr)->GetThreadGroupInfo(jvmtiptr,threadGroup,&info);
- CHECK_OK("get threadGroup info")
+ CHECK_OK("get threadGroup info");
- PyObject *result=Py_BuildValue("s", info.name);
+ PyObject *result=Py_BuildValue("isiiii", info.parent,info.name,info.max_priority,info.is_daemon);
DEALLOC(info.name); // allocated by jvmti
@@ -159,7 +188,7 @@
}
static PyObject * jvmti_getTopThreadGroups(PyObject *self, PyObject *args) {
- CHECK_VALID()
+ CHECK_VALID();
@@ -168,7 +197,7 @@
jvmtiError err=(*jvmtiptr)->GetTopThreadGroups(jvmtiptr,&count,&groups);
- CHECK_OK("get Top Thread Groups")
+ CHECK_OK("get Top Thread Groups");
PyObject* list= PyList_New(count);
@@ -191,14 +220,14 @@
static PyObject * jvmti_getcapabilities(PyObject *self, PyObject *args) {
- CHECK_VALID()
+ CHECK_VALID();
jvmtiCapabilities capabilities;
jvmtiError err=(*jvmtiptr)->GetPotentialCapabilities(jvmtiptr,
&capabilities);
- CHECK_OK("get capabilities")
+ CHECK_OK("get capabilities");
return 0;
@@ -207,7 +236,7 @@
static PyObject *
jvmti_getThread(PyObject *self, PyObject *args)
{
- CHECK_VALID()
+ CHECK_VALID();
// get required thread...
int threadID=0;
@@ -219,7 +248,7 @@
jvmtiError err=(*jvmtiptr)->GetThreadInfo(jvmtiptr,thread,&info);
- CHECK_OK("get thread info")
+ CHECK_OK("get thread info");
PyObject *result=Py_BuildValue("siiii", info.name,info.priority,info.is_daemon,info.thread_group,info.context_class_loader);
@@ -232,7 +261,7 @@
jvmti_getAllThreads(PyObject *self, PyObject *args)
{
- CHECK_VALID()
+ CHECK_VALID();
if(jniptr==NULL) {
PyErr_SetString(PyExc_TypeError, "jni environment not present");
@@ -245,7 +274,7 @@
jvmtiError err=(*jvmtiptr)->GetAllThreads(jvmtiptr,&count,&threads);
- CHECK_OK("get all threads")
+ CHECK_OK("get all threads");
PyObject* list= PyList_New(count);
@@ -257,7 +286,7 @@
}
- DEALLOC(threads)
+ DEALLOC(threads);
return list;
@@ -268,14 +297,16 @@
static PyObject *
jvmti_getsystemproperties(PyObject *self, PyObject *args)
{
- CHECK_VALID()
+ CHECK_VALID();
- jint count=0;
+ jint countj=0;
char **ptr=NULL;
- jvmtiError err=(*jvmtiptr)->GetSystemProperties(jvmtiptr,&count,&ptr);
+ jvmtiError err=(*jvmtiptr)->GetSystemProperties(jvmtiptr,&countj,&ptr);
+
+ CHECK_OK("get system properties");
- CHECK_OK("get system properties")
+ int count=count;
PyObject *pDict = PyDict_New(); // new reference
@@ -289,7 +320,7 @@
err=(*jvmtiptr)->GetSystemProperty(jvmtiptr,name,&value);
- CHECK_OK("get system property")
+ CHECK_OK("get system property");
// add to dictionary
@@ -297,19 +328,13 @@
// release storage
-
- err=(*jvmtiptr)->Deallocate(jvmtiptr,value);
-
- CHECK_OK("jvmti dealloc failed for system property value")
+ DEALLOC(value);
}
// release property names storage
-
- err=(*jvmtiptr)->Deallocate(jvmtiptr,ptr);
-
- CHECK_OK("jvmti dealloc failed")
+ DEALLOC(ptr);
return pDict;
@@ -319,35 +344,204 @@
{
-CHECK_VALID()
+CHECK_VALID();
jlong result=0;
jvmtiError err=(*jvmtiptr)->GetTime(jvmtiptr,&result);
- CHECK_OK("GetTime")
+ CHECK_OK("GetTime");
return Py_BuildValue("l", result);
}
+/**
+ * Get Local Variable that is an Object
+ */
+
+static PyObject *
+jvmti_getLocalObject(PyObject *self, PyObject *args)
+{
+
+
+CHECK_VALID();
+
+ int threadID=0;
+ int depth=0;
+ int slot=0;
+
+ PyArg_ParseTuple(args, "iii", &threadID,&depth,&slot);
+
+ jthread threadj=(jthread)threadID;
+ jint depthj=depth;
+ jint slotj=slot;
+ jobject result;
+
+ jvmtiError err=(*jvmtiptr)->GetLocalObject(jvmtiptr,threadj,depthj,slotj,&result);
+
+ CHECK_OK("GetLocalObject");
+
+ return Py_BuildValue("l", result);
+}
+
+/**
+ * Get Local Variable that is an Integer
+ */
+static PyObject *
+jvmti_getLocalInt(PyObject *self, PyObject *args)
+{
-static PyMethodDef JvmtiMethods[] = {
+CHECK_VALID();
- {"getTime", jvmti_gettime, METH_VARARGS, "Get JVMTI Time."},
+ int threadID=0;
+ int depth=0;
+ int slot=0;
- {"getSystemProperties", jvmti_getsystemproperties, METH_VARARGS, "Get JVMTI System Properties."},
+ PyArg_ParseTuple(args, "iii", &threadID,&depth,&slot);
+
+ jthread threadj=(jthread)threadID;
+ jint depthj=depth;
+ jint slotj=slot;
+ jint result;
+
+ jvmtiError err=(*jvmtiptr)->GetLocalInt(jvmtiptr,threadj,depthj,slotj,&result);
+
+ CHECK_OK("GetLocalInt");
+
+ return Py_BuildValue("l", result);
+}
+/**
+ * Get Local Variable that is an Integer
+ */
+
+static PyObject *
+jvmti_getLocalLong(PyObject *self, PyObject *args)
+{
+
+
+CHECK_VALID();
+
+ int threadID=0;
+ int depth=0;
+ int slot=0;
+
+ PyArg_ParseTuple(args, "iii", &threadID,&depth,&slot);
+
+ jthread threadj=(jthread)threadID;
+ jint depthj=depth;
+ jint slotj=slot;
+ jlong result;
+
+ jvmtiError err=(*jvmtiptr)->GetLocalLong(jvmtiptr,threadj,depthj,slotj,&result);
+
+ CHECK_OK("GetLocalLong");
+
+ return Py_BuildValue("l", result);
+}
+
+/**
+ * Get method name , signature and generic signature
+ * returned as typle of strings
+ */
+
+static PyObject *
+jvmti_getMethodName(PyObject *self, PyObject *args)
+{
+
+
+
+ CHECK_VALID();
+
+ int methodID=0;
+
+ PyArg_ParseTuple(args, "i", &methodID);
+
+ jmethodID method=(jmethodID)methodID;
+
+ char *name=NULL;
+ char *sig=NULL;
+ char *generic=NULL;
+
+ jvmtiError err=(*jvmtiptr)->GetMethodName(jvmtiptr,method,&name,&sig,&generic);
+
+ CHECK_OK("GetMethodName");
+
+ PyObject *value= Py_BuildValue("sss", name,sig,generic);
+ DEALLOC(name);
+ DEALLOC(sig);
+ DEALLOC(generic);
- {"getThread", jvmti_getThread, METH_VARARGS, "Get JVMTI Thread."},
- {"getAllThreads", jvmti_getAllThreads, METH_VARARGS, "Get JVMTI Threads."},
+ return value;
+}
+
+static PyObject *
+jvmti_getLocalVariableTable(PyObject *self, PyObject *args)
+{
+
+
+
+ CHECK_VALID();
+
+ int methodID=0;
+
+ PyArg_ParseTuple(args, "i", &methodID);
+
+ jmethodID method=(jmethodID)methodID;
+
+ jint countj=0;
+
+ jvmtiLocalVariableEntry *entries=NULL;
+
+ jvmtiError err=(*jvmtiptr)->GetLocalVariableTable(jvmtiptr,method,&countj,&entries);
+
+ CHECK_OK("GetLocalVariableTable");
- {"getTopThreadGroups", jvmti_getTopThreadGroups, METH_VARARGS, "Get Top Thread Groups."},
+ // turn table into python data...
+ int count=countj;
+ PyObject* list= PyList_New(count);
+
+ int i=0;
+ for(i=0;i<count;i++) {
+ jlocation startj=entries[i].start_location;
+ int start=startj;
+ jint lengthj=entries[i].length;
+ int length=lengthj;
+ char *name=entries[i].name;
+ char *sig=entries[i].signature;
+ char *generic=entries[i].generic_signature;
+ jint slotj=entries[i].slot;
+ int slot=slotj;
+
+ PyObject *value= Py_BuildValue("iisssi",start,length, name,sig,generic,slot);
+ DEALLOC(name);
+ DEALLOC(sig);
+ DEALLOC(generic);
+ PyList_SetItem(list,i,value);
+ }
+
+ DEALLOC(entries);
+
+ return list;
+}
- {"getThreadGroupInfo", jvmti_getThreadGroupInfo, METH_VARARGS, "Get Thread Group Info."},
+static PyMethodDef JvmtiMethods[] = {
- {"getFrameCount", jvmti_getFrameCount, METH_VARARGS, "Get Frame Count"},
- {"getStackTrace", jvmti_getStackTrace, METH_VARARGS, "Get Stack Trace"},
- {"getOwnedMonitorInfo", jvmti_getOwnedMonitorInfo, METH_VARARGS, "Get Owned Monitor Info."},
+ {"getTime", jvmti_gettime, METH_VARARGS, "Get JVMTI Time."},
+ {"getSystemProperties", jvmti_getsystemproperties, METH_VARARGS, "Get JVMTI System Properties."},
+ {"getThread", jvmti_getThread, METH_VARARGS, "Get JVMTI Thread."},
+ {"getAllThreads", jvmti_getAllThreads, METH_VARARGS, "Get JVMTI Threads."},
+ {"getTopThreadGroups", jvmti_getTopThreadGroups, METH_VARARGS, "Get Top Thread Groups."},
+ {"getThreadGroupInfo", jvmti_getThreadGroupInfo, METH_VARARGS, "Get Thread Group Info."},
+ {"getFrameCount", jvmti_getFrameCount, METH_VARARGS, "Get Frame Count"},
+ {"getStackTrace", jvmti_getStackTrace, METH_VARARGS, "Get Stack Trace"},
+ {"getOwnedMonitorInfo", jvmti_getOwnedMonitorInfo, METH_VARARGS, "Get Owned Monitor Info."},
+ {"getCurrentContendedMonitor", jvmti_getCurrentContendedMonitor, METH_VARARGS, "Get Current Contended Monitor."},
+ {"getLocalObject", jvmti_getLocalObject, METH_VARARGS, "Get Local Object."},
+ {"getLocalInt", jvmti_getLocalInt, METH_VARARGS, "Get Local Int."},
+ {"getLocalLong", jvmti_getLocalLong, METH_VARARGS, "Get Local Long."},
+ {"getMethodName", jvmti_getMethodName, METH_VARARGS, "Get method name and sig."},
+ {"getLocalVariableTable",jvmti_getLocalVariableTable, METH_VARARGS,"Get Local Variable Table."},
{NULL, NULL, 0, NULL} /* Sentinel */
};
@@ -483,20 +677,27 @@
err = (*jvmtiptr)->SetEventNotificationMode(jvmtiptr, JVMTI_ENABLE,
JVMTI_EVENT_DATA_DUMP_REQUEST,
(jthread)NULL);
+
CHECK_OK("unable to set callback");
- // turn on ability get the monitors...
+ // turn on required capabilities
+
jvmtiCapabilities caps;
+ memset(&caps, 0, sizeof(jvmtiCapabilities));
+
caps.can_get_owned_monitor_info=1;
+ caps.can_get_current_contended_monitor=1;
+ caps.can_access_local_variables=1;
err=(*jvmtiptr)->AddCapabilities(jvmtiptr, &caps);
- WARN("can't turn on get monitor info");
+
+ WARN("can't turn on required capabilites\n");
report("dumprequest agent registered\n");
scriptname=options;
report(scriptname);
- return 0;
+ return JNI_OK;
}
Modified: incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h?rev=773520&r1=773519&r2=773520&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h (original)
+++ incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h Mon May 11 10:10:55 2009
@@ -35,12 +35,13 @@
printf("warning %s\n",msg); \
}
#define DEALLOC(ptr) \
-err=(*jvmtiptr)->Deallocate(jvmtiptr,ptr); \
+ if(ptr!=NULL) { \
+ err=(*jvmtiptr)->Deallocate(jvmtiptr,( unsigned char*)ptr); \
if(err!=JNI_OK) { \
PyErr_SetString(PyExc_TypeError, "jvmti dealloc"); \
return NULL; \
- }
-
+ } \
+ }
#define report(s) printf("\nkato: %s",s)
Modified: incubator/kato/branches/experimental/PyJVMTI/run.sh
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/run.sh?rev=773520&r1=773519&r2=773520&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/run.sh (original)
+++ incubator/kato/branches/experimental/PyJVMTI/run.sh Mon May 11 10:10:55 2009
@@ -2,4 +2,4 @@
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./build/lib.linux-i686-2.6:/usr/lib/python2.6:/usr/lib/python2.6/config
#export PYTHONSTARTUP=./build/lib.linux-i686-2.6/kato/Dump.py
export PYTHONPATH=$PYTHONPATH:.
-/home/spoole/javasdks/sun/jdk1.6.0_12/bin/java -agentlib:pyjvmti -cp . kato.PauseJVM
+/home/spoole/javasdks/sun/jdk1.6.0_12/bin/java -agentlib:pyjvmti -cp . kato.PauseJVM