PatchSet 6748 
Date: 2005/07/19 16:27:28
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Important JVMPI fixes. A few fixes for some compilers too.

        * include/jvmpi.h: Added support for JVMPI_VERSION_1_2.

        * include/kaffe_jni.h: Added new VM parameters about the profiler
        to load at startup.

        * kaffe/jvmpi/Makefile.am: JVMPI should be compiled and linked
        like the rest of the VM.

        * kaffe/jvmpi/Makefile.in: Regenerated.

        * kaffe/jvmpi/jvmpi_kaffe.c,
        kaffe/jvmpi/jvmpi_kaffe.h
        (jvmpiFillObjectLoad): Handle array more correctly.
        (jvmpiFillClassLoad): Fill the right structure entry using the
        instance field lists.
        (jvmpiFillMethodLoad): New function.
        (jvmpiRawMonitorCreate,
        jvmpiRawMonitorEnter,
        jvmpiRawMonitorExit,
        jvmpiRawMonitorWait,
        jvmpiRawMonitorNotifyAll,
        jvmpiRawMonitorDestroy): Use Klocks.
        (jvmpiRequestEvent): Return success if successful.
        (jvmpiCleanupThreadStart): New function.

        * kaffe/kaffe/main.c
        (options): Loading and executing the profiler is now handled by
        JNI itself.

        * kaffe/kaffevm/classPool.c
        (walkClassPool): Only walk valid entries.

        * kaffe/kaffevm/external.c,
        kaffe/kaffevm/external.h
        (loadNativeLibrary): Use "const char *" for the library name.

        * kaffe/kaffevm/gcFuncs.c
        (destroyClass): JVMPI is supported for all translators. Fixed
        typo.

        * kaffe/kaffevm/kaffe.def
        (IRETURN, LRETURN, FRETURN,
        DRETURN, ARETURN, RETURN): Acknowledge method exit.

        * kaffe/kaffevm/locks.c: Removed slowlock's timing. Updated JVMPI
        event handling for contended mutexes as the algorithm has changed.

        * kaffe/kaffevm/soft.c
        (soft_enter_method): Rearranged ifdefs.

        * kaffe/kaffevm/stats.c,
        kaffe/kaffevm/stats.h: Put variable definitions in KAFFE_STATS
        (for darwin). Added fulljit timer.

        * kaffe/kaffevm/thread.c
        (firstStartThread): Use jvmpiCleanupThreadStart now.

        * kaffe/kaffevm/intrp/machine.c
        (virtualMachine): Acknowledge enter/exit method using JVMPI.

        * kaffe/kaffevm/jit/machine.c
        (translate): Acknowledge translate completion.

        * kaffe/kaffevm/jit/native-wrapper.c
        (Kaffe_wrapper): Invoke exit_method() before method exit.

        * kaffe/kaffevm/jit3/machine.c
        (translate): Measure translation time using fulljit. Moved JVMPI
        event handling into an helper function.

        * kaffe/kaffevm/intrp/icode.h,
        kaffe/kaffevm/jit/codeproto.h,
        kaffe/kaffevm/jit/icode.c,
        kaffe/kaffevm/jit3/codeproto.h,
        kaffe/kaffevm/jit3/icode.c
        (exit_method) New icode to be called before exiting a method.
        (softcall_enter_method, softcall_exit_method): Implemented in JIT.

        * kaffe/kaffevm/jni/jni-base.c
        (JNI_CreateJavaVM): Load and invoke the profiler if needed.

        * kaffe/kaffevm/jni/jni-refs.c
        (KaffeJNI_NewWeakGlobalRef, KaffeJNI_DeleteWeakGlobalRef): Handle
        JVMPI events.

        * kaffe/kaffevm/jni/jni.c
        (Kaffe_GetEnv): Accept JVMPI 1.2.
        (Kaffe_JavaVMInitArgs): Initialize the new fields to NULL.

        * kaffe/kaffevm/systems/unix-pthreads/thread-impl.c,
        kaffe/kaffevm/systems/unix-pthreads/thread-internal.h
        (jthread_on_condvar, jthread_on_mutex, jthread_has_run,
        jthread_clear_run, jthread_get_status, jthread_from_data): Implemented.

Members: 
        ChangeLog:1.4273->1.4274 
        include/jvmpi.h:INITIAL->1.7 
        include/kaffe_jni.h:1.2->1.3 
        kaffe/jvmpi/Makefile.am:INITIAL->1.9 
        kaffe/jvmpi/Makefile.in:1.72->1.73 
        kaffe/jvmpi/jvmpi_kaffe.c:1.11->1.12 
        kaffe/jvmpi/jvmpi_kaffe.h:1.3->1.4 
        kaffe/kaffe/main.c:1.89->1.90 
        kaffe/kaffevm/classPool.c:1.36->1.37 
        kaffe/kaffevm/external.c:1.81->1.82 
        kaffe/kaffevm/external.h:INITIAL->1.12 
        kaffe/kaffevm/gcFuncs.c:1.78->1.79 
        kaffe/kaffevm/kaffe.def:1.40->1.41 
        kaffe/kaffevm/locks.c:1.62->1.63 
        kaffe/kaffevm/soft.c:1.78->1.79 
        kaffe/kaffevm/stats.c:1.9->1.10 
        kaffe/kaffevm/stats.h:1.3->1.4 
        kaffe/kaffevm/thread.c:1.102->1.103 
        kaffe/kaffevm/intrp/icode.h:1.25->1.26 
        kaffe/kaffevm/intrp/machine.c:1.50->1.51 
        kaffe/kaffevm/jit/codeproto.h:INITIAL->1.6 
        kaffe/kaffevm/jit/icode.c:1.35->1.36 
        kaffe/kaffevm/jit/machine.c:1.80->1.81 
        kaffe/kaffevm/jit/native-wrapper.c:1.11->1.12 
        kaffe/kaffevm/jit3/codeproto.h:INITIAL->1.18 
        kaffe/kaffevm/jit3/icode.c:1.57->1.58 
        kaffe/kaffevm/jit3/machine.c:1.76->1.77 
        kaffe/kaffevm/jni/jni-base.c:1.20->1.21 
        kaffe/kaffevm/jni/jni-refs.c:1.2->1.3 
        kaffe/kaffevm/jni/jni.c:1.35->1.36 
        kaffe/kaffevm/systems/unix-pthreads/thread-impl.c:1.85->1.86 
        kaffe/kaffevm/systems/unix-pthreads/thread-internal.h:1.40->1.41 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4273 kaffe/ChangeLog:1.4274
--- kaffe/ChangeLog:1.4273      Tue Jul 19 13:07:49 2005
+++ kaffe/ChangeLog     Tue Jul 19 16:27:28 2005
@@ -1,5 +1,101 @@
 2005-07-19  Guilhem Lavaux  <[EMAIL PROTECTED]>
 
+       * include/jvmpi.h: Added support for JVMPI_VERSION_1_2.
+
+       * include/kaffe_jni.h: Added new VM parameters about the profiler
+       to load at startup.
+
+       * kaffe/jvmpi/Makefile.am: JVMPI should be compiled and linked
+       like the rest of the VM.
+
+       * kaffe/jvmpi/Makefile.in: Regenerated.
+
+       * kaffe/jvmpi/jvmpi_kaffe.c,
+       kaffe/jvmpi/jvmpi_kaffe.h
+       (jvmpiFillObjectLoad): Handle array more correctly.
+       (jvmpiFillClassLoad): Fill the right structure entry using the
+       instance field lists.
+       (jvmpiFillMethodLoad): New function.
+       (jvmpiRawMonitorCreate,
+       jvmpiRawMonitorEnter,
+       jvmpiRawMonitorExit,
+       jvmpiRawMonitorWait,
+       jvmpiRawMonitorNotifyAll,
+       jvmpiRawMonitorDestroy): Use Klocks.
+       (jvmpiRequestEvent): Return success if successful.
+       (jvmpiCleanupThreadStart): New function.
+       
+       * kaffe/kaffe/main.c
+       (options): Loading and executing the profiler is now handled by
+       JNI itself.
+
+       * kaffe/kaffevm/classPool.c
+       (walkClassPool): Only walk valid entries.
+
+       * kaffe/kaffevm/external.c,
+       kaffe/kaffevm/external.h
+       (loadNativeLibrary): Use "const char *" for the library name.
+
+       * kaffe/kaffevm/gcFuncs.c
+       (destroyClass): JVMPI is supported for all translators. Fixed
+       typo.
+
+       * kaffe/kaffevm/kaffe.def
+       (IRETURN, LRETURN, FRETURN,
+       DRETURN, ARETURN, RETURN): Acknowledge method exit.
+
+       * kaffe/kaffevm/locks.c: Removed slowlock's timing. Updated JVMPI
+       event handling for contended mutexes as the algorithm has changed.
+
+       * kaffe/kaffevm/soft.c
+       (soft_enter_method): Rearranged ifdefs.
+
+       * kaffe/kaffevm/stats.c,
+       kaffe/kaffevm/stats.h: Put variable definitions in KAFFE_STATS
+       (for darwin). Added fulljit timer.
+
+       * kaffe/kaffevm/thread.c
+       (firstStartThread): Use jvmpiCleanupThreadStart now.
+       
+       * kaffe/kaffevm/intrp/machine.c
+       (virtualMachine): Acknowledge enter/exit method using JVMPI.
+
+       * kaffe/kaffevm/jit/machine.c
+       (translate): Acknowledge translate completion.
+
+       * kaffe/kaffevm/jit/native-wrapper.c
+       (Kaffe_wrapper): Invoke exit_method() before method exit.
+
+       * kaffe/kaffevm/jit3/machine.c
+       (translate): Measure translation time using fulljit. Moved JVMPI
+       event handling into an helper function.
+       
+       * kaffe/kaffevm/intrp/icode.h,
+       kaffe/kaffevm/jit/codeproto.h,
+       kaffe/kaffevm/jit/icode.c,
+       kaffe/kaffevm/jit3/codeproto.h,
+       kaffe/kaffevm/jit3/icode.c
+       (exit_method) New icode to be called before exiting a method.
+       (softcall_enter_method, softcall_exit_method): Implemented in JIT.
+
+       * kaffe/kaffevm/jni/jni-base.c
+       (JNI_CreateJavaVM): Load and invoke the profiler if needed.
+
+       * kaffe/kaffevm/jni/jni-refs.c
+       (KaffeJNI_NewWeakGlobalRef, KaffeJNI_DeleteWeakGlobalRef): Handle
+       JVMPI events.
+
+       * kaffe/kaffevm/jni/jni.c
+       (Kaffe_GetEnv): Accept JVMPI 1.2.
+       (Kaffe_JavaVMInitArgs): Initialize the new fields to NULL.
+
+       * kaffe/kaffevm/systems/unix-pthreads/thread-impl.c,
+       kaffe/kaffevm/systems/unix-pthreads/thread-internal.h
+       (jthread_on_condvar, jthread_on_mutex, jthread_has_run,
+       jthread_clear_run, jthread_get_status, jthread_from_data): Implemented.
+
+2005-07-19  Guilhem Lavaux  <[EMAIL PROTECTED]>
+
        * configure: Regenerated.
 
 2005-07-19  Dalibor Topic  <[EMAIL PROTECTED]>
===================================================================
Checking out kaffe/include/jvmpi.h
RCS:  /home/cvs/kaffe/kaffe/include/jvmpi.h,v
VERS: 1.7
***************
--- /dev/null   Sun Aug  4 19:57:58 2002
+++ kaffe/include/jvmpi.h       Tue Jul 19 16:32:23 2005
@@ -0,0 +1,381 @@
+/*
+ * jvmpi.h
+ * Java Virtual Machine Profiling Interface
+ */
+
+#ifndef _KAFFE_JVMPI_H
+#define _KAFFE_JVMPI_H
+
+#include <jni.h>
+
+/* JVMPI version numbers. */
+#define JVMPI_VERSION_1        0x10000001
+#define JVMPI_VERSION_1_1      0x10000002
+#define JVMPI_VERSION_1_2      0x10000003
+
+typedef void *jobjectID;
+
+enum {
+       JVMPI_FAIL = -1,
+       JVMPI_SUCCESS,
+       JVMPI_NOT_AVAILABLE
+};
+
+enum {
+       JVMPI_THREAD_RUNNABLE = 1,
+       JVMPI_THREAD_MONITOR_WAIT,
+       JVMPI_THREAD_CONDVAR_WAIT
+};
+
+enum {
+       JVMPI_THREAD_INTERRUPTED = 0x4000,
+       JVMPI_THREAD_SUSPENDED = 0x8000
+};
+
+enum {
+       JVMPI_MINIMUM_PRIORITY = 1,
+       JVMPI_NORMAL_PRIORITY = 5,
+       JVMPI_MAXIMUM_PRIORITY = 10
+};
+
+enum {
+       JVMPI_EVENT_METHOD_ENTRY = 1,
+       JVMPI_EVENT_METHOD_ENTRY2,
+       JVMPI_EVENT_METHOD_EXIT,
+       
+       JVMPI_EVENT_OBJECT_ALLOC = 4,
+       JVMPI_EVENT_OBJECT_FREE,
+       JVMPI_EVENT_OBJECT_MOVE,
+       
+       JVMPI_EVENT_COMPILED_METHOD_LOAD = 7,
+       JVMPI_EVENT_COMPILED_METHOD_UNLOAD,
+       
+       JVMPI_EVENT_INSTRUCTION_START = 9,
+       
+       JVMPI_EVENT_THREAD_START = 33,
+       JVMPI_EVENT_THREAD_END,
+       
+       JVMPI_EVENT_CLASS_LOAD_HOOK = 35,
+       
+       JVMPI_EVENT_HEAP_DUMP = 37,
+       
+       JVMPI_EVENT_JNI_GLOBALREF_ALLOC = 38,
+       JVMPI_EVENT_JNI_GLOBALREF_FREE,
+       JVMPI_EVENT_JNI_WEAK_GLOBALREF_ALLOC,
+       JVMPI_EVENT_JNI_WEAK_GLOBALREF_FREE,
+       
+       JVMPI_EVENT_CLASS_LOAD = 42,
+       JVMPI_EVENT_CLASS_UNLOAD,
+       
+       JVMPI_EVENT_DATA_DUMP_REQUEST = 44,
+       JVMPI_EVENT_DATA_RESET_REQUEST,
+       
+       JVMPI_EVENT_JVM_INIT_DONE = 46,
+       JVMPI_EVENT_JVM_SHUT_DOWN,
+       
+       JVMPI_EVENT_ARENA_NEW = 48,
+       JVMPI_EVENT_ARENA_DELETE,
+       
+       JVMPI_EVENT_OBJECT_DUMP = 50,
+       
+       JVMPI_EVENT_RAW_MONITOR_CONTENDED_ENTER = 51,
+       JVMPI_EVENT_RAW_MONITOR_CONTENDED_ENTERED,
+       JVMPI_EVENT_RAW_MONITOR_CONTENDED_EXIT,
+       JVMPI_EVENT_MONITOR_CONTENDED_ENTER,
+       JVMPI_EVENT_MONITOR_CONTENDED_ENTERED,
+       JVMPI_EVENT_MONITOR_CONTENDED_EXIT,
+       JVMPI_EVENT_MONITOR_WAIT,
+       JVMPI_EVENT_MONITOR_WAITED,
+       JVMPI_EVENT_MONITOR_DUMP,
+       
+       JVMPI_EVENT_GC_START = 60,
+       JVMPI_EVENT_GC_FINISH,
+       
+       JVMPI_EVENT_COUNT,
+       
+       JVMPI_REQUESTED_EVENT = 0x10000000
+};
+
+enum {
+       JVMPI_DUMP_LEVEL_0,
+       JVMPI_DUMP_LEVEL_1,
+       JVMPI_DUMP_LEVEL_2
+};
+
+enum {
+       JVMPI_NORMAL_OBJECT = 0,
+       JVMPI_CLASS = 2,
+       JVMPI_BOOLEAN = 4,
+       JVMPI_CHAR = 5,
+       JVMPI_FLOAT = 6,
+       JVMPI_DOUBLE = 7,
+       JVMPI_BYTE = 8,
+       JVMPI_SHORT = 9,
+       JVMPI_INT = 10,
+       JVMPI_LONG = 11
+};
+
+enum {
+       JVMPI_GC_ROOT_JNI_GLOBAL = 1,
+       JVMPI_GC_ROOT_JNI_LOCAL,
+       JVMPI_GC_ROOT_JAVA_FRAME,
+       JVMPI_GC_ROOT_NATIVE_STACK,
+       JVMPI_GC_ROOT_STICKY_CLASS,
+       JVMPI_GC_ROOT_THREAD_BLOCK,
+       JVMPI_GC_ROOT_MONITOR_USED,
+       JVMPI_GC_ROOT_THREAD_OBJ,
+       
+       JVMPI_GC_CLASS_DUMP = 0x20,
+       JVMPI_GC_INSTANCE_DUMP,
+       JVMPI_GC_OBJ_ARRAY_DUMP,
+       JVMPI_GC_PRIM_ARRAY_DUMP,
+       
+       JVMPI_GC_ROOT_UNKNOWN = 0xff
+};
+
+enum {
+       JVMPI_MONITOR_JAVA = 1,
+       JVMPI_MONITOR_RAW
+};
+
+typedef struct {
+       jint lineno;
+       jmethodID method_id;
+} JVMPI_CallFrame;
+
+typedef struct {
+       JNIEnv *env_id;
+       jint num_frames;
+       JVMPI_CallFrame *frames;
+} JVMPI_CallTrace;
+
+typedef struct {
+       const char *field_name;
+       const char *field_signature;
+} JVMPI_Field;
+
+typedef struct {
+       jint heap_dump_level;
+} JVMPI_HeapDumpArg;
+
+typedef struct {
+       jint offset;
+       jint lineno;
+} JVMPI_Lineno;
+
+typedef struct {
+       const char *method_name;
+       const char *method_signature;
+       jint start_lineno;
+       jint end_lineno;
+       jmethodID method_id;
+} JVMPI_Method;
+
+typedef struct _JVMPI_RawMonitor *JVMPI_RawMonitor;
+
+typedef struct {
+       jint event_type;
+       JNIEnv *env_id;
+  
+       union {
+               struct {
+                       jint arena_id;
+                       char *arena_name;
+               } new_arena;
+
+               struct {
+                       jint arena_id;
+               } delete_arena;
+               
+               struct {
+                       unsigned char *class_data;
+                       jint class_data_len;
+                       unsigned char *new_class_data;
+                       jint new_class_data_len;
+                       void * (*malloc_f)(unsigned int);
+               } class_load_hook;
+
+               struct {
+                       const 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 {
+                       jmethodID method_id;
+                       void *code_addr;
+                       jint code_size;
+                       jint lineno_table_size;
+                       JVMPI_Lineno *lineno_table;
+               } compiled_method_load;
+
+               struct { 
+                       jmethodID method_id;
+               } compiled_method_unload;
+               
+               struct {
+                       jlong used_objects;
+                       jlong used_object_space;
+                       jlong total_object_space;
+               } gc_info;
+
+               struct {
+                       int dump_level;
+                       char *begin;
+                       char *end;
+                       jint num_traces;
+                       JVMPI_CallTrace *traces;
+               } heap_dump;
+
+               struct {
+                       jobjectID obj_id;
+                       jobject ref_id;
+               } jni_globalref_alloc;
+
+               struct {
+                       jobject ref_id;
+               } jni_globalref_free;
+
+               struct {
+                       jmethodID method_id;
+               } method;
+               
+               struct {
+                       jmethodID method_id;
+                       jobjectID obj_id;
+               } method_entry2;
+
+               struct {
+                       jobjectID object;
+               } monitor;
+
+               struct {
+                       char *begin;
+                       char *end;
+                       jint num_traces;
+                       JVMPI_CallTrace *traces;
+                       jint *threads_status;
+               } monitor_dump;
+
+               struct {
+                       jobjectID object;
+                       jlong timeout;
+               } monitor_wait;
+
+               struct {
+                       jint arena_id;
+                       jobjectID class_id;
+                       jint is_array;
+                       jint size;
+                       jobjectID obj_id;
+               } obj_alloc;
+
+               struct {
+                       jobjectID obj_id;
+               } obj_free;
+
+               struct {
+                       jint data_len;
+                       char *data;
+               } object_dump;
+
+               struct {
+                       jint arena_id;
+                       jobjectID obj_id;
+                       jint new_arena_id;
+                       jobjectID new_obj_id;
+               } obj_move;
+
+               struct {
+                       char *name;
+                       JVMPI_RawMonitor id;
+               } raw_monitor;
+
+               struct {
+                       char *thread_name;
+                       char *group_name;
+                       char *parent_name;
+                       jobjectID thread_id;
+                       JNIEnv *thread_env_id;
+               } thread_start;
+
+               struct {
+                       jmethodID method_id;
+                       jint offset;
+                       union {
+                               struct {
+                                       jboolean is_true;
+                               } if_info;
+                               struct {
+                                       jint key;
+                                       jint low;
+                                       jint hi;
+                               } tableswitch_info;
+                               struct {
+                                       jint chosen_pair_index;
+                                       jboolean is_default;
+                               } lookupswitch_info;
+                       } u;
+               } instruction;
+       } u;
+} JVMPI_Event;
+
+typedef struct {
+       jint version;
+
+       void (*NotifyEvent)(JVMPI_Event *event);
+
+       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);
+
+       /* JNI handle <-> object ID conversions; VERSION_1_1 and newer */
+
+       jobject   (*jobjectID2jobject)(jobjectID jid);
+       jobjectID (*jobject2jobjectID)(jobject   j);
+
+       /* VERSION_1_2 and newer: */
+
+       void (*SuspendThreadList)(jint reqCount, JNIEnv **reqList, jint 
*results);
+       void (*ResumeThreadList)(jint reqCount, JNIEnv **reqList, jint 
*results);
+} JVMPI_Interface;
+
+#endif
Index: kaffe/include/kaffe_jni.h
diff -u kaffe/include/kaffe_jni.h:1.2 kaffe/include/kaffe_jni.h:1.3
--- kaffe/include/kaffe_jni.h:1.2       Thu Mar 31 10:39:27 2005
+++ kaffe/include/kaffe_jni.h   Tue Jul 19 16:27:33 2005
@@ -25,6 +25,8 @@
         jint            allocHeapSize;
         const char*     classhome;
         const char*     libraryhome;
+        const char*     profilerLibname;
+        const char*     profilerArguments;
 } KaffeVM_Arguments;
 
 extern KaffeVM_Arguments Kaffe_JavaVMArgs;
===================================================================
Checking out kaffe/kaffe/jvmpi/Makefile.am
RCS:  /home/cvs/kaffe/kaffe/kaffe/jvmpi/Makefile.am,v
VERS: 1.9
***************
--- /dev/null   Sun Aug  4 19:57:58 2002
+++ kaffe/kaffe/jvmpi/Makefile.am       Tue Jul 19 16:32:24 2005
@@ -0,0 +1,26 @@
+
+AM_CPPFLAGS = -I$(top_srcdir)/kaffe/kaffevm/$(THREAD_DIR) $(ENGINE_INCLUDES) 
-I$(top_srcdir)/libltdl $(ENGINE_DEFS) -I$(top_srcdir)/kaffe/kaffevm 
-I$(top_builddir)/include
+
+lib_LTLIBRARIES = libkaffejvmpi.la
+
+libkaffejvmpi_la_CFLAGS = \
+       $(CFLAGS_PG)
+
+libkaffejvmpi_la_LDFLAGS = \
+       -no-undefined \
+       -export-dynamic \
+       -release $(PACKAGE_VERSION)
+
+libkaffejvmpi_la_DEPENDENCIES = \
+       $(LIBLTDL) \
+       $(top_builddir)/kaffe/kaffevm/libkaffevm.la
+
+libkaffejvmpi_la_LIBADD = \
+       $(libkaffejvmpi_la_DEPENDENCIES) \
+       $(KVMLIBFLAGS) \
+       $(VM_LIBS) \
+       $(M_LIBS)
+
+libkaffejvmpi_la_SOURCES = \
+       jvmpi_kaffe.c \
+       jvmpi_kaffe.h
Index: kaffe/kaffe/jvmpi/Makefile.in
diff -u kaffe/kaffe/jvmpi/Makefile.in:1.72 kaffe/kaffe/jvmpi/Makefile.in:1.73
--- kaffe/kaffe/jvmpi/Makefile.in:1.72  Tue Jul 19 01:16:08 2005
+++ kaffe/kaffe/jvmpi/Makefile.in       Tue Jul 19 16:27:34 2005
@@ -389,6 +389,7 @@
 
 libkaffejvmpi_la_LIBADD = \
        $(libkaffejvmpi_la_DEPENDENCIES) \
+       $(KVMLIBFLAGS) \
        $(VM_LIBS) \
        $(M_LIBS)
 
Index: kaffe/kaffe/jvmpi/jvmpi_kaffe.c
diff -u kaffe/kaffe/jvmpi/jvmpi_kaffe.c:1.11 
kaffe/kaffe/jvmpi/jvmpi_kaffe.c:1.12
--- kaffe/kaffe/jvmpi/jvmpi_kaffe.c:1.11        Sun May 22 15:49:46 2005
+++ kaffe/kaffe/jvmpi/jvmpi_kaffe.c     Tue Jul 19 16:27:34 2005
@@ -5,6 +5,10 @@
  * Copyright (c) 2003 University of Utah and the Flux Group.
  * All rights reserved.
  *
+ * Copyright (c) 2003-2005 
+ *    The Kaffe.org's developers. All Rights reserved.
+ *    See ChangeLog for details.
+ *
  * This file is licensed under the terms of the GNU Public License.
  * See the file "license.terms" for information on usage and redistribution
  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
@@ -41,7 +45,8 @@
        JVMPI_Interface *retval;
 
        assert((version == JVMPI_VERSION_1) ||
-              (version == JVMPI_VERSION_1_1));
+              (version == JVMPI_VERSION_1_1) ||
+              (version == JVMPI_VERSION_1_2));
        
        retval = &jvmpi_data.jk_Interface;
        retval->version = version;
@@ -133,37 +138,44 @@
        if( CLASS_IS_ARRAY(cl) )
        {
                jint prim_type = 0;
+               Hjava_lang_Class *eclazz = CLASS_ELEMENT_TYPE(cl);
                
-               switch( CLASS_PRIM_SIG(CLASS_ELEMENT_TYPE(cl)) )
-               {
-               case 'I':
+               if (CLASS_IS_PRIMITIVE(eclazz))
+                 {
+                   switch( CLASS_PRIM_SIG(eclazz) )
+                     {
+                     case 'I':
                        prim_type = JVMPI_INT;
                        break;
-               case 'Z':
+                     case 'Z':
                        prim_type = JVMPI_BOOLEAN;
                        break;
-               case 'S':
+                     case 'S':
                        prim_type = JVMPI_SHORT;
                        break;
-               case 'B':
+                     case 'B':
                        prim_type = JVMPI_BYTE;
                        break;
-               case 'C':
+                     case 'C':
                        prim_type = JVMPI_CHAR;
                        break;
-               case 'F':
+                     case 'F':
                        prim_type = JVMPI_FLOAT;
                        break;
-               case 'D':
+                     case 'D':
                        prim_type = JVMPI_DOUBLE;
                        break;
-               case 'J':
+                     case 'J':
                        prim_type = JVMPI_LONG;
                        break;
-               default:
-                       assert(0);
+                     default:
+                       dprintf("Invalid primitive signature in 
jvmpiFillObjectAlloc\n");
+                       KAFFEVM_ABORT();
                        break;
-               }
+                     }
+                 }
+               else
+                 prim_type = JVMPI_CLASS;
                ev->u.obj_alloc.is_array = prim_type;
        }
        else
@@ -198,6 +210,13 @@
                &KTHREAD(get_data)((jthread_t)tid->vmThread->vmdata)->jniEnv;
 }
 
+void jvmpiCleanupThreadStart(JVMPI_Event *ev)
+{
+        KFREE(ev->u.thread_start.parent_name);
+       KFREE(ev->u.thread_start.group_name);
+       KFREE(ev->u.thread_start.thread_name);
+}
+
 void jvmpiFillClassLoad(JVMPI_Event *ev, struct Hjava_lang_Class *cl)
 {
        int lpc;
@@ -217,7 +236,7 @@
        }
        for( lpc = 0; lpc < CLASS_NIFIELDS(cl); lpc++ )
        {
-               jvmpiConvertField(&ev->u.class_load.statics[lpc],
+               jvmpiConvertField(&ev->u.class_load.instances[lpc],
                                  &CLASS_IFIELDS(cl)[lpc]);
        }
        ev->event_type = JVMPI_EVENT_CLASS_LOAD;
@@ -230,6 +249,39 @@
        ev->u.class_load.class_id = cl;
 }
 
+void jvmpiFillMethodLoad(JVMPI_Event *ev, Method *xmeth)
+{
+  ev->event_type = JVMPI_EVENT_COMPILED_METHOD_LOAD;
+  ev->u.compiled_method_load.method_id = xmeth;
+  ev->u.compiled_method_load.code_addr = METHOD_NATIVECODE(xmeth);
+  ev->u.compiled_method_load.code_size =
+    (uintp)xmeth->c.ncode.ncode_end - (uintp)xmeth->c.ncode.ncode_start;
+  
+  if( xmeth->lines )
+    {
+      JVMPI_Lineno *jvmpi_lineno = NULL;
+      int lpc;
+      
+      jvmpi_lineno = alloca(sizeof(JVMPI_Lineno) *
+                           xmeth->lines->length);
+      for( lpc = 0; lpc < xmeth->lines->length; lpc++ )
+       {
+         jvmpiConvertLineno(&jvmpi_lineno[lpc],
+                            &xmeth->lines->entry[lpc],
+                            METHOD_NATIVECODE(xmeth));
+       }
+      ev.u.compiled_method_load.lineno_table_size =
+       xmeth->lines->length;
+      ev.u.compiled_method_load.lineno_table =
+       jvmpi_lineno;
+    }
+  else
+    {
+      ev->u.compiled_method_load.lineno_table_size = 0;
+      ev->u.compiled_method_load.lineno_table = NULL;
+    }
+}
+
 static jint jvmpiCreateSystemThread(char *name,
                                    jint priority,
                                    void (*f)(void *))
@@ -505,8 +557,7 @@
 
        if( (retval = jmalloc(sizeof(struct _JVMPI_RawMonitor))) != NULL )
        {
-               jmutex_initialise(&retval->mux);
-               jcondvar_initialise(&retval->cv);
+               initStaticLock(&retval->monitor);
                retval->lock_name = lock_name;
        }
        return( retval );
@@ -516,8 +567,7 @@
 {
        if( lock_id != NULL )
        {
-               KMUTEX(destroy)(&lock_id->mux);
-               KCONDVAR(destroy)(&lock_id->cv);
+               destroyStaticLock(&lock_id->monitor);
                jfree(lock_id);
        }
 }
@@ -526,28 +576,28 @@
 {
        assert(lock_id != NULL);
        
-       KMUTEX(lock)(&lock_id->mux);
+       lockStaticMutex(&lock_id->monitor);
 }
 
 static void jvmpiRawMonitorExit(JVMPI_RawMonitor lock_id)
 {
        assert(lock_id != NULL);
        
-       KMUTEX(unlock)(&lock_id->mux);
+       unlockStaticMutex(&lock_id->monitor);
 }
 
 static void jvmpiRawMonitorNotifyAll(JVMPI_RawMonitor lock_id)
 {
        assert(lock_id != NULL);
        
-       KCONDVAR(broadcast)(&lock_id->cv, &lock_id->mux);
+       broadcastStaticCond(&lock_id->monitor);
 }
 
 static void jvmpiRawMonitorWait(JVMPI_RawMonitor lock_id, jlong ms)
 {
        assert(lock_id != NULL);
        
-       KCONDVAR(wait)(&lock_id->cv, &lock_id->mux, ms);
+       waitStaticCond(&lock_id->monitor, ms);
 }
 
 static jint jvmpiRequestEvent(jint event_type, void *arg)
@@ -569,6 +619,7 @@
                        JVMPI_Field *jvmpi_fields;
                        JVMPI_Event ev;
 
+                       retval = JVMPI_SUCCESS;
                        cl = (struct Hjava_lang_Class *)arg;
                        jvmpi_methods = alloca(sizeof(JVMPI_Method) *
                                               CLASS_NMETHODS(cl));
@@ -589,6 +640,7 @@
                        struct Hjava_lang_Thread *tid;
                        JVMPI_Event ev;
 
+                       retval = JVMPI_SUCCESS;
                        tid = (struct Hjava_lang_Thread *)arg;
                        jvmpiFillThreadStart(&ev, tid);
                        ev.event_type |= JVMPI_REQUESTED_EVENT;
@@ -603,6 +655,7 @@
                        struct Hjava_lang_Object *obj;
                        JVMPI_Event ev;
 
+                       retval = JVMPI_SUCCESS;
                        obj = (struct Hjava_lang_Object *)arg;
                        jvmpiFillObjectAlloc(&ev, obj);
                        ev.event_type |= JVMPI_REQUESTED_EVENT;
Index: kaffe/kaffe/jvmpi/jvmpi_kaffe.h
diff -u kaffe/kaffe/jvmpi/jvmpi_kaffe.h:1.3 kaffe/kaffe/jvmpi/jvmpi_kaffe.h:1.4
--- kaffe/kaffe/jvmpi/jvmpi_kaffe.h:1.3 Wed Jul  6 17:49:40 2005
+++ kaffe/kaffe/jvmpi/jvmpi_kaffe.h     Tue Jul 19 16:27:34 2005
@@ -22,14 +22,13 @@
 #include "lock-impl.h"
 #include "support.h"
 #include "code.h"
+#include "locks.h"
 
 /**
- * Implementation of a JVMPI_RawMonitor.  Just uses jmutex/jcondvar to do the
- * work.
+ * Implementation of a JVMPI_RawMonitor.  We use internal kaffe reentrant fast 
lock.
  */
 struct _JVMPI_RawMonitor {
-       jmutex mux;
-       jcondvar cv;
+        iStaticLock monitor;
        char *lock_name;
 };
 
@@ -125,6 +124,14 @@
 void jvmpiFillThreadStart(JVMPI_Event *ev, struct Hjava_lang_Thread *tid);
 
 /**
+ * Free all requested memory by jvmpiFillThreadStart. This must be called 
after the
+ * event has been posted to the profiler.
+ *
+ * @param ev The event object to cleanup. 
+ */
+void jvmpiCleanupThreadStart(JVMPI_Event *ev);
+
+/**
  * Fill in a JVMPI_Event structure with the data for a JVMPI_EVENT_CLASS_LOAD
  * event.  Note:  The class_load.methods, class_load.statics, and
  * class_load.instances arrays must be allocated before calling this method.
@@ -133,6 +140,15 @@
  * @param obj The object to describe in the event.
  */
 void jvmpiFillClassLoad(JVMPI_Event *ev, struct Hjava_lang_Class *cl);
+
+/**
+ * Fill in a JVMPI_Event structure with the data for a JVMPI_EVENT_METHOD_LOAD
+ * event.
+ *
+ * @param ev The event data structure to be filled.
+ * @param meth The method which will be used for filling.
+ */
+void jvmpiFillMethodLoad(JVMPI_Event *ev, Method *meth);
 
 #else
 
Index: kaffe/kaffe/kaffe/main.c
diff -u kaffe/kaffe/kaffe/main.c:1.89 kaffe/kaffe/kaffe/main.c:1.90
--- kaffe/kaffe/kaffe/main.c:1.89       Wed Jul 13 13:31:12 2005
+++ kaffe/kaffe/kaffe/main.c    Tue Jul 19 16:27:34 2005
@@ -62,7 +62,6 @@
 JNIEnv* global_env;
 JavaVM* global_vm;
 static int isJar = 0;
-static char *jvm_onload;
 
 static int options(char**, int);
 static void usage(void);
@@ -179,46 +178,6 @@
        /* Initialise */
        JNI_CreateJavaVM(&global_vm, &global_env, &vmargs);
 
-       /* Handle the '-Xrun' argument. */
-       if( jvm_onload != NULL )
-       {
-               char *libpath, *libargs;
-               char errbuf[512];
-               int i;
-
-               /* XXX Pull findLibrary() from the JanosVM. */
-               libpath = &jvm_onload[2];
-               libpath[0] = 'l';
-               libpath[1] = 'i';
-               libpath[2] = 'b';
-
-               if( (libargs = strchr(jvm_onload, ':')) != NULL )
-               {
-                       *libargs = '\0';
-                       libargs += 1;
-               }

*** Patch too long, truncated ***

_______________________________________________
kaffe mailing list
[email protected]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to