/* 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 /* 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__ */