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/06 09:41:53 UTC
svn commit: r772117 - in /incubator/kato/branches/experimental/PyJVMTI:
.project README.TXT build.sh kato/ kato/Dump.py kato/JClassLoader.py
kato/JThread.py kato/JThreadGroup.py kato/PauseJVM.java kato/__init__.py
pyjvmti.c pyjvmti.h run.sh setup.py
Author: spoole
Date: Wed May 6 09:41:52 2009
New Revision: 772117
URL: http://svn.apache.org/viewvc?rev=772117&view=rev
Log:
first drop of experimental python frontend to jvmti
Added:
incubator/kato/branches/experimental/PyJVMTI/.project (with props)
incubator/kato/branches/experimental/PyJVMTI/README.TXT
incubator/kato/branches/experimental/PyJVMTI/build.sh (with props)
incubator/kato/branches/experimental/PyJVMTI/kato/
incubator/kato/branches/experimental/PyJVMTI/kato/Dump.py (with props)
incubator/kato/branches/experimental/PyJVMTI/kato/JClassLoader.py (with props)
incubator/kato/branches/experimental/PyJVMTI/kato/JThread.py (with props)
incubator/kato/branches/experimental/PyJVMTI/kato/JThreadGroup.py (with props)
incubator/kato/branches/experimental/PyJVMTI/kato/PauseJVM.java (with props)
incubator/kato/branches/experimental/PyJVMTI/kato/__init__.py (with props)
incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c (with props)
incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h (with props)
incubator/kato/branches/experimental/PyJVMTI/run.sh (with props)
incubator/kato/branches/experimental/PyJVMTI/setup.py (with props)
Added: incubator/kato/branches/experimental/PyJVMTI/.project
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/.project?rev=772117&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/.project (added)
+++ incubator/kato/branches/experimental/PyJVMTI/.project Wed May 6 09:41:52 2009
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>PyJVMTI</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ </buildSpec>
+ <natures>
+ </natures>
+</projectDescription>
Propchange: incubator/kato/branches/experimental/PyJVMTI/.project
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/kato/branches/experimental/PyJVMTI/README.TXT
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/README.TXT?rev=772117&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/README.TXT (added)
+++ incubator/kato/branches/experimental/PyJVMTI/README.TXT Wed May 6 09:41:52 2009
@@ -0,0 +1,27 @@
+This is an experimental project looking at using python and a jvmti extention to create a jvmti agent.
+This agent should be able to provide basic jvmti interactions from a python console AND
+be able to produce a dump that can be read elsewhere. Probably using python pickle to do all
+the work. FInally, the unpickled file needs somehow to be fronted by the Kato JavaRuntime API
+
+To build and run:
+
+Dependencies
+
+python 2,6
+Sun Java 6 SDK
+gcc
+
+Steps:
+
+1 - Update setup.py to point to your Java sdk include directories
+2 - run build.sh from the PyJVMTI directory to compile and build the java and c code.
+
+3 - run the run.sh script to launch and pause a JVM with the agent attached.
+4 - Initiate a dump ( ctl-\ on linux) and you should drop into a python interactive shell
+5 - try the following...
+
+d=Dump()
+d.getThreads()
+
+
+
Added: incubator/kato/branches/experimental/PyJVMTI/build.sh
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/build.sh?rev=772117&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/build.sh (added)
+++ incubator/kato/branches/experimental/PyJVMTI/build.sh Wed May 6 09:41:52 2009
@@ -0,0 +1,3 @@
+javac ./kato/PauseJVM.java
+python -u ./setup.py build
+
Propchange: incubator/kato/branches/experimental/PyJVMTI/build.sh
------------------------------------------------------------------------------
svn:executable = *
Added: incubator/kato/branches/experimental/PyJVMTI/kato/Dump.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/Dump.py?rev=772117&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/Dump.py (added)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/Dump.py Wed May 6 09:41:52 2009
@@ -0,0 +1,68 @@
+
+#*******************************************************************************
+ #* Licensed under the Apache License, Version 2.0 (the "License");
+ #* you may not use this file except in compliance with the License.
+ #* You may obtain a copy of the License at
+ #*
+ #* http://www.apache.org/licenses/LICENSE-2.0
+ #*
+ #* Unless required by applicable law or agreed to in writing, software
+ #* distributed under the License is distributed on an "AS IS" BASIS,
+ #* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ #* See the License for the specific language governing permissions and
+ #* limitations under the License.
+ #******************************************************************************"
+
+
+'''
+Created on 2 May 2009
+
+'''
+import jvmti
+import kato.JThread as JThread
+
+class Dump(object):
+ '''
+ classdocs
+ '''
+
+
+ def __init__(selfparams):
+ '''
+ Constructor
+ '''
+
+
+ def getThreads(self):
+ '''
+ List Threads
+ '''
+
+ results=[ ]
+
+ for t in jvmti.getAllThreads() :
+ q=JThread.JThread(t)
+ results.append(q)
+
+ return results
+
+ def properties(self):
+ '''
+ List system properties
+ '''
+ print "listing properties"
+ for k, v in jvmti.getsystemproperties().iteritems():
+ print k,"=", v
+
+ @property
+ def threads(self):
+ '''
+ List system properties
+ '''
+ print "listing properties"
+ for k in jvmti.getAllThreads():
+ print k , jvmti.getThread(k)
+
+
+
+
\ No newline at end of file
Propchange: incubator/kato/branches/experimental/PyJVMTI/kato/Dump.py
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/kato/branches/experimental/PyJVMTI/kato/JClassLoader.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/JClassLoader.py?rev=772117&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/JClassLoader.py (added)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/JClassLoader.py Wed May 6 09:41:52 2009
@@ -0,0 +1,20 @@
+#*******************************************************************************
+ #* Licensed under the Apache License, Version 2.0 (the "License");
+ #* you may not use this file except in compliance with the License.
+ #* You may obtain a copy of the License at
+ #*
+ #* http://www.apache.org/licenses/LICENSE-2.0
+ #*
+ #* Unless required by applicable law or agreed to in writing, software
+ #* distributed under the License is distributed on an "AS IS" BASIS,
+ #* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ #* See the License for the specific language governing permissions and
+ #* limitations under the License.
+ #******************************************************************************"
+
+class JClassLoader(object):
+
+ def __init__(self,loader=0):
+ '''
+ Constructor
+ '''
\ No newline at end of file
Propchange: incubator/kato/branches/experimental/PyJVMTI/kato/JClassLoader.py
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/kato/branches/experimental/PyJVMTI/kato/JThread.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/JThread.py?rev=772117&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/JThread.py (added)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/JThread.py Wed May 6 09:41:52 2009
@@ -0,0 +1,67 @@
+#*******************************************************************************
+ #* Licensed under the Apache License, Version 2.0 (the "License");
+ #* you may not use this file except in compliance with the License.
+ #* You may obtain a copy of the License at
+ #*
+ #* http://www.apache.org/licenses/LICENSE-2.0
+ #*
+ #* Unless required by applicable law or agreed to in writing, software
+ #* distributed under the License is distributed on an "AS IS" BASIS,
+ #* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ #* See the License for the specific language governing permissions and
+ #* limitations under the License.
+ #******************************************************************************"
+
+import jvmti
+'''
+Created on 2 May 2009
+
+'''
+
+class JThread(object):
+ '''
+ classdocs
+ '''
+ info=None
+ threadid=0;
+
+ def __init__(self,tid=0):
+ '''
+ Constructor
+ '''
+ self.threadid=tid
+ def fill(self):
+ if self.info==None :
+ self.info=jvmti.getThread(self.threadid);
+
+ @property
+ def name(self):
+ self.fill()
+ return self.info[0]
+
+ @property
+ def priority(self):
+ self.fill()
+ return self.info[1]
+
+ @property
+ def isDaemon(self):
+ self.fill()
+ return self.info[2]
+
+ @property
+ def threadGroup(self):
+ self.fill()
+ return JThreadGroup(self.info[3])
+
+ @property
+ def contextClassLoader(self):
+ self.fill()
+ if self.info[4]==None:
+ return None
+
+ return JClassLoader(self.info[4])
+
+ def __repr__(self):
+ return "JThread id=%i name=%s" % (self.threadid , self.name)
+
\ No newline at end of file
Propchange: incubator/kato/branches/experimental/PyJVMTI/kato/JThread.py
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/kato/branches/experimental/PyJVMTI/kato/JThreadGroup.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/JThreadGroup.py?rev=772117&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/JThreadGroup.py (added)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/JThreadGroup.py Wed May 6 09:41:52 2009
@@ -0,0 +1,23 @@
+#*******************************************************************************
+ #* Licensed under the Apache License, Version 2.0 (the "License");
+ #* you may not use this file except in compliance with the License.
+ #* You may obtain a copy of the License at
+ #*
+ #* http://www.apache.org/licenses/LICENSE-2.0
+ #*
+ #* Unless required by applicable law or agreed to in writing, software
+ #* distributed under the License is distributed on an "AS IS" BASIS,
+ #* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ #* See the License for the specific language governing permissions and
+ #* limitations under the License.
+ #******************************************************************************"
+
+import jvmti
+
+class JThreadGroup(object):
+
+ def __init__(self,threadid=0):
+ '''
+ Constructor
+ '''
+ info=jvmti.getThreadInfo(threadid);
\ No newline at end of file
Propchange: incubator/kato/branches/experimental/PyJVMTI/kato/JThreadGroup.py
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/kato/branches/experimental/PyJVMTI/kato/PauseJVM.java
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/PauseJVM.java?rev=772117&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/PauseJVM.java (added)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/PauseJVM.java Wed May 6 09:41:52 2009
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+package kato;
+
+
+public class PauseJVM {
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) {
+
+
+ try {
+ Thread.sleep(1000000);
+ } catch (InterruptedException e) {
+
+ e.printStackTrace();
+ }
+
+
+ }
+
+}
Propchange: incubator/kato/branches/experimental/PyJVMTI/kato/PauseJVM.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/kato/branches/experimental/PyJVMTI/kato/__init__.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/__init__.py?rev=772117&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/__init__.py (added)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/__init__.py Wed May 6 09:41:52 2009
@@ -0,0 +1 @@
+print "in init for org.kato.jvmti"
\ No newline at end of file
Propchange: incubator/kato/branches/experimental/PyJVMTI/kato/__init__.py
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c?rev=772117&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c (added)
+++ incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c Wed May 6 09:41:52 2009
@@ -0,0 +1,503 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#include <Python.h>
+#include "jni.h"
+#include "jvmti.h"
+#include "pyjvmti.h"
+
+
+static char *scriptname=NULL;
+static jvmtiEnv *jvmtiptr = NULL;
+static JavaVM *vmptr=NULL;
+static JNIEnv *jniptr=NULL;
+
+
+
+static char * getErrorMessage(jvmtiError err,char *usrmsg) {
+
+ char *msg=NULL;
+ if(jvmtiptr==NULL) {
+ msg="UNABLE TO RESOLVE";
+ }
+ else {
+ jvmtiError e=(*jvmtiptr)->GetErrorName(jvmtiptr,err,&msg);
+ if(e!=JNI_OK) msg="unknown message";
+ }
+
+ int length=strlen(msg)+50+strlen(usrmsg);
+ char *result=malloc(length);
+
+ sprintf(result,"failed %s (%i) %s",usrmsg,err,msg);
+
+ return result;
+}
+
+
+static PyObject * jvmti_getStackTrace(PyObject *self, PyObject *args) {
+
+
+ int threadID=0;
+ int start_depth=0;
+ int max_frame_count=0;
+
+ PyArg_ParseTuple(args, "iii", &threadID,&start_depth,&max_frame_count);
+
+ jthread thread=(jthread)threadID;
+ jint count=0;
+ jint jstart=start_depth;
+ jint jmax=max_frame_count;
+
+ if(max_frame_count<1) max_frame_count=1;
+
+ jvmtiFrameInfo *info=malloc(sizeof(jvmtiFrameInfo)*max_frame_count);
+
+
+ jvmtiError err=(*jvmtiptr)->GetStackTrace(jvmtiptr,thread,jstart,jmax,info,&count);
+
+
+ CHECK_OK("get stack trace")
+
+
+
+ PyObject* list= PyList_New(count);
+
+ int i=0;
+ for( i=0;i<count;i++) {
+ PyList_SetItem(list,i,Py_BuildValue("ii",info[i].method,info[i].location));
+ }
+
+ free(info);
+ return list;
+
+}
+
+static PyObject * jvmti_getFrameCount(PyObject *self, PyObject *args) {
+
+ CHECK_VALID()
+
+ // get required thread...
+ int threadID=0;
+
+ PyArg_ParseTuple(args, "i", &threadID);
+
+ jthread thread=(jthread)threadID;
+ jint count=0;
+
+ jvmtiError err=(*jvmtiptr)->GetFrameCount(jvmtiptr,thread,&count);
+
+ CHECK_OK("get frame count")
+
+ return Py_BuildValue("i", count);
+
+
+}
+
+static PyObject * jvmti_getOwnedMonitorInfo(PyObject *self, PyObject *args) {
+
+ CHECK_VALID()
+
+ // get required thread...
+ int threadID=0;
+
+ PyArg_ParseTuple(args, "i", &threadID);
+
+ jthread thread=(jthread)threadID;
+ jint count=0;
+ jobject *monitors=NULL;
+
+ jvmtiError err=(*jvmtiptr)->GetOwnedMonitorInfo(jvmtiptr,thread,&count,&monitors);
+
+ CHECK_OK("get owned monitor info")
+
+ PyObject* list= PyList_New(count);
+
+ int i=0;
+ for( i=0;i<count;i++) {
+ PyList_SetItem(list,i,Py_BuildValue("i",monitors[i]));
+ }
+
+
+ DEALLOC(monitors); // allocated by jvmti
+
+ return list;
+}
+
+static PyObject * jvmti_getThreadGroupInfo(PyObject *self, PyObject *args) {
+
+ CHECK_VALID()
+
+ // get required threadgroup
+ int ID=0;
+
+ PyArg_ParseTuple(args, "i", &ID);
+
+ jvmtiThreadGroupInfo info;
+ jthreadGroup threadGroup=(jthreadGroup)ID;
+
+
+ jvmtiError err=(*jvmtiptr)->GetThreadGroupInfo(jvmtiptr,threadGroup,&info);
+
+ CHECK_OK("get threadGroup info")
+
+ PyObject *result=Py_BuildValue("s", info.name);
+
+ DEALLOC(info.name); // allocated by jvmti
+
+ return result;
+}
+static PyObject * jvmti_getTopThreadGroups(PyObject *self, PyObject *args) {
+
+ CHECK_VALID()
+
+
+
+ jint count=0;
+ jthreadGroup *groups=NULL;
+
+ jvmtiError err=(*jvmtiptr)->GetTopThreadGroups(jvmtiptr,&count,&groups);
+
+ CHECK_OK("get Top Thread Groups")
+
+ PyObject* list= PyList_New(count);
+
+ int i=0;
+ for( i=0;i<count;i++) {
+ PyList_SetItem(list,i,Py_BuildValue("i",groups[i]));
+ }
+
+
+ DEALLOC(groups); // allocated by jvmti
+
+ return list;
+}
+
+
+/**
+ * Get Capabilities
+ */
+
+static PyObject * jvmti_getcapabilities(PyObject *self, PyObject *args) {
+
+
+ CHECK_VALID()
+
+ jvmtiCapabilities capabilities;
+
+ jvmtiError err=(*jvmtiptr)->GetPotentialCapabilities(jvmtiptr,
+ &capabilities);
+
+ CHECK_OK("get capabilities")
+
+ return 0;
+
+
+}
+ static PyObject *
+jvmti_getThread(PyObject *self, PyObject *args)
+{
+ CHECK_VALID()
+ // get required thread...
+ int threadID=0;
+
+ PyArg_ParseTuple(args, "i", &threadID);
+
+ jvmtiThreadInfo info;
+ jthread thread=(jthread)threadID;
+
+
+ jvmtiError err=(*jvmtiptr)->GetThreadInfo(jvmtiptr,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);
+
+ DEALLOC(info.name); // allocated by jvmti
+
+ return result;
+}
+
+ static PyObject *
+jvmti_getAllThreads(PyObject *self, PyObject *args)
+{
+
+ CHECK_VALID()
+
+ if(jniptr==NULL) {
+ PyErr_SetString(PyExc_TypeError, "jni environment not present");
+ return NULL;
+ }
+
+ jint count=0;
+ jthread* threads=NULL;
+
+
+ jvmtiError err=(*jvmtiptr)->GetAllThreads(jvmtiptr,&count,&threads);
+
+ CHECK_OK("get all threads")
+
+ PyObject* list= PyList_New(count);
+
+ int i=0;
+
+
+ for( i=0;i<count;i++) {
+ PyList_SetItem(list,i,Py_BuildValue("i",threads[i]));
+ }
+
+
+ DEALLOC(threads)
+
+ return list;
+
+}
+
+
+
+static PyObject *
+jvmti_getsystemproperties(PyObject *self, PyObject *args)
+{
+ CHECK_VALID()
+
+ jint count=0;
+ char **ptr=NULL;
+
+ jvmtiError err=(*jvmtiptr)->GetSystemProperties(jvmtiptr,&count,&ptr);
+
+ CHECK_OK("get system properties")
+
+ PyObject *pDict = PyDict_New(); // new reference
+
+ int i=0;
+ for( i=0;i<count;i++) {
+
+ char *name=ptr[i];
+ char *value=NULL;
+
+ // get property value
+
+ err=(*jvmtiptr)->GetSystemProperty(jvmtiptr,name,&value);
+
+ CHECK_OK("get system property")
+
+ // add to dictionary
+
+ PyDict_SetItemString(pDict, name,Py_BuildValue("s", value));
+
+
+ // release storage
+
+ err=(*jvmtiptr)->Deallocate(jvmtiptr,value);
+
+ CHECK_OK("jvmti dealloc failed for system property value")
+
+
+ }
+
+ // release property names storage
+
+ err=(*jvmtiptr)->Deallocate(jvmtiptr,ptr);
+
+ CHECK_OK("jvmti dealloc failed")
+
+
+ return pDict;
+}
+static PyObject *
+jvmti_gettime(PyObject *self, PyObject *args)
+{
+
+
+CHECK_VALID()
+
+ jlong result=0;
+
+ jvmtiError err=(*jvmtiptr)->GetTime(jvmtiptr,&result);
+
+ CHECK_OK("GetTime")
+
+ return Py_BuildValue("l", result);
+}
+
+
+
+static PyMethodDef JvmtiMethods[] = {
+
+ {"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."},
+ {NULL, NULL, 0, NULL} /* Sentinel */
+};
+
+
+PyMODINIT_FUNC
+initjvmti(void)
+{
+ printf("initilising...");
+ (void) Py_InitModule("jvmti", JvmtiMethods);
+
+
+
+
+}
+
+
+
+
+
+ void createObject(JNIEnv *env) {
+jclass threadClass;
+jmethodID constructor;
+
+
+printf("\ncreating thread");
+
+threadClass = (*env)->FindClass(env, "test/MyDump");
+constructor = (*env)->GetMethodID(env, threadClass, "<init>", "()V");
+ (*env)->NewObject(env, threadClass, constructor);
+
+
+}
+
+
+
+
+
+void exec_interactive_interpreter(int argc, char** argv)
+ {
+ printf("\ninit");
+ Py_Initialize();
+
+ /* Add a static module */
+ initjvmti();
+
+ if(scriptname!=NULL) {
+ runScript();
+ }
+ else {
+ printf("\nmain\n");
+ Py_Main(argc, argv);
+ }
+ printf("\nclose");
+ Py_Finalize();
+
+ }
+
+
+void runScript() {
+
+ printf("running script %s",scriptname);
+
+ // Python code in separate environments
+ FILE* file_1 = fopen(scriptname, "r");
+ PyRun_SimpleFile(file_1, scriptname);
+
+ fclose(file_1);
+
+
+
+
+}
+
+JNIEXPORT void JNICALL Agent_OnUnload(JavaVM *vm) {
+
+ report("unloaded");
+}
+
+JNIEXPORT void JNICALL Java_test_MyDump_doit
+ (JNIEnv *env, jobject obj) {
+
+ startPython();
+}
+void startPython() {
+ char *names[]={scriptname,scriptname};
+
+ exec_interactive_interpreter(1,names);
+ // runScript();
+}
+
+static void JNICALL
+dataDumpRequest(jvmtiEnv *jvmti)
+{
+ jvmtiptr=jvmti;
+
+ jint rc = (*vmptr)->GetEnv(vmptr, (void **)&jniptr, JNI_VERSION_1_6);
+
+ if (rc != JNI_OK) {
+ report("unable to load jni environment");
+ return rc;
+ }
+
+ startPython();
+}
+
+
+
+
+JNIEXPORT jint JNICALL
+Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
+{
+
+ report(" jvmti is active");
+
+ vmptr=vm;
+
+
+
+ jint rc = (*vm)->GetEnv(vm, (void **)&jvmtiptr, JVMTI_VERSION);
+
+ if (rc != JNI_OK) {
+ report("unable to load jvm environment");
+ return rc;
+ }
+
+
+ jvmtiEventCallbacks callbacks;
+
+ memset(&callbacks, 0, sizeof(callbacks));
+ callbacks.DataDumpRequest = &dataDumpRequest;
+ jvmtiError err = (*jvmtiptr)->SetEventCallbacks(jvmtiptr, &callbacks, sizeof(callbacks));
+
+ 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...
+ jvmtiCapabilities caps;
+ caps.can_get_owned_monitor_info=1;
+
+ err=(*jvmtiptr)->AddCapabilities(jvmtiptr, &caps);
+ WARN("can't turn on get monitor info");
+
+ report("dumprequest agent registered\n");
+ scriptname=options;
+ report(scriptname);
+
+ return 0;
+}
+
+
+
Propchange: incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h?rev=772117&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h (added)
+++ incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h Wed May 6 09:41:52 2009
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#ifndef __PY_JVMTI_H
+#define __PY_JVMTI_H
+
+#define CHECK_VALID() \
+ if(jvmtiptr==NULL) { \
+ PyErr_SetString(PyExc_TypeError, "jvmti environment pointer not present"); \
+ return NULL; \
+ } \
+
+#define CHECK_OK(error_msg) \
+if(err!=JNI_OK) { \
+ char *msg=getErrorMessage(err,error_msg); \
+ PyErr_SetString(PyExc_TypeError, msg); \
+ free(msg); \
+ return NULL; \
+ }
+
+#define WARN(error_msg) \
+if(err!=JNI_OK) { \
+ char *msg=getErrorMessage(err,error_msg); \
+ printf("warning %s\n",msg); \
+ }
+#define DEALLOC(ptr) \
+err=(*jvmtiptr)->Deallocate(jvmtiptr,ptr); \
+ if(err!=JNI_OK) { \
+ PyErr_SetString(PyExc_TypeError, "jvmti dealloc"); \
+ return NULL; \
+ }
+
+#define report(s) printf("\nkato: %s",s)
+
+
+
+PyMODINIT_FUNC initjvmti(void);
+
+static PyObject *jvmti_getThread(PyObject *self, PyObject *args);
+static PyObject *jvmti_getAllThreads(PyObject *self, PyObject *args);
+static PyObject *jvmti_getsystemproperties(PyObject *self, PyObject *args);
+static PyObject *jvmti_gettime(PyObject *self, PyObject *args);
+static PyObject *jvmti_getTopThreadGroups(PyObject *self, PyObject *args);
+static PyObject * jvmti_getThreadGroupInfo(PyObject *self, PyObject *args);
+static PyObject * jvmti_getFrameCount(PyObject *self, PyObject *args);
+static PyObject * jvmti_getStackTrace(PyObject *self, PyObject *args);
+void runScript(void);
+void startPython(void);
+void createObject(JNIEnv *env);
+static char * getErrorMessage(jvmtiError err,char *usrmsg);
+
+#endif
Propchange: incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/kato/branches/experimental/PyJVMTI/run.sh
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/run.sh?rev=772117&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/run.sh (added)
+++ incubator/kato/branches/experimental/PyJVMTI/run.sh Wed May 6 09:41:52 2009
@@ -0,0 +1,5 @@
+export LD_PRELOAD=/usr/lib/python2.6/config/libpython2.6.so
+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
Propchange: incubator/kato/branches/experimental/PyJVMTI/run.sh
------------------------------------------------------------------------------
svn:executable = *
Added: incubator/kato/branches/experimental/PyJVMTI/setup.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/setup.py?rev=772117&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/setup.py (added)
+++ incubator/kato/branches/experimental/PyJVMTI/setup.py Wed May 6 09:41:52 2009
@@ -0,0 +1,28 @@
+#*******************************************************************************
+ #* Licensed under the Apache License, Version 2.0 (the "License");
+ #* you may not use this file except in compliance with the License.
+ #* You may obtain a copy of the License at
+ #*
+ #* http://www.apache.org/licenses/LICENSE-2.0
+ #*
+ #* Unless required by applicable law or agreed to in writing, software
+ #* distributed under the License is distributed on an "AS IS" BASIS,
+ #* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ #* See the License for the specific language governing permissions and
+ #* limitations under the License.
+ #******************************************************************************"
+
+from distutils.core import setup, Extension
+
+module1 = Extension('libpyjvmti',
+ sources = ['pyjvmti.c'])
+
+
+setup (name = 'jvmti',
+ version = '1.0',
+ description = 'JVMTI Wrapper',
+ include_dirs = ['/home/spoole/javasdks/sun/jdk1.6.0_12/include',
+ '/home/spoole/javasdks/sun/jdk1.6.0_12/include/linux'],
+ packages=['kato'],
+ ext_modules = [module1]
+ )
\ No newline at end of file
Propchange: incubator/kato/branches/experimental/PyJVMTI/setup.py
------------------------------------------------------------------------------
svn:mime-type = text/plain