diff --git a/libjava/include/jvmpi.h b/libjava/include/jvmpi.h new file mode 100644 index 00000000000..1af9617825a --- /dev/null +++ b/libjava/include/jvmpi.h @@ -0,0 +1,227 @@ +/* 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__ */