1 // jvmti.cc - JVMTI implementation
3 /* Copyright (C) 2006 Free Software Foundation
5 This file is part of libgcj.
7 This software is copyrighted work licensed under the terms of the
8 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
15 #include <java-threads.h>
18 #include "jvmti-int.h"
20 #include <gcj/method.h>
22 #include <gnu/classpath/SystemProperties.h>
23 #include <gnu/gcj/runtime/BootClassLoader.h>
24 #include <java/lang/Class.h>
25 #include <java/lang/ClassLoader.h>
26 #include <java/lang/Object.h>
27 #include <java/lang/Thread.h>
28 #include <java/lang/Throwable.h>
29 #include <java/lang/VMClassLoader.h>
30 #include <java/lang/reflect/Field.h>
31 #include <java/lang/reflect/Modifier.h>
32 #include <java/util/Collection.h>
33 #include <java/util/HashMap.h>
34 #include <java/net/URL.h>
36 static void check_enabled_events (void);
37 static void check_enabled_event (jvmtiEvent
);
43 bool ThreadStart
= false;
44 bool ThreadEnd
= false;
45 bool ClassFileLoadHook
= false;
46 bool ClassLoad
= false;
47 bool ClassPrepare
= false;
49 bool Exception
= false;
50 bool ExceptionCatch
= false;
51 bool SingleStep
= false;
52 bool FramePop
= false;
53 bool Breakpoint
= false;
54 bool FieldAccess
= false;
55 bool FieldModification
= false;
56 bool MethodEntry
= false;
57 bool MethodExit
= false;
58 bool NativeMethodBind
= false;
59 bool CompiledMethodLoad
= false;
60 bool CompiledMethodUnload
= false;
61 bool DynamicCodeGenerated
= false;
62 bool DataDumpRequest
= false;
63 bool reserved72
= false;
64 bool MonitorWait
= false;
65 bool MonitorWaited
= false;
66 bool MonitorContendedEnter
= false;
67 bool MonitorContendedEntered
= false;
68 bool reserved77
= false;
69 bool reserved78
= false;
70 bool reserved79
= false;
71 bool reserved80
= false;
72 bool GarbageCollectionStart
= false;
73 bool GarbageCollectionFinish
= false;
74 bool ObjectFree
= false;
75 bool VMObjectAlloc
= false;
78 extern struct JNINativeInterface _Jv_JNIFunctions
;
80 struct _Jv_rawMonitorID
83 _Jv_ConditionVariable_t condition
;
86 /* A simple linked list of all JVMTI environments. Since
87 events must be delivered to environments in the order
88 in which the environments were created, new environments
89 are added to the end of the list. */
93 struct jvmti_env_list
*next
;
95 static struct jvmti_env_list
*_jvmtiEnvironments
= NULL
;
96 static java::lang::Object
*_envListLock
= NULL
;
97 #define FOREACH_ENVIRONMENT(Ele) \
98 for (Ele = _jvmtiEnvironments; Ele != NULL; Ele = Ele->next)
100 // Some commonly-used checks
102 #define THREAD_DEFAULT_TO_CURRENT(Ajthread) \
105 if (Ajthread == NULL) \
106 Ajthread = java::lang::Thread::currentThread (); \
110 #define THREAD_CHECK_VALID(Athread) \
113 if (!java::lang::Thread::class$.isAssignableFrom (&(Athread->class$))) \
114 return JVMTI_ERROR_INVALID_THREAD; \
118 #define THREAD_CHECK_IS_ALIVE(Athread) \
121 if (!Athread->isAlive ()) \
122 return JVMTI_ERROR_THREAD_NOT_ALIVE; \
126 // FIXME: if current phase is not set in Phases,
127 // return JVMTI_ERROR_WRONG_PHASE
128 #define REQUIRE_PHASE(Env, Phases)
130 #define NULL_CHECK(Ptr) \
134 return JVMTI_ERROR_NULL_POINTER; \
138 #define ILLEGAL_ARGUMENT(Cond) \
142 return JVMTI_ERROR_ILLEGAL_ARGUMENT; \
146 static jvmtiError JNICALL
147 _Jv_JVMTI_SuspendThread (MAYBE_UNUSED jvmtiEnv
*env
, jthread thread
)
149 using namespace java::lang
;
151 THREAD_DEFAULT_TO_CURRENT (thread
);
153 Thread
*t
= reinterpret_cast<Thread
*> (thread
);
154 THREAD_CHECK_VALID (t
);
155 THREAD_CHECK_IS_ALIVE (t
);
157 _Jv_Thread_t
*data
= _Jv_ThreadGetData (t
);
158 _Jv_SuspendThread (data
);
159 return JVMTI_ERROR_NONE
;
162 static jvmtiError JNICALL
163 _Jv_JVMTI_ResumeThread (MAYBE_UNUSED jvmtiEnv
*env
, jthread thread
)
165 using namespace java::lang
;
167 THREAD_DEFAULT_TO_CURRENT (thread
);
169 Thread
*t
= reinterpret_cast<Thread
*> (thread
);
170 THREAD_CHECK_VALID (t
);
171 THREAD_CHECK_IS_ALIVE (t
);
173 _Jv_Thread_t
*data
= _Jv_ThreadGetData (t
);
174 _Jv_ResumeThread (data
);
175 return JVMTI_ERROR_NONE
;
178 static jvmtiError JNICALL
179 _Jv_JVMTI_InterruptThread (MAYBE_UNUSED jvmtiEnv
*env
, jthread thread
)
181 using namespace java::lang
;
183 REQUIRE_PHASE (env
, JVMTI_PHASE_LIVE
);
184 // FIXME: capability handling? 'can_signal_thread'
186 return JVMTI_ERROR_INVALID_THREAD
;
188 Thread
*real_thread
= reinterpret_cast<Thread
*> (thread
);
189 THREAD_CHECK_VALID (real_thread
);
190 THREAD_CHECK_IS_ALIVE (real_thread
);
191 real_thread
->interrupt();
192 return JVMTI_ERROR_NONE
;
195 static jvmtiError JNICALL
196 _Jv_JVMTI_CreateRawMonitor (MAYBE_UNUSED jvmtiEnv
*env
, const char *name
,
197 jrawMonitorID
*result
)
199 REQUIRE_PHASE (env
, JVMTI_PHASE_ONLOAD
| JVMTI_PHASE_LIVE
);
202 *result
= (jrawMonitorID
) _Jv_MallocUnchecked (sizeof (_Jv_rawMonitorID
));
204 return JVMTI_ERROR_OUT_OF_MEMORY
;
205 _Jv_MutexInit (&(*result
)->mutex
);
206 _Jv_CondInit (&(*result
)->condition
);
207 return JVMTI_ERROR_NONE
;
210 static jvmtiError JNICALL
211 _Jv_JVMTI_DestroyRawMonitor (MAYBE_UNUSED jvmtiEnv
*env
, jrawMonitorID monitor
)
213 REQUIRE_PHASE (env
, JVMTI_PHASE_ONLOAD
| JVMTI_PHASE_LIVE
);
214 // Note we have no better way of knowing whether this object is
215 // really a raw monitor.
217 return JVMTI_ERROR_INVALID_MONITOR
;
218 // FIXME: perform checks on monitor, release it if this thread owns
220 #ifdef _Jv_HaveMutexDestroy
221 _Jv_MutexDestroy (&monitor
->mutex
);
224 return JVMTI_ERROR_NONE
;
227 static jvmtiError JNICALL
228 _Jv_JVMTI_RawMonitorEnter (MAYBE_UNUSED jvmtiEnv
*env
, jrawMonitorID monitor
)
231 return JVMTI_ERROR_INVALID_MONITOR
;
232 _Jv_MutexLock (&monitor
->mutex
);
233 return JVMTI_ERROR_NONE
;
236 static jvmtiError JNICALL
237 _Jv_JVMTI_RawMonitorExit (MAYBE_UNUSED jvmtiEnv
*env
, jrawMonitorID monitor
)
240 return JVMTI_ERROR_INVALID_MONITOR
;
241 if (_Jv_MutexUnlock (&monitor
->mutex
))
242 return JVMTI_ERROR_NOT_MONITOR_OWNER
;
243 return JVMTI_ERROR_NONE
;
246 static jvmtiError JNICALL
247 _Jv_JVMTI_RawMonitorWait (MAYBE_UNUSED jvmtiEnv
*env
, jrawMonitorID monitor
,
251 return JVMTI_ERROR_INVALID_MONITOR
;
252 int r
= _Jv_CondWait (&monitor
->condition
, &monitor
->mutex
, millis
, 0);
253 if (r
== _JV_NOT_OWNER
)
254 return JVMTI_ERROR_NOT_MONITOR_OWNER
;
255 if (r
== _JV_INTERRUPTED
)
256 return JVMTI_ERROR_INTERRUPT
;
257 return JVMTI_ERROR_NONE
;
260 static jvmtiError JNICALL
261 _Jv_JVMTI_RawMonitorNotify (MAYBE_UNUSED jvmtiEnv
*env
, jrawMonitorID monitor
)
264 return JVMTI_ERROR_INVALID_MONITOR
;
265 if (_Jv_CondNotify (&monitor
->condition
, &monitor
->mutex
) == _JV_NOT_OWNER
)
266 return JVMTI_ERROR_NOT_MONITOR_OWNER
;
267 return JVMTI_ERROR_NONE
;
270 static jvmtiError JNICALL
271 _Jv_JVMTI_RawMonitorNotifyAll (MAYBE_UNUSED jvmtiEnv
*env
,
272 jrawMonitorID monitor
)
275 return JVMTI_ERROR_INVALID_MONITOR
;
276 if (_Jv_CondNotifyAll (&monitor
->condition
, &monitor
->mutex
)
278 return JVMTI_ERROR_NOT_MONITOR_OWNER
;
279 return JVMTI_ERROR_NONE
;
282 static jvmtiError JNICALL
283 _Jv_JVMTI_Allocate (MAYBE_UNUSED jvmtiEnv
*env
, jlong size
,
284 unsigned char **result
)
286 ILLEGAL_ARGUMENT (size
< 0);
292 *result
= (unsigned char *) _Jv_MallocUnchecked (size
);
294 return JVMTI_ERROR_OUT_OF_MEMORY
;
296 return JVMTI_ERROR_NONE
;
299 static jvmtiError JNICALL
300 _Jv_JVMTI_Deallocate (MAYBE_UNUSED jvmtiEnv
*env
, unsigned char *mem
)
304 return JVMTI_ERROR_NONE
;
307 static jvmtiError JNICALL
308 _Jv_JVMTI_GetClassModifiers (MAYBE_UNUSED jvmtiEnv
*env
, jclass klass
,
311 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
312 // Don't bother checking KLASS' type.
314 return JVMTI_ERROR_INVALID_CLASS
;
316 *mods
= klass
->getModifiers();
317 return JVMTI_ERROR_NONE
;
320 static jvmtiError JNICALL
321 _Jv_JVMTI_GetClassMethods (MAYBE_UNUSED jvmtiEnv
*env
, jclass klass
,
322 jint
*count_ptr
, jmethodID
**methods_ptr
)
324 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
325 // FIXME: capability can_maintain_original_method_order
326 // Don't bother checking KLASS' type.
328 return JVMTI_ERROR_INVALID_CLASS
;
329 NULL_CHECK (count_ptr
);
330 NULL_CHECK (methods_ptr
);
331 *count_ptr
= JvNumMethods(klass
);
334 = (jmethodID
*) _Jv_MallocUnchecked (*count_ptr
* sizeof (jmethodID
));
335 if (*methods_ptr
== NULL
)
336 return JVMTI_ERROR_OUT_OF_MEMORY
;
338 jmethodID start
= JvGetFirstMethod (klass
);
339 for (jint i
= 0; i
< *count_ptr
; ++i
)
341 (*methods_ptr
)[i
] = start
+ i
;
343 return JVMTI_ERROR_NONE
;
346 static jvmtiError JNICALL
347 _Jv_JVMTI_IsInterface (MAYBE_UNUSED jvmtiEnv
*env
, jclass klass
,
350 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
352 return JVMTI_ERROR_INVALID_CLASS
;
354 *result
= klass
->isInterface();
355 return JVMTI_ERROR_NONE
;
358 static jvmtiError JNICALL
359 _Jv_JVMTI_IsArrayClass (MAYBE_UNUSED jvmtiEnv
*env
, jclass klass
,
362 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
364 return JVMTI_ERROR_INVALID_CLASS
;
366 *result
= klass
->isArray();
367 return JVMTI_ERROR_NONE
;
370 static jvmtiError JNICALL
371 _Jv_JVMTI_GetClassLoader (MAYBE_UNUSED jvmtiEnv
*env
, jclass klass
,
374 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
376 return JVMTI_ERROR_INVALID_CLASS
;
378 *result
= klass
->getClassLoaderInternal();
379 return JVMTI_ERROR_NONE
;
382 static jvmtiError JNICALL
383 _Jv_JVMTI_GetObjectHashCode (MAYBE_UNUSED jvmtiEnv
*env
, jobject obj
,
386 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
388 return JVMTI_ERROR_INVALID_OBJECT
;
390 *result
= _Jv_HashCode (obj
);
391 return JVMTI_ERROR_NONE
;
394 static jvmtiError JNICALL
395 _Jv_JVMTI_GetFieldModifiers (MAYBE_UNUSED jvmtiEnv
*env
, jclass klass
,
396 jfieldID field
, jint
*result
)
398 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
400 return JVMTI_ERROR_INVALID_CLASS
;
402 return JVMTI_ERROR_INVALID_FIELDID
;
404 *result
= field
->getModifiers();
405 return JVMTI_ERROR_NONE
;
408 static jvmtiError JNICALL
409 _Jv_JVMTI_IsFieldSynthetic (MAYBE_UNUSED jvmtiEnv
*env
, jclass klass
,
410 jfieldID field
, jboolean
*result
)
412 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
414 return JVMTI_ERROR_INVALID_CLASS
;
416 return JVMTI_ERROR_INVALID_FIELDID
;
419 // FIXME: capability can_get_synthetic_attribute
420 *result
= ((field
->getModifiers() & java::lang::reflect::Modifier::SYNTHETIC
)
422 return JVMTI_ERROR_NONE
;
425 static jvmtiError JNICALL
426 _Jv_JVMTI_GetMethodModifiers (MAYBE_UNUSED jvmtiEnv
*env
, jmethodID method
,
429 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
431 return JVMTI_ERROR_INVALID_METHODID
;
434 // FIXME: mask off some internal bits...
435 *result
= method
->accflags
;
436 return JVMTI_ERROR_NONE
;
439 static jvmtiError JNICALL
440 _Jv_JVMTI_IsMethodNative (MAYBE_UNUSED jvmtiEnv
*env
, jmethodID method
,
443 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
445 return JVMTI_ERROR_INVALID_METHODID
;
448 *result
= ((method
->accflags
& java::lang::reflect::Modifier::NATIVE
) != 0);
449 return JVMTI_ERROR_NONE
;
452 static jvmtiError JNICALL
453 _Jv_JVMTI_IsMethodSynthetic (MAYBE_UNUSED jvmtiEnv
*env
, jmethodID method
,
456 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
458 return JVMTI_ERROR_INVALID_METHODID
;
461 // FIXME capability can_get_synthetic_attribute
463 *result
= ((method
->accflags
& java::lang::reflect::Modifier::SYNTHETIC
)
465 return JVMTI_ERROR_NONE
;
468 static jvmtiError JNICALL
469 _Jv_JVMTI_GetClassLoaderClasses (MAYBE_UNUSED jvmtiEnv
*env
,
474 using namespace java::lang
;
475 using namespace java::util
;
477 REQUIRE_PHASE (env
, JVMTI_PHASE_LIVE
);
478 NULL_CHECK (count_ptr
);
479 NULL_CHECK (result_ptr
);
481 ClassLoader
*loader
= (ClassLoader
*) init_loader
;
483 loader
= VMClassLoader::bootLoader
;
485 Collection
*values
= loader
->loadedClasses
->values();
486 jobjectArray array
= values
->toArray();
487 *count_ptr
= array
->length
;
488 jobject
*elts
= elements (array
);
490 = (jclass
*) _Jv_MallocUnchecked (*count_ptr
* sizeof (jclass
));
492 return JVMTI_ERROR_OUT_OF_MEMORY
;
494 // FIXME: JNI references...
495 memcpy (result
, elts
, *count_ptr
* sizeof (jclass
));
497 *result_ptr
= result
;
499 return JVMTI_ERROR_NONE
;
502 static jvmtiError JNICALL
503 _Jv_JVMTI_ForceGarbageCollection (MAYBE_UNUSED jvmtiEnv
*env
)
505 REQUIRE_PHASE (env
, JVMTI_PHASE_LIVE
);
507 return JVMTI_ERROR_NONE
;
510 static jvmtiError JNICALL
511 _Jv_JVMTI_SetJNIFunctionTable (MAYBE_UNUSED jvmtiEnv
*env
,
512 const jniNativeInterface
*function_table
)
514 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
515 NULL_CHECK (function_table
);
516 memcpy (&_Jv_JNIFunctions
, function_table
, sizeof (jniNativeInterface
));
517 return JVMTI_ERROR_NONE
;
520 static jvmtiError JNICALL
521 _Jv_JVMTI_GetJNIFunctionTable (MAYBE_UNUSED jvmtiEnv
*env
,
522 jniNativeInterface
**function_table
)
524 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
525 NULL_CHECK (function_table
);
527 = (jniNativeInterface
*) _Jv_MallocUnchecked (sizeof (jniNativeInterface
));
528 if (*function_table
== NULL
)
529 return JVMTI_ERROR_OUT_OF_MEMORY
;
530 memcpy (*function_table
, &_Jv_JNIFunctions
, sizeof (jniNativeInterface
));
531 return JVMTI_ERROR_NONE
;
534 static jvmtiError JNICALL
535 _Jv_JVMTI_DisposeEnvironment (jvmtiEnv
*env
)
539 if (_jvmtiEnvironments
== NULL
)
540 return JVMTI_ERROR_INVALID_ENVIRONMENT
;
543 JvSynchronize
dummy (_envListLock
);
544 if (_jvmtiEnvironments
->env
== env
)
546 struct jvmti_env_list
*next
= _jvmtiEnvironments
->next
;
547 _Jv_Free (_jvmtiEnvironments
);
548 _jvmtiEnvironments
= next
;
552 struct jvmti_env_list
*e
= _jvmtiEnvironments
;
553 while (e
->next
!= NULL
&& e
->next
->env
!= env
)
556 return JVMTI_ERROR_INVALID_ENVIRONMENT
;
558 struct jvmti_env_list
*next
= e
->next
->next
;
566 check_enabled_events ();
568 return JVMTI_ERROR_NONE
;
571 static jvmtiError JNICALL
572 _Jv_JVMTI_GetSystemProperty (MAYBE_UNUSED jvmtiEnv
*env
, const char *property
,
575 REQUIRE_PHASE (env
, JVMTI_PHASE_ONLOAD
| JVMTI_PHASE_LIVE
);
576 NULL_CHECK (property
);
579 jstring name
= JvNewStringUTF(property
);
580 jstring result_str
= gnu::classpath::SystemProperties::getProperty(name
);
582 if (result_str
== NULL
)
583 return JVMTI_ERROR_NOT_AVAILABLE
;
585 int len
= JvGetStringUTFLength (result_str
);
586 *result
= (char *) _Jv_MallocUnchecked (len
+ 1);
588 return JVMTI_ERROR_OUT_OF_MEMORY
;
589 JvGetStringUTFRegion (result_str
, 0, result_str
->length(), *result
);
590 (*result
)[len
] = '\0';
592 return JVMTI_ERROR_NONE
;
595 static jvmtiError JNICALL
596 _Jv_JVMTI_SetSystemProperty (MAYBE_UNUSED jvmtiEnv
*env
, const char *property
,
599 REQUIRE_PHASE (env
, JVMTI_PHASE_ONLOAD
);
601 NULL_CHECK (property
);
604 // FIXME: When would a property not be writeable?
605 return JVMTI_ERROR_NONE
;
608 jstring prop_str
= JvNewStringUTF(property
);
609 jstring value_str
= JvNewStringUTF(value
);
610 gnu::classpath::SystemProperties::setProperty(prop_str
, value_str
);
611 return JVMTI_ERROR_NONE
;
614 static jvmtiError JNICALL
615 _Jv_JVMTI_GetTime (MAYBE_UNUSED jvmtiEnv
*env
, jlong
*nanos_ptr
)
617 NULL_CHECK (nanos_ptr
);
618 *nanos_ptr
= _Jv_platform_nanotime();
619 return JVMTI_ERROR_NONE
;
622 static jvmtiError JNICALL
623 _Jv_JVMTI_GetAvailableProcessors (MAYBE_UNUSED jvmtiEnv
*env
,
624 jint
*nprocessors_ptr
)
626 NULL_CHECK (nprocessors_ptr
);
627 #ifdef _SC_NPROCESSORS_ONLN
628 *nprocessors_ptr
= sysconf(_SC_NPROCESSORS_ONLN
);
630 *nprocessors_ptr
= 1;
632 return JVMTI_ERROR_NONE
;
635 static jvmtiError JNICALL
636 _Jv_JVMTI_AddToBootstrapClassLoaderSearch (MAYBE_UNUSED jvmtiEnv
*env
,
639 using namespace java::lang
;
640 using namespace java::net
;
641 using namespace gnu::gcj::runtime
;
643 REQUIRE_PHASE (env
, JVMTI_PHASE_ONLOAD
);
644 NULL_CHECK (segment
);
646 jstring str_segment
= JvNewStringUTF(segment
);
650 url
= new URL(JvNewStringUTF("file"), NULL
, str_segment
);
652 catch (jthrowable ignore
)
654 return JVMTI_ERROR_ILLEGAL_ARGUMENT
;
657 BootClassLoader
*loader
= VMClassLoader::bootLoader
;
658 // Don't call this too early.
659 // assert (loader != NULL);
661 return JVMTI_ERROR_NONE
;
664 static jvmtiError JNICALL
665 _Jv_JVMTI_SetVerboseFlag (MAYBE_UNUSED jvmtiEnv
*env
, jvmtiVerboseFlag flag
,
670 case JVMTI_VERBOSE_OTHER
:
671 case JVMTI_VERBOSE_GC
:
672 case JVMTI_VERBOSE_JNI
:
675 case JVMTI_VERBOSE_CLASS
:
676 gcj::verbose_class_flag
= value
;
679 return JVMTI_ERROR_ILLEGAL_ARGUMENT
;
681 return JVMTI_ERROR_NONE
;
684 static jvmtiError JNICALL
685 _Jv_JVMTI_GetObjectSize (MAYBE_UNUSED jvmtiEnv
*env
, jobject object
,
688 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
690 return JVMTI_ERROR_INVALID_OBJECT
;
693 jclass klass
= object
->getClass();
694 if (klass
->isArray())
696 jclass comp
= klass
->getComponentType();
698 = (jint
) (_Jv_uintptr_t
) _Jv_GetArrayElementFromElementType(NULL
,
699 klass
->getComponentType());
700 // FIXME: correct for primitive types?
701 jint compSize
= comp
->size();
702 __JArray
*array
= (__JArray
*) object
;
703 *result
= base
+ array
->length
* compSize
;
707 // Note that if OBJECT is a String then it may (if
708 // str->data==str) take more space. Do we care?
709 *result
= klass
->size();
711 return JVMTI_ERROR_NONE
;
714 /* An event is enabled only if it has both an event handler
715 and it is enabled in the environment. */
717 check_enabled_event (jvmtiEvent type
)
722 #define GET_OFFSET(Event) \
725 enabled = &JVMTI::Event; \
726 offset = offsetof (jvmtiEventCallbacks, Event); \
732 case JVMTI_EVENT_VM_INIT
:
736 case JVMTI_EVENT_VM_DEATH
:
737 GET_OFFSET (VMDeath
);
740 case JVMTI_EVENT_THREAD_START
:
741 GET_OFFSET (ThreadStart
);
744 case JVMTI_EVENT_THREAD_END
:
745 GET_OFFSET (ThreadEnd
);
748 case JVMTI_EVENT_CLASS_FILE_LOAD_HOOK
:
749 GET_OFFSET (ClassFileLoadHook
);
752 case JVMTI_EVENT_CLASS_LOAD
:
753 GET_OFFSET (ClassLoad
);
756 case JVMTI_EVENT_CLASS_PREPARE
:
757 GET_OFFSET (ClassPrepare
);
760 case JVMTI_EVENT_VM_START
:
761 GET_OFFSET (VMStart
);
764 case JVMTI_EVENT_EXCEPTION
:
765 GET_OFFSET (Exception
);
768 case JVMTI_EVENT_EXCEPTION_CATCH
:
769 GET_OFFSET (ExceptionCatch
);
772 case JVMTI_EVENT_SINGLE_STEP
:
773 GET_OFFSET (SingleStep
);
776 case JVMTI_EVENT_FRAME_POP
:
777 GET_OFFSET (FramePop
);
780 case JVMTI_EVENT_BREAKPOINT
:
781 GET_OFFSET (Breakpoint
);
784 case JVMTI_EVENT_FIELD_ACCESS
:
785 GET_OFFSET (FieldAccess
);
788 case JVMTI_EVENT_FIELD_MODIFICATION
:
789 GET_OFFSET (FieldModification
);
792 case JVMTI_EVENT_METHOD_ENTRY
:
793 GET_OFFSET (MethodEntry
);
796 case JVMTI_EVENT_METHOD_EXIT
:
797 GET_OFFSET (MethodExit
);
800 case JVMTI_EVENT_NATIVE_METHOD_BIND
:
801 GET_OFFSET (NativeMethodBind
);
804 case JVMTI_EVENT_COMPILED_METHOD_LOAD
:
805 GET_OFFSET (CompiledMethodLoad
);
808 case JVMTI_EVENT_COMPILED_METHOD_UNLOAD
:
809 GET_OFFSET (CompiledMethodUnload
);
812 case JVMTI_EVENT_DYNAMIC_CODE_GENERATED
:
813 GET_OFFSET (DynamicCodeGenerated
);
816 case JVMTI_EVENT_DATA_DUMP_REQUEST
:
817 GET_OFFSET (DataDumpRequest
);
820 case JVMTI_EVENT_MONITOR_WAIT
:
821 GET_OFFSET (MonitorWait
);
824 case JVMTI_EVENT_MONITOR_WAITED
:
825 GET_OFFSET (MonitorWaited
);
828 case JVMTI_EVENT_MONITOR_CONTENDED_ENTER
:
829 GET_OFFSET (MonitorContendedEnter
);
832 case JVMTI_EVENT_MONITOR_CONTENDED_ENTERED
:
833 GET_OFFSET (MonitorContendedEntered
);
836 case JVMTI_EVENT_GARBAGE_COLLECTION_START
:
837 GET_OFFSET (GarbageCollectionStart
);
840 case JVMTI_EVENT_GARBAGE_COLLECTION_FINISH
:
841 GET_OFFSET (GarbageCollectionFinish
);
844 case JVMTI_EVENT_OBJECT_FREE
:
845 GET_OFFSET (ObjectFree
);
848 case JVMTI_EVENT_VM_OBJECT_ALLOC
:
849 GET_OFFSET (VMObjectAlloc
);
854 "libgcj: check_enabled_event for unknown JVMTI event (%d)\n",
860 int index
= EVENT_INDEX (type
); // safe since caller checks this
862 JvSynchronize
dummy (_envListLock
);
863 struct jvmti_env_list
*e
;
864 FOREACH_ENVIRONMENT (e
)
867 = reinterpret_cast<char *> (&e
->env
->callbacks
) + offset
;
868 void **callback
= reinterpret_cast<void **> (addr
);
869 if (e
->env
->enabled
[index
] && *callback
!= NULL
)
880 check_enabled_events ()
882 check_enabled_event (JVMTI_EVENT_VM_INIT
);
883 check_enabled_event (JVMTI_EVENT_VM_DEATH
);
884 check_enabled_event (JVMTI_EVENT_THREAD_START
);
885 check_enabled_event (JVMTI_EVENT_THREAD_END
);
886 check_enabled_event (JVMTI_EVENT_CLASS_FILE_LOAD_HOOK
);
887 check_enabled_event (JVMTI_EVENT_CLASS_LOAD
);
888 check_enabled_event (JVMTI_EVENT_CLASS_PREPARE
);
889 check_enabled_event (JVMTI_EVENT_VM_START
);
890 check_enabled_event (JVMTI_EVENT_EXCEPTION
);
891 check_enabled_event (JVMTI_EVENT_EXCEPTION_CATCH
);
892 check_enabled_event (JVMTI_EVENT_SINGLE_STEP
);
893 check_enabled_event (JVMTI_EVENT_FRAME_POP
);
894 check_enabled_event (JVMTI_EVENT_BREAKPOINT
);
895 check_enabled_event (JVMTI_EVENT_FIELD_ACCESS
);
896 check_enabled_event (JVMTI_EVENT_FIELD_MODIFICATION
);
897 check_enabled_event (JVMTI_EVENT_METHOD_ENTRY
);
898 check_enabled_event (JVMTI_EVENT_METHOD_EXIT
);
899 check_enabled_event (JVMTI_EVENT_NATIVE_METHOD_BIND
);
900 check_enabled_event (JVMTI_EVENT_COMPILED_METHOD_LOAD
);
901 check_enabled_event (JVMTI_EVENT_COMPILED_METHOD_UNLOAD
);
902 check_enabled_event (JVMTI_EVENT_DYNAMIC_CODE_GENERATED
);
903 check_enabled_event (JVMTI_EVENT_DATA_DUMP_REQUEST
);
904 check_enabled_event (JVMTI_EVENT_MONITOR_WAIT
);
905 check_enabled_event (JVMTI_EVENT_MONITOR_WAITED
);
906 check_enabled_event (JVMTI_EVENT_MONITOR_CONTENDED_ENTER
);
907 check_enabled_event (JVMTI_EVENT_MONITOR_CONTENDED_ENTERED
);
908 check_enabled_event (JVMTI_EVENT_GARBAGE_COLLECTION_START
);
909 check_enabled_event (JVMTI_EVENT_GARBAGE_COLLECTION_FINISH
);
910 check_enabled_event (JVMTI_EVENT_OBJECT_FREE
);
911 check_enabled_event (JVMTI_EVENT_VM_OBJECT_ALLOC
);
914 static jvmtiError JNICALL
915 _Jv_JVMTI_SetEventNotificationMode (jvmtiEnv
*env
, jvmtiEventMode mode
,
916 jvmtiEvent type
, jthread event_thread
, ...)
918 REQUIRE_PHASE (env
, JVMTI_PHASE_ONLOAD
| JVMTI_PHASE_LIVE
);
920 if (event_thread
!= NULL
)
922 using namespace java::lang
;
923 Thread
*t
= reinterpret_cast<Thread
*> (event_thread
);
924 THREAD_CHECK_VALID (t
);
925 THREAD_CHECK_IS_ALIVE (t
);
939 return JVMTI_ERROR_ILLEGAL_ARGUMENT
;
944 case JVMTI_EVENT_VM_INIT
:
945 case JVMTI_EVENT_VM_DEATH
:
946 case JVMTI_EVENT_THREAD_START
:
947 case JVMTI_EVENT_VM_START
:
948 case JVMTI_EVENT_COMPILED_METHOD_LOAD
:
949 case JVMTI_EVENT_COMPILED_METHOD_UNLOAD
:
950 case JVMTI_EVENT_DYNAMIC_CODE_GENERATED
:
951 case JVMTI_EVENT_DATA_DUMP_REQUEST
:
952 ILLEGAL_ARGUMENT (event_thread
!= NULL
);
955 case JVMTI_EVENT_THREAD_END
:
956 case JVMTI_EVENT_CLASS_FILE_LOAD_HOOK
:
957 case JVMTI_EVENT_CLASS_LOAD
:
958 case JVMTI_EVENT_CLASS_PREPARE
:
959 case JVMTI_EVENT_EXCEPTION
:
960 case JVMTI_EVENT_EXCEPTION_CATCH
:
961 case JVMTI_EVENT_SINGLE_STEP
:
962 case JVMTI_EVENT_FRAME_POP
:
963 case JVMTI_EVENT_BREAKPOINT
:
964 case JVMTI_EVENT_FIELD_ACCESS
:
965 case JVMTI_EVENT_FIELD_MODIFICATION
:
966 case JVMTI_EVENT_METHOD_ENTRY
:
967 case JVMTI_EVENT_METHOD_EXIT
:
968 case JVMTI_EVENT_NATIVE_METHOD_BIND
:
969 case JVMTI_EVENT_MONITOR_WAIT
:
970 case JVMTI_EVENT_MONITOR_WAITED
:
971 case JVMTI_EVENT_MONITOR_CONTENDED_ENTER
:
972 case JVMTI_EVENT_MONITOR_CONTENDED_ENTERED
:
973 case JVMTI_EVENT_GARBAGE_COLLECTION_START
:
974 case JVMTI_EVENT_GARBAGE_COLLECTION_FINISH
:
975 case JVMTI_EVENT_OBJECT_FREE
:
976 case JVMTI_EVENT_VM_OBJECT_ALLOC
:
980 return JVMTI_ERROR_INVALID_EVENT_TYPE
;
983 env
->thread
[EVENT_INDEX(type
)] = event_thread
;
984 env
->enabled
[EVENT_INDEX(type
)] = enabled
;
985 check_enabled_event (type
);
986 return JVMTI_ERROR_NONE
;
989 static jvmtiError JNICALL
990 _Jv_JVMTI_SetEventCallbacks (jvmtiEnv
*env
,
991 const jvmtiEventCallbacks
*callbacks
,
992 jint size_of_callbacks
)
994 REQUIRE_PHASE (env
, JVMTI_PHASE_ONLOAD
| JVMTI_PHASE_LIVE
);
995 ILLEGAL_ARGUMENT (size_of_callbacks
< 0);
997 // Copy the list of callbacks into the environment
998 memcpy (&env
->callbacks
, callbacks
, sizeof (jvmtiEventCallbacks
));
1000 /* Check which events are now enabeld (JVMTI makes no requirements
1001 about the order in which SetEventCallbacks and SetEventNotifications
1002 are called. So we must check all events here. */
1003 check_enabled_events ();
1005 return JVMTI_ERROR_NONE
;
1008 static jvmtiError JNICALL
1009 _Jv_JVMTI_GetErrorName (MAYBE_UNUSED jvmtiEnv
*env
, jvmtiError error
,
1012 NULL_CHECK (name_ptr
);
1017 case JVMTI_ERROR_NONE
:
1021 case JVMTI_ERROR_NULL_POINTER
:
1022 name
= "null pointer";
1025 case JVMTI_ERROR_OUT_OF_MEMORY
:
1026 name
= "out of memory";
1029 case JVMTI_ERROR_ACCESS_DENIED
:
1030 name
= "access denied";
1033 case JVMTI_ERROR_WRONG_PHASE
:
1034 name
= "wrong phase";
1037 case JVMTI_ERROR_INTERNAL
:
1038 name
= "internal error";
1041 case JVMTI_ERROR_UNATTACHED_THREAD
:
1042 name
= "unattached thread";
1045 case JVMTI_ERROR_INVALID_ENVIRONMENT
:
1046 name
= "invalid environment";
1049 case JVMTI_ERROR_INVALID_PRIORITY
:
1050 name
= "invalid priority";
1053 case JVMTI_ERROR_THREAD_NOT_SUSPENDED
:
1054 name
= "thread not suspended";
1057 case JVMTI_ERROR_THREAD_SUSPENDED
:
1058 name
= "thread suspended";
1061 case JVMTI_ERROR_THREAD_NOT_ALIVE
:
1062 name
= "thread not alive";
1065 case JVMTI_ERROR_CLASS_NOT_PREPARED
:
1066 name
= "class not prepared";
1069 case JVMTI_ERROR_NO_MORE_FRAMES
:
1070 name
= "no more frames";
1073 case JVMTI_ERROR_OPAQUE_FRAME
:
1074 name
= "opaque frame";
1077 case JVMTI_ERROR_DUPLICATE
:
1081 case JVMTI_ERROR_NOT_FOUND
:
1085 case JVMTI_ERROR_NOT_MONITOR_OWNER
:
1086 name
= "not monitor owner";
1089 case JVMTI_ERROR_INTERRUPT
:
1090 name
= "interrupted";
1093 case JVMTI_ERROR_UNMODIFIABLE_CLASS
:
1094 name
= "unmodifiable class";
1097 case JVMTI_ERROR_NOT_AVAILABLE
:
1098 name
= "not available";
1101 case JVMTI_ERROR_ABSENT_INFORMATION
:
1102 name
= "absent information";
1105 case JVMTI_ERROR_INVALID_EVENT_TYPE
:
1106 name
= "invalid event type";
1109 case JVMTI_ERROR_NATIVE_METHOD
:
1110 name
= "native method";
1113 case JVMTI_ERROR_INVALID_THREAD
:
1114 name
= "invalid thread";
1117 case JVMTI_ERROR_INVALID_THREAD_GROUP
:
1118 name
= "invalid thread group";
1121 case JVMTI_ERROR_INVALID_OBJECT
:
1122 name
= "invalid object";
1125 case JVMTI_ERROR_INVALID_CLASS
:
1126 name
= "invalid class";
1129 case JVMTI_ERROR_INVALID_METHODID
:
1130 name
= "invalid method ID";
1133 case JVMTI_ERROR_INVALID_LOCATION
:
1134 name
= "invalid location";
1137 case JVMTI_ERROR_INVALID_FIELDID
:
1138 name
= "invalid field ID";
1141 case JVMTI_ERROR_TYPE_MISMATCH
:
1142 name
= "type mismatch";
1145 case JVMTI_ERROR_INVALID_SLOT
:
1146 name
= "invalid slot";
1149 case JVMTI_ERROR_INVALID_MONITOR
:
1150 name
= "invalid monitor";
1153 case JVMTI_ERROR_INVALID_CLASS_FORMAT
:
1154 name
= "invalid class format";
1157 case JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION
:
1158 name
= "circular class definition";
1161 case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED
:
1162 name
= "unsupported redefinition: method added";
1165 case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED
:
1166 name
= "unsupported redefinition: schema changed";
1169 case JVMTI_ERROR_INVALID_TYPESTATE
:
1170 name
= "invalid type state";
1173 case JVMTI_ERROR_FAILS_VERIFICATION
:
1174 name
= "fails verification";
1177 case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED
:
1178 name
= "unsupported redefinition: hierarchy changed";
1181 case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED
:
1182 name
= "unsupported redefinition: method deleted";
1185 case JVMTI_ERROR_UNSUPPORTED_VERSION
:
1186 name
= "unsupported version";
1189 case JVMTI_ERROR_NAMES_DONT_MATCH
:
1190 name
= "names do not match";
1193 case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED
:
1194 name
= "unsupported redefinition: class modifiers changed";
1197 case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED
:
1198 name
= "unsupported redefinition: method modifiers changed";
1201 case JVMTI_ERROR_MUST_POSSESS_CAPABILITY
:
1202 name
= "must possess capability";
1205 case JVMTI_ERROR_ILLEGAL_ARGUMENT
:
1206 name
= "illegal argument";
1210 return JVMTI_ERROR_ILLEGAL_ARGUMENT
;
1213 *name_ptr
= (char *) _Jv_MallocUnchecked (strlen (name
) + 1);
1214 if (*name_ptr
== NULL
)
1215 return JVMTI_ERROR_OUT_OF_MEMORY
;
1217 strcpy (*name_ptr
, name
);
1218 return JVMTI_ERROR_NONE
;
1221 #define RESERVED NULL
1222 #define UNIMPLEMENTED NULL
1224 struct _Jv_jvmtiEnv _Jv_JVMTI_Interface
=
1226 RESERVED
, // reserved1
1227 _Jv_JVMTI_SetEventNotificationMode
, // SetEventNotificationMode
1228 RESERVED
, // reserved3
1229 UNIMPLEMENTED
, // GetAllThreads
1230 _Jv_JVMTI_SuspendThread
, // SuspendThread
1231 _Jv_JVMTI_ResumeThread
, // ResumeThread
1232 UNIMPLEMENTED
, // StopThread
1233 _Jv_JVMTI_InterruptThread
, // InterruptThread
1234 UNIMPLEMENTED
, // GetThreadInfo
1235 UNIMPLEMENTED
, // GetOwnedMonitorInfo
1236 UNIMPLEMENTED
, // GetCurrentContendedMonitor
1237 UNIMPLEMENTED
, // RunAgentThread
1238 UNIMPLEMENTED
, // GetTopThreadGroups
1239 UNIMPLEMENTED
, // GetThreadGroupInfo
1240 UNIMPLEMENTED
, // GetThreadGroupChildren
1241 UNIMPLEMENTED
, // GetFrameCount
1242 UNIMPLEMENTED
, // GetThreadState
1243 RESERVED
, // reserved18
1244 UNIMPLEMENTED
, // GetFrameLocation
1245 UNIMPLEMENTED
, // NotifyPopFrame
1246 UNIMPLEMENTED
, // GetLocalObject
1247 UNIMPLEMENTED
, // GetLocalInt
1248 UNIMPLEMENTED
, // GetLocalLong
1249 UNIMPLEMENTED
, // GetLocalFloat
1250 UNIMPLEMENTED
, // GetLocalDouble
1251 UNIMPLEMENTED
, // SetLocalObject
1252 UNIMPLEMENTED
, // SetLocalInt
1253 UNIMPLEMENTED
, // SetLocalLong
1254 UNIMPLEMENTED
, // SetLocalFloat
1255 UNIMPLEMENTED
, // SetLocalDouble
1256 _Jv_JVMTI_CreateRawMonitor
, // CreateRawMonitor
1257 _Jv_JVMTI_DestroyRawMonitor
, // DestroyRawMonitor
1258 _Jv_JVMTI_RawMonitorEnter
, // RawMonitorEnter
1259 _Jv_JVMTI_RawMonitorExit
, // RawMonitorExit
1260 _Jv_JVMTI_RawMonitorWait
, // RawMonitorWait
1261 _Jv_JVMTI_RawMonitorNotify
, // RawMonitorNotify
1262 _Jv_JVMTI_RawMonitorNotifyAll
, // RawMonitorNotifyAll
1263 UNIMPLEMENTED
, // SetBreakpoint
1264 UNIMPLEMENTED
, // ClearBreakpoint
1265 RESERVED
, // reserved40
1266 UNIMPLEMENTED
, // SetFieldAccessWatch
1267 UNIMPLEMENTED
, // ClearFieldAccessWatch
1268 UNIMPLEMENTED
, // SetFieldModificationWatch
1269 UNIMPLEMENTED
, // ClearFieldModificationWatch
1270 RESERVED
, // reserved45
1271 _Jv_JVMTI_Allocate
, // Allocate
1272 _Jv_JVMTI_Deallocate
, // Deallocate
1273 UNIMPLEMENTED
, // GetClassSignature
1274 UNIMPLEMENTED
, // GetClassStatus
1275 UNIMPLEMENTED
, // GetSourceFileName
1276 _Jv_JVMTI_GetClassModifiers
, // GetClassModifiers
1277 _Jv_JVMTI_GetClassMethods
, // GetClassMethods
1278 UNIMPLEMENTED
, // GetClassFields
1279 UNIMPLEMENTED
, // GetImplementedInterfaces
1280 _Jv_JVMTI_IsInterface
, // IsInterface
1281 _Jv_JVMTI_IsArrayClass
, // IsArrayClass
1282 _Jv_JVMTI_GetClassLoader
, // GetClassLoader
1283 _Jv_JVMTI_GetObjectHashCode
, // GetObjectHashCode
1284 UNIMPLEMENTED
, // GetObjectMonitorUsage
1285 UNIMPLEMENTED
, // GetFieldName
1286 UNIMPLEMENTED
, // GetFieldDeclaringClass
1287 _Jv_JVMTI_GetFieldModifiers
, // GetFieldModifiers
1288 _Jv_JVMTI_IsFieldSynthetic
, // IsFieldSynthetic
1289 UNIMPLEMENTED
, // GetMethodName
1290 UNIMPLEMENTED
, // GetMethodDeclaringClass
1291 _Jv_JVMTI_GetMethodModifiers
, // GetMethodModifers
1292 RESERVED
, // reserved67
1293 UNIMPLEMENTED
, // GetMaxLocals
1294 UNIMPLEMENTED
, // GetArgumentsSize
1295 UNIMPLEMENTED
, // GetLineNumberTable
1296 UNIMPLEMENTED
, // GetMethodLocation
1297 UNIMPLEMENTED
, // GetLocalVariableTable
1298 RESERVED
, // reserved73
1299 RESERVED
, // reserved74
1300 UNIMPLEMENTED
, // GetBytecodes
1301 _Jv_JVMTI_IsMethodNative
, // IsMethodNative
1302 _Jv_JVMTI_IsMethodSynthetic
, // IsMethodSynthetic
1303 UNIMPLEMENTED
, // GetLoadedClasses
1304 _Jv_JVMTI_GetClassLoaderClasses
, // GetClassLoaderClasses
1305 UNIMPLEMENTED
, // PopFrame
1306 RESERVED
, // reserved81
1307 RESERVED
, // reserved82
1308 RESERVED
, // reserved83
1309 RESERVED
, // reserved84
1310 RESERVED
, // reserved85
1311 RESERVED
, // reserved86
1312 UNIMPLEMENTED
, // RedefineClasses
1313 UNIMPLEMENTED
, // GetVersionNumber
1314 UNIMPLEMENTED
, // GetCapabilities
1315 UNIMPLEMENTED
, // GetSourceDebugExtension
1316 UNIMPLEMENTED
, // IsMethodObsolete
1317 UNIMPLEMENTED
, // SuspendThreadList
1318 UNIMPLEMENTED
, // ResumeThreadList
1319 RESERVED
, // reserved94
1320 RESERVED
, // reserved95
1321 RESERVED
, // reserved96
1322 RESERVED
, // reserved97
1323 RESERVED
, // reserved98
1324 RESERVED
, // reserved99
1325 UNIMPLEMENTED
, // GetAllStackTraces
1326 UNIMPLEMENTED
, // GetThreadListStackTraces
1327 UNIMPLEMENTED
, // GetThreadLocalStorage
1328 UNIMPLEMENTED
, // SetThreadLocalStorage
1329 UNIMPLEMENTED
, // GetStackTrace
1330 RESERVED
, // reserved105
1331 UNIMPLEMENTED
, // GetTag
1332 UNIMPLEMENTED
, // SetTag
1333 _Jv_JVMTI_ForceGarbageCollection
, // ForceGarbageCollection
1334 UNIMPLEMENTED
, // IterateOverObjectsReachable
1335 UNIMPLEMENTED
, // IterateOverReachableObjects
1336 UNIMPLEMENTED
, // IterateOverHeap
1337 UNIMPLEMENTED
, // IterateOverInstanceOfClass
1338 RESERVED
, // reserved113
1339 UNIMPLEMENTED
, // GetObjectsWithTags
1340 RESERVED
, // reserved115
1341 RESERVED
, // reserved116
1342 RESERVED
, // reserved117
1343 RESERVED
, // reserved118
1344 RESERVED
, // reserved119
1345 _Jv_JVMTI_SetJNIFunctionTable
, // SetJNIFunctionTable
1346 _Jv_JVMTI_GetJNIFunctionTable
, // GetJNIFunctionTable
1347 _Jv_JVMTI_SetEventCallbacks
, // SetEventCallbacks
1348 UNIMPLEMENTED
, // GenerateEvents
1349 UNIMPLEMENTED
, // GetExtensionFunctions
1350 UNIMPLEMENTED
, // GetExtensionEvents
1351 UNIMPLEMENTED
, // SetExtensionEventCallback
1352 _Jv_JVMTI_DisposeEnvironment
, // DisposeEnvironment
1353 _Jv_JVMTI_GetErrorName
, // GetErrorName
1354 UNIMPLEMENTED
, // GetJLocationFormat
1355 UNIMPLEMENTED
, // GetSystemProperties
1356 _Jv_JVMTI_GetSystemProperty
, // GetSystemProperty
1357 _Jv_JVMTI_SetSystemProperty
, // SetSystemProperty
1358 UNIMPLEMENTED
, // GetPhase
1359 UNIMPLEMENTED
, // GetCurrentThreadCpuTimerInfo
1360 UNIMPLEMENTED
, // GetCurrentThreadCpuTime
1361 UNIMPLEMENTED
, // GetThreadCpuTimerInfo
1362 UNIMPLEMENTED
, // GetThreadCpuTime
1363 UNIMPLEMENTED
, // GetTimerInfo
1364 _Jv_JVMTI_GetTime
, // GetTime
1365 UNIMPLEMENTED
, // GetPotentialCapabilities
1366 RESERVED
, // reserved141
1367 UNIMPLEMENTED
, // AddCapabilities
1368 UNIMPLEMENTED
, // RelinquishCapabilities
1369 _Jv_JVMTI_GetAvailableProcessors
, // GetAvailableProcessors
1370 RESERVED
, // reserved145
1371 RESERVED
, // reserved146
1372 UNIMPLEMENTED
, // GetEnvironmentLocalStorage
1373 UNIMPLEMENTED
, // SetEnvironmentLocalStorage
1374 _Jv_JVMTI_AddToBootstrapClassLoaderSearch
, // AddToBootstrapClassLoaderSearch
1375 _Jv_JVMTI_SetVerboseFlag
, // SetVerboseFlag
1376 RESERVED
, // reserved151
1377 RESERVED
, // reserved152
1378 RESERVED
, // reserved153
1379 _Jv_JVMTI_GetObjectSize
// GetObjectSize
1383 _Jv_GetJVMTIEnv (void)
1386 = (_Jv_JVMTIEnv
*) _Jv_MallocUnchecked (sizeof (_Jv_JVMTIEnv
));
1387 env
->p
= &_Jv_JVMTI_Interface
;
1390 JvSynchronize
dummy (_envListLock
);
1391 struct jvmti_env_list
*element
1392 = (struct jvmti_env_list
*) _Jv_MallocUnchecked (sizeof (struct jvmti_env_list
));
1394 element
->next
= NULL
;
1396 if (_jvmtiEnvironments
== NULL
)
1397 _jvmtiEnvironments
= element
;
1400 struct jvmti_env_list
*e
;
1401 for (e
= _jvmtiEnvironments
; e
->next
!= NULL
; e
= e
->next
)
1413 _jvmtiEnvironments
= NULL
;
1414 _envListLock
= new java::lang::Object ();
1416 // No environments, so this should set all JVMTI:: members to false
1417 check_enabled_events ();
1421 post_event (jvmtiEnv
*env
, jvmtiEvent type
, jthread event_thread
, va_list args
)
1423 #define ARG(Type,Name) Type Name = (Type) va_arg (args, Type)
1425 #define GET_BOOLEAN_ARG(Name) \
1427 jboolean Name = (b == 0) ? false : true
1429 #define GET_CHAR_ARG(Name) \
1431 char Name = static_cast<char> (c)
1435 case JVMTI_EVENT_VM_INIT
:
1436 if (env
->callbacks
.VMInit
!= NULL
)
1438 ARG (JNIEnv
*, jni_env
);
1439 env
->callbacks
.VMInit (env
, jni_env
, event_thread
);
1443 case JVMTI_EVENT_VM_DEATH
:
1444 if (env
->callbacks
.VMDeath
!= NULL
)
1446 ARG (JNIEnv
*, jni_env
);
1447 env
->callbacks
.VMDeath (env
, jni_env
);
1451 case JVMTI_EVENT_THREAD_START
:
1452 if (env
->callbacks
.ThreadStart
!= NULL
)
1454 ARG (JNIEnv
*, jni_env
);
1455 env
->callbacks
.ThreadStart (env
, jni_env
, event_thread
);
1459 case JVMTI_EVENT_THREAD_END
:
1460 if (env
->callbacks
.ThreadEnd
!= NULL
)
1462 ARG (JNIEnv
*, jni_env
);
1463 env
->callbacks
.ThreadEnd (env
, jni_env
, event_thread
);
1467 case JVMTI_EVENT_CLASS_FILE_LOAD_HOOK
:
1468 if (env
->callbacks
.ClassFileLoadHook
!= NULL
)
1470 ARG (JNIEnv
*, jni_env
);
1471 ARG (jclass
, class_being_redefined
);
1472 ARG (jobject
, loader
);
1473 ARG (const char *, name
);
1474 ARG (jobject
, protection_domain
);
1475 ARG (jint
, class_data_len
);
1476 ARG (const unsigned char *, class_data
);
1477 ARG (jint
*, new_class_data_len
);
1478 ARG (unsigned char **, new_class_data
);
1479 env
->callbacks
.ClassFileLoadHook (env
, jni_env
,
1480 class_being_redefined
, loader
,
1481 name
, protection_domain
,
1482 class_data_len
, class_data
,
1488 case JVMTI_EVENT_CLASS_LOAD
:
1489 if (env
->callbacks
.ClassLoad
!= NULL
)
1491 ARG (JNIEnv
*, jni_env
);
1492 ARG (jclass
, klass
);
1493 env
->callbacks
.ClassLoad (env
, jni_env
, event_thread
, klass
);
1497 case JVMTI_EVENT_CLASS_PREPARE
:
1498 if (env
->callbacks
.ClassPrepare
!= NULL
)
1500 ARG (JNIEnv
*, jni_env
);
1501 ARG (jclass
, klass
);
1502 env
->callbacks
.ClassPrepare (env
, jni_env
, event_thread
, klass
);
1506 case JVMTI_EVENT_VM_START
:
1507 if (env
->callbacks
.VMStart
!= NULL
)
1509 ARG (JNIEnv
*, jni_env
);
1510 env
->callbacks
.VMStart (env
, jni_env
);
1514 case JVMTI_EVENT_EXCEPTION
:
1515 if (env
->callbacks
.Exception
!= NULL
)
1517 ARG (JNIEnv
*, jni_env
);
1518 ARG (jmethodID
, method
);
1519 ARG (jlocation
, location
);
1520 ARG (jobject
, exception
);
1521 ARG (jmethodID
, catch_method
);
1522 ARG (jlocation
, catch_location
);
1523 env
->callbacks
.Exception (env
, jni_env
, event_thread
, method
,
1524 location
, exception
, catch_method
,
1529 case JVMTI_EVENT_EXCEPTION_CATCH
:
1530 if (env
->callbacks
.ExceptionCatch
!= NULL
)
1532 ARG (JNIEnv
*, jni_env
);
1533 ARG (jmethodID
, method
);
1534 ARG (jlocation
, location
);
1535 ARG (jobject
, exception
);
1536 env
->callbacks
.ExceptionCatch (env
, jni_env
, event_thread
, method
,
1537 location
, exception
);
1541 case JVMTI_EVENT_SINGLE_STEP
:
1542 if (env
->callbacks
.SingleStep
!= NULL
)
1544 ARG (JNIEnv
*, jni_env
);
1545 ARG (jmethodID
, method
);
1546 ARG (jlocation
, location
);
1547 env
->callbacks
.SingleStep (env
, jni_env
, event_thread
, method
,
1552 case JVMTI_EVENT_FRAME_POP
:
1553 if (env
->callbacks
.FramePop
!= NULL
)
1555 ARG (JNIEnv
*, jni_env
);
1556 ARG (jmethodID
, method
);
1557 GET_BOOLEAN_ARG (was_popped_by_exception
);
1558 env
->callbacks
.FramePop (env
, jni_env
, event_thread
, method
,
1559 was_popped_by_exception
);
1563 case JVMTI_EVENT_BREAKPOINT
:
1564 if (env
->callbacks
.Breakpoint
!= NULL
)
1566 ARG (JNIEnv
*, jni_env
);
1567 ARG (jmethodID
, method
);
1568 ARG (jlocation
, location
);
1569 env
->callbacks
.Breakpoint (env
, jni_env
, event_thread
, method
,
1574 case JVMTI_EVENT_FIELD_ACCESS
:
1575 if (env
->callbacks
.FieldAccess
!= NULL
)
1577 ARG (JNIEnv
*, jni_env
);
1578 ARG (jmethodID
, method
);
1579 ARG (jlocation
, location
);
1580 ARG (jclass
, field_class
);
1581 ARG (jobject
, object
);
1582 ARG (jfieldID
, field
);
1583 env
->callbacks
.FieldAccess (env
, jni_env
, event_thread
, method
,
1584 location
, field_class
, object
, field
);
1588 case JVMTI_EVENT_FIELD_MODIFICATION
:
1589 if (env
->callbacks
.FieldModification
!= NULL
)
1591 ARG (JNIEnv
*, jni_env
);
1592 ARG (jmethodID
, method
);
1593 ARG (jlocation
, location
);
1594 ARG (jclass
, field_class
);
1595 ARG (jobject
, object
);
1596 ARG (jfieldID
, field
);
1597 GET_CHAR_ARG (signature_type
);
1598 ARG (jvalue
, new_value
);
1599 env
->callbacks
.FieldModification (env
, jni_env
, event_thread
, method
,
1600 location
, field_class
, object
,
1601 field
, signature_type
, new_value
);
1605 case JVMTI_EVENT_METHOD_ENTRY
:
1606 if (env
->callbacks
.MethodEntry
!= NULL
)
1608 ARG (JNIEnv
*, jni_env
);
1609 ARG (jmethodID
, method
);
1610 env
->callbacks
.MethodEntry (env
, jni_env
, event_thread
, method
);
1614 case JVMTI_EVENT_METHOD_EXIT
:
1615 if (env
->callbacks
.MethodExit
!= NULL
)
1617 ARG (JNIEnv
*, jni_env
);
1618 ARG (jmethodID
, method
);
1619 GET_BOOLEAN_ARG (was_popped_by_exception
);
1620 ARG (jvalue
, return_value
);
1621 env
->callbacks
.MethodExit (env
, jni_env
, event_thread
, method
,
1622 was_popped_by_exception
, return_value
);
1626 case JVMTI_EVENT_NATIVE_METHOD_BIND
:
1627 if (env
->callbacks
.NativeMethodBind
!= NULL
)
1629 ARG (JNIEnv
*, jni_env
);
1630 ARG (jmethodID
, method
);
1631 ARG (void *, address
);
1632 ARG (void **, new_address_ptr
);
1633 env
->callbacks
.NativeMethodBind (env
, jni_env
, event_thread
, method
,
1634 address
, new_address_ptr
);
1638 case JVMTI_EVENT_COMPILED_METHOD_LOAD
:
1639 if (env
->callbacks
.CompiledMethodLoad
!= NULL
)
1641 ARG (jmethodID
, method
);
1642 ARG (jint
, code_size
);
1643 ARG (const void *, code_addr
);
1644 ARG (jint
, map_length
);
1645 ARG (const jvmtiAddrLocationMap
*, map
);
1646 ARG (const void *, compile_info
);
1647 env
->callbacks
.CompiledMethodLoad (env
, method
, code_size
, code_addr
,
1648 map_length
, map
, compile_info
);
1652 case JVMTI_EVENT_COMPILED_METHOD_UNLOAD
:
1653 if (env
->callbacks
.CompiledMethodUnload
!= NULL
)
1655 ARG (jmethodID
, method
);
1656 ARG (const void *, code_addr
);
1657 env
->callbacks
.CompiledMethodUnload (env
, method
, code_addr
);
1661 case JVMTI_EVENT_DYNAMIC_CODE_GENERATED
:
1662 if (env
->callbacks
.DynamicCodeGenerated
!= NULL
)
1664 ARG (const char *, name
);
1665 ARG (const void *, address
);
1667 env
->callbacks
.DynamicCodeGenerated (env
, name
, address
, length
);
1671 case JVMTI_EVENT_DATA_DUMP_REQUEST
:
1672 if (env
->callbacks
.DataDumpRequest
!= NULL
)
1674 env
->callbacks
.DataDumpRequest (env
);
1678 case JVMTI_EVENT_MONITOR_WAIT
:
1679 if (env
->callbacks
.MonitorWait
!= NULL
)
1681 ARG (JNIEnv
*, jni_env
);
1682 ARG (jobject
, object
);
1683 ARG (jlong
, timeout
);
1684 env
->callbacks
.MonitorWait (env
, jni_env
, event_thread
, object
,
1689 case JVMTI_EVENT_MONITOR_WAITED
:
1690 if (env
->callbacks
.MonitorWaited
!= NULL
)
1692 ARG (JNIEnv
*, jni_env
);
1693 ARG (jobject
, object
);
1694 GET_BOOLEAN_ARG (timed_out
);
1695 env
->callbacks
.MonitorWaited (env
, jni_env
, event_thread
, object
,
1700 case JVMTI_EVENT_MONITOR_CONTENDED_ENTER
:
1701 if (env
->callbacks
.MonitorContendedEnter
!= NULL
)
1703 ARG (JNIEnv
*, jni_env
);
1704 ARG (jobject
, object
);
1705 env
->callbacks
.MonitorContendedEnter (env
, jni_env
, event_thread
,
1710 case JVMTI_EVENT_MONITOR_CONTENDED_ENTERED
:
1711 if (env
->callbacks
.MonitorContendedEntered
!= NULL
)
1713 ARG (JNIEnv
*, jni_env
);
1714 ARG (jobject
, object
);
1715 env
->callbacks
.MonitorContendedEntered (env
, jni_env
, event_thread
,
1720 case JVMTI_EVENT_GARBAGE_COLLECTION_START
:
1721 if (env
->callbacks
.GarbageCollectionStart
!= NULL
)
1723 env
->callbacks
.GarbageCollectionStart (env
);
1727 case JVMTI_EVENT_GARBAGE_COLLECTION_FINISH
:
1728 if (env
->callbacks
.GarbageCollectionFinish
!= NULL
)
1730 env
->callbacks
.GarbageCollectionFinish (env
);
1734 case JVMTI_EVENT_OBJECT_FREE
:
1735 if (env
->callbacks
.ObjectFree
!= NULL
)
1738 env
->callbacks
.ObjectFree (env
, tag
);
1742 case JVMTI_EVENT_VM_OBJECT_ALLOC
:
1743 if (env
->callbacks
.VMObjectAlloc
!= NULL
)
1745 ARG (JNIEnv
*, jni_env
);
1746 ARG (jobject
, object
);
1747 ARG (jclass
, object_class
);
1749 env
->callbacks
.VMObjectAlloc (env
, jni_env
, event_thread
,
1750 object
, object_class
, size
);
1755 fprintf (stderr
, "libgcj: post of unknown JVMTI event (%d)\n",
1761 #undef GET_BOOLEAN_ARG
1765 /* Post an event to requesting JVMTI environments
1767 * This function should not be called without consulting the
1768 * JVMTI_REQUESTED_EVENT macro first (for speed). It does no real
1769 * harm (other than kill speed), since this function will still
1770 * only send the event if it was properly requested by an environment.
1773 _Jv_JVMTI_PostEvent (jvmtiEvent type
, jthread event_thread
, ...)
1776 va_start (args
, event_thread
);
1778 JvSynchronize
dummy (_envListLock
);
1779 struct jvmti_env_list
*e
;
1780 FOREACH_ENVIRONMENT (e
)
1782 /* Events are only posted if the event was explicitly enabled,
1783 it has a registered event handler, and the event thread
1784 matches (either globally or restricted to a specific thread).
1785 Here we check all but the event handler, which will be handled
1787 if (e
->env
->enabled
[EVENT_INDEX(type
)]
1788 && (e
->env
->thread
[EVENT_INDEX(type
)] == NULL
1789 || e
->env
->thread
[EVENT_INDEX(type
)] == event_thread
))
1791 post_event (e
->env
, type
, event_thread
, args
);