| /* Copyright (C) 2000 Free Software Foundation |
| |
| This file is part of libgcj. |
| |
| This software is copyrighted work licensed under the terms of the |
| Libgcj License. Please consult the file "LIBGCJ_LICENSE" for |
| details. */ |
| |
| /* Note: this file must be compilable by the C compiler (for now, |
| assuming GNU C is ok). This means you must never use `//' |
| comments, and all C++-specific code must be conditional on |
| __cplusplus. */ |
| |
| #ifndef __GCJ_JVMPI_H__ |
| #define __GCJ_JVMPI_H__ |
| |
| #include <jni.h> |
| |
| /* JVMPI version numbers. FIXME: this is a semi-random number. The |
| documentation doesn't say what it should be. */ |
| #define JVMPI_VERSION_1 0x00020001 |
| |
| /* JVMPI return codes. FIXME: These are semi-random numbers. The |
| documentation doesn't say what they should be. */ |
| #define JVMPI_SUCCESS 0 |
| #define JVMPI_FAIL 1 |
| #define JVMPI_NOT_AVAILABLE 2 |
| |
| /* An opaque pointer representing an object ID. */ |
| struct _jobjectID; |
| typedef struct _jobjectID * jobjectID; |
| |
| typedef struct |
| { |
| /* Source line number. */ |
| jint lineno; |
| /* Method being executed. */ |
| jmethodID method_id; |
| } JVMPI_CallFrame; |
| |
| typedef struct |
| { |
| JNIEnv *env_id; |
| /* Number of frames in the call trace. */ |
| jint num_frames; |
| /* An array of frames representing the trace. Callees first. */ |
| JVMPI_CallFrame *frames; |
| } JVMPI_CallTrace; |
| |
| typedef struct |
| { |
| /* Name of the field. */ |
| char *field_name; |
| /* Signature of the field. */ |
| char *field_signature; |
| } JVMPI_Field; |
| |
| /* The documentation doesn't actually specify what the |
| JVMPI_DUMP_LEVEL macros should be defined to. Here's a reasonable |
| guess. */ |
| #define JVMPI_DUMP_LEVEL_0 0 |
| #define JVMPI_DUMP_LEVEL_1 1 |
| #define JVMPI_DUMP_LEVEL_2 2 |
| #define JVMPI_DUMP_LEVEL_3 3 |
| |
| typedef struct |
| { |
| /* One of JVMPI_DUMP_LEVEL_0, JVMPI_DUMP_LEVEL_1 or |
| JVMPI_DUMP_LEVEL_2. */ |
| jint heap_dump_level; |
| } JVMPI_HeapDumpArg; |
| |
| typedef struct |
| { |
| /* Offset from the beginning of the method. */ |
| jint offset; |
| /* Line number from the beginning of the source file. */ |
| jint lineno; |
| } JVMPI_Lineno; |
| |
| typedef struct |
| { |
| /* Name of the method. */ |
| char *method_name; |
| /* Signature of the method. */ |
| char *method_signature; |
| /* Start line number from the beginning of the source file. */ |
| jint start_lineno; |
| /* End line number from the beginning of the source file. */ |
| jint end_lineno; |
| /* The method ID. */ |
| jmethodID method_id; |
| } JVMPI_Method; |
| |
| /* An opaque pointer representing a raw monitor. */ |
| struct _JVMPI_RawMonitor; |
| typedef struct _JVMPI_RawMonitor *JVMPI_RawMonitor; |
| |
| /* JVMPI event codes. FIXME: These are semi-random numbers. The |
| documentation doesn't say what they should be. */ |
| #define JVMPI_EVENT_ARENA_DELETE 0 |
| #define JVMPI_EVENT_ARENA_NEW 1 |
| #define JVMPI_EVENT_CLASS_LOAD 2 |
| #define JVMPI_EVENT_CLASS_LOAD_HOOK 3 |
| #define JVMPI_EVENT_CLASS_UNLOAD 4 |
| #define JVMPI_EVENT_COMPILED_METHOD_LOAD 5 |
| #define JVMPI_EVENT_COMPILED_METHOD_UNLOAD 6 |
| #define JVMPI_EVENT_DATA_DUMP_REQUEST 7 |
| #define JVMPI_EVENT_DATA_RESET_REQUEST 8 |
| #define JVMPI_EVENT_GC_FINISH 9 |
| #define JVMPI_EVENT_GC_START 10 |
| #define JVMPI_EVENT_HEAP_DUMP 11 |
| #define JVMPI_EVENT_JNI_GLOBALREF_ALLOC 12 |
| #define JVMPI_EVENT_JNI_GLOBALREF_FREE 13 |
| #define JVMPI_EVENT_JNI_WEAK_GLOBALREF_ALLOC 14 |
| #define JVMPI_EVENT_JNI_WEAK_GLOBALREF_FREE 15 |
| #define JVMPI_EVENT_JVM_INIT_DONE 16 |
| #define JVMPI_EVENT_JVM_SHUT_DOWN 17 |
| #define JVMPI_EVENT_METHOD_ENTRY 18 |
| #define JVMPI_EVENT_METHOD_ENTRY2 19 |
| #define JVMPI_EVENT_METHOD_EXIT 20 |
| #define JVMPI_EVENT_MONITOR_CONTENDED_ENTER 21 |
| #define JVMPI_EVENT_MONITOR_CONTENDED_ENTERED 22 |
| #define JVMPI_EVENT_MONITOR_CONTENDED_EXIT 23 |
| #define JVMPI_EVENT_MONITOR_DUMP 24 |
| #define JVMPI_EVENT_MONITOR_WAIT 25 |
| #define JVMPI_EVENT_MONITOR_WAITED 26 |
| #define JVMPI_EVENT_OBJECT_ALLOC 27 |
| #define JVMPI_EVENT_OBJECT_DUMP 28 |
| #define JVMPI_EVENT_OBJECT_FREE 29 |
| #define JVMPI_EVENT_OBJECT_MOVE 30 |
| #define JVMPI_EVENT_RAW_MONITOR_CONTENDED_ENTER 31 |
| #define JVMPI_EVENT_RAW_MONITOR_CONTENDED_ENTERED 32 |
| #define JVMPI_EVENT_RAW_MONITOR_CONTENDED_EXIT 33 |
| #define JVMPI_EVENT_THREAD_END 34 |
| #define JVMPI_EVENT_THREAD_START 35 |
| #define JVMPI_EVENT_INSTRUCTION_START 36 |
| |
| |
| typedef struct |
| { |
| /* Event type. */ |
| jint event_type; |
| |
| /* Evn where this event occurred. */ |
| JNIEnv *env_id; |
| |
| union |
| { |
| struct |
| { |
| char *class_name; |
| char *source_name; |
| jint num_interfaces; |
| jint num_methods; |
| JVMPI_Method *methods; |
| jint num_static_fields; |
| JVMPI_Field *statics; |
| jint num_instance_fields; |
| JVMPI_Field *instances; |
| jobjectID class_id; |
| } class_load; |
| |
| struct |
| { |
| jobjectID class_id; |
| } class_unload; |
| |
| struct |
| { |
| jint arena_id; |
| jobjectID class_id; |
| jint is_array; |
| jint size; |
| jobjectID obj_id; |
| } obj_alloc; |
| |
| struct |
| { |
| char *thread_name; |
| char *group_name; |
| char *parent_name; |
| jobjectID thread_id; |
| JNIEnv *thread_env_id; |
| } thread_start; |
| |
| } u; |
| |
| } JVMPI_Event; |
| |
| typedef struct |
| { |
| /* JVMPI version number. */ |
| jint version; |
| |
| /* Implemented by the user... */ |
| void (*NotifyEvent) (JVMPI_Event *event); |
| |
| /* Implemented by the runtime... */ |
| jint (*EnableEvent) (jint event_type, void *arg); |
| jint (*DisableEvent) (jint event_type, void *arg); |
| jint (*RequestEvent) (jint event_type, void *arg); |
| void (*GetCallTrace) (JVMPI_CallTrace *trace, jint depth); |
| void (*ProfilerExit) (jint); |
| JVMPI_RawMonitor (*RawMonitorCreate) (char *lock_name); |
| void (*RawMonitorEnter) (JVMPI_RawMonitor lock_id); |
| void (*RawMonitorExit) (JVMPI_RawMonitor lock_id); |
| void (*RawMonitorWait) (JVMPI_RawMonitor lock_id, jlong ms); |
| void (*RawMonitorNotifyAll) (JVMPI_RawMonitor lock_id); |
| void (*RawMonitorDestroy) (JVMPI_RawMonitor lock_id); |
| jlong (*GetCurrentThreadCpuTime) (void); |
| void (*SuspendThread) (JNIEnv *env); |
| void (*ResumeThread) (JNIEnv *env); |
| jint (*GetThreadStatus) (JNIEnv *env); |
| jboolean (*ThreadHasRun) (JNIEnv *env); |
| jint (*CreateSystemThread) (char *name, jint priority, void (*f) (void *)); |
| void (*SetThreadLocalStorage) (JNIEnv *env_id, void *ptr); |
| void *(*GetThreadLocalStorage) (JNIEnv *env_id); |
| void (*DisableGC) (void); |
| void (*EnableGC) (void); |
| void (*RunGC) (void); |
| jobjectID (*GetThreadObject) (JNIEnv *env); |
| jobjectID (*GetMethodClass) (jmethodID mid); |
| |
| } JVMPI_Interface; |
| |
| #endif /* __GCJ_JVMPI_H__ */ |