1 // jvmti.cc - JVMTI implementation
3 /* Copyright (C) 2006, 2007 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>
17 #include <java-interp.h>
19 #include "jvmti-int.h"
21 #include <gcj/method.h>
23 #include <gnu/classpath/SystemProperties.h>
24 #include <gnu/gcj/runtime/BootClassLoader.h>
25 #include <gnu/gcj/jvmti/Breakpoint.h>
26 #include <gnu/gcj/jvmti/BreakpointManager.h>
28 #include <java/lang/Class.h>
29 #include <java/lang/ClassLoader.h>
30 #include <java/lang/OutOfMemoryError.h>
31 #include <java/lang/Thread.h>
32 #include <java/lang/ThreadGroup.h>
33 #include <java/lang/Throwable.h>
34 #include <java/lang/VMClassLoader.h>
35 #include <java/lang/reflect/Field.h>
36 #include <java/lang/reflect/Modifier.h>
37 #include <java/util/Collection.h>
38 #include <java/util/HashMap.h>
39 #include <java/util/concurrent/locks/Lock.h>
40 #include <java/util/concurrent/locks/ReentrantReadWriteLock.h>
41 #include <java/net/URL.h>
43 static void check_enabled_events (void);
44 static void check_enabled_event (jvmtiEvent);
48 // Is JVMTI enabled? (i.e., any jvmtiEnv created?)
51 // Event notifications
54 bool ThreadStart = false;
55 bool ThreadEnd = false;
56 bool ClassFileLoadHook = false;
57 bool ClassLoad = false;
58 bool ClassPrepare = false;
60 bool Exception = false;
61 bool ExceptionCatch = false;
62 bool SingleStep = false;
63 bool FramePop = false;
64 bool Breakpoint = false;
65 bool FieldAccess = false;
66 bool FieldModification = false;
67 bool MethodEntry = false;
68 bool MethodExit = false;
69 bool NativeMethodBind = false;
70 bool CompiledMethodLoad = false;
71 bool CompiledMethodUnload = false;
72 bool DynamicCodeGenerated = false;
73 bool DataDumpRequest = false;
74 bool reserved72 = false;
75 bool MonitorWait = false;
76 bool MonitorWaited = false;
77 bool MonitorContendedEnter = false;
78 bool MonitorContendedEntered = false;
79 bool reserved77 = false;
80 bool reserved78 = false;
81 bool reserved79 = false;
82 bool reserved80 = false;
83 bool GarbageCollectionStart = false;
84 bool GarbageCollectionFinish = false;
85 bool ObjectFree = false;
86 bool VMObjectAlloc = false;
89 extern struct JNINativeInterface _Jv_JNIFunctions;
91 struct _Jv_rawMonitorID
94 _Jv_ConditionVariable_t condition;
97 /* A simple linked list of all JVMTI environments. Since
98 events must be delivered to environments in the order
99 in which the environments were created, new environments
100 are added to the end of the list. */
101 struct jvmti_env_list
104 struct jvmti_env_list *next;
106 static struct jvmti_env_list *_jvmtiEnvironments = NULL;
107 static java::util::concurrent::locks::
108 ReentrantReadWriteLock *_envListLock = NULL;
109 #define FOREACH_ENVIRONMENT(Ele) \
110 for (Ele = _jvmtiEnvironments; Ele != NULL; Ele = Ele->next)
112 // Some commonly-used checks
114 #define THREAD_DEFAULT_TO_CURRENT(Ajthread) \
117 if (Ajthread == NULL) \
118 Ajthread = java::lang::Thread::currentThread (); \
122 #define THREAD_CHECK_VALID(Athread) \
125 if (!java::lang::Thread::class$.isAssignableFrom (&(Athread->class$))) \
126 return JVMTI_ERROR_INVALID_THREAD; \
130 #define THREAD_CHECK_IS_ALIVE(Athread) \
133 if (!Athread->isAlive ()) \
134 return JVMTI_ERROR_THREAD_NOT_ALIVE; \
138 // FIXME: if current phase is not set in Phases,
139 // return JVMTI_ERROR_WRONG_PHASE
140 #define REQUIRE_PHASE(Env, Phases)
142 #define NULL_CHECK(Ptr) \
146 return JVMTI_ERROR_NULL_POINTER; \
150 #define ILLEGAL_ARGUMENT(Cond) \
154 return JVMTI_ERROR_ILLEGAL_ARGUMENT; \
158 #define CHECK_FOR_NATIVE_METHOD(AjmethodID) \
161 jboolean is_native; \
162 jvmtiError jerr = env->IsMethodNative (AjmethodID, &is_native); \
163 if (jerr != JVMTI_ERROR_NONE) \
166 return JVMTI_ERROR_NATIVE_METHOD; \
170 static jvmtiError JNICALL
171 _Jv_JVMTI_SuspendThread (MAYBE_UNUSED jvmtiEnv *env, jthread thread)
173 using namespace java::lang;
175 THREAD_DEFAULT_TO_CURRENT (thread);
176 THREAD_CHECK_VALID (thread);
177 THREAD_CHECK_IS_ALIVE (thread);
179 _Jv_Thread_t *data = _Jv_ThreadGetData (thread);
180 _Jv_SuspendThread (data);
181 return JVMTI_ERROR_NONE;
184 static jvmtiError JNICALL
185 _Jv_JVMTI_ResumeThread (MAYBE_UNUSED jvmtiEnv *env, jthread thread)
187 using namespace java::lang;
189 THREAD_DEFAULT_TO_CURRENT (thread);
190 THREAD_CHECK_VALID (thread);
191 THREAD_CHECK_IS_ALIVE (thread);
193 _Jv_Thread_t *data = _Jv_ThreadGetData (thread);
194 _Jv_ResumeThread (data);
195 return JVMTI_ERROR_NONE;
198 static jvmtiError JNICALL
199 _Jv_JVMTI_InterruptThread (MAYBE_UNUSED jvmtiEnv *env, jthread thread)
201 using namespace java::lang;
203 REQUIRE_PHASE (env, JVMTI_PHASE_LIVE);
204 // FIXME: capability handling? 'can_signal_thread'
206 return JVMTI_ERROR_INVALID_THREAD;
208 THREAD_CHECK_VALID (thread);
209 THREAD_CHECK_IS_ALIVE (thread);
211 return JVMTI_ERROR_NONE;
214 static jvmtiError JNICALL
215 _Jv_JVMTI_GetAllThreads(MAYBE_UNUSED jvmtiEnv *env, jint *thread_cnt,
218 REQUIRE_PHASE (env, JVMTI_PHASE_LIVE);
219 NULL_CHECK (thread_cnt);
220 NULL_CHECK (threads);
222 using namespace java::lang;
224 ThreadGroup *root_grp = ThreadGroup::root;
225 jint estimate = root_grp->activeCount ();
227 JArray<Thread *> *thr_arr;
229 // Allocate some extra space since threads can be created between calls
232 thr_arr = reinterpret_cast<JArray<Thread *> *> (JvNewObjectArray
234 &Thread::class$, NULL));
236 catch (java::lang::OutOfMemoryError *err)
238 return JVMTI_ERROR_OUT_OF_MEMORY;
241 *thread_cnt = root_grp->enumerate (thr_arr);
243 jvmtiError jerr = env->Allocate ((jlong) ((*thread_cnt) * sizeof (jthread)),
244 (unsigned char **) threads);
246 if (jerr != JVMTI_ERROR_NONE)
249 // Transfer the threads to the result array
250 jthread *tmp_arr = reinterpret_cast<jthread *> (elements (thr_arr));
252 memcpy ((*threads), tmp_arr, (*thread_cnt));
254 return JVMTI_ERROR_NONE;
257 static jvmtiError JNICALL
258 _Jv_JVMTI_GetFrameCount (MAYBE_UNUSED jvmtiEnv *env, jthread thread,
261 REQUIRE_PHASE (env, JVMTI_PHASE_LIVE);
263 NULL_CHECK (frame_count);
265 using namespace java::lang;
267 THREAD_DEFAULT_TO_CURRENT (thread);
269 Thread *thr = reinterpret_cast<Thread *> (thread);
270 THREAD_CHECK_VALID (thr);
271 THREAD_CHECK_IS_ALIVE (thr);
273 _Jv_Frame *frame = reinterpret_cast<_Jv_Frame *> (thr->frame);
274 (*frame_count) = frame->depth ();
275 return JVMTI_ERROR_NONE;
278 static jvmtiError JNICALL
279 _Jv_JVMTI_CreateRawMonitor (MAYBE_UNUSED jvmtiEnv *env, const char *name,
280 jrawMonitorID *result)
282 REQUIRE_PHASE (env, JVMTI_PHASE_ONLOAD | JVMTI_PHASE_LIVE);
285 *result = (jrawMonitorID) _Jv_MallocUnchecked (sizeof (_Jv_rawMonitorID));
287 return JVMTI_ERROR_OUT_OF_MEMORY;
288 _Jv_MutexInit (&(*result)->mutex);
289 _Jv_CondInit (&(*result)->condition);
290 return JVMTI_ERROR_NONE;
293 static jvmtiError JNICALL
294 _Jv_JVMTI_DestroyRawMonitor (MAYBE_UNUSED jvmtiEnv *env, jrawMonitorID monitor)
296 REQUIRE_PHASE (env, JVMTI_PHASE_ONLOAD | JVMTI_PHASE_LIVE);
297 // Note we have no better way of knowing whether this object is
298 // really a raw monitor.
300 return JVMTI_ERROR_INVALID_MONITOR;
301 // FIXME: perform checks on monitor, release it if this thread owns
303 #ifdef _Jv_HaveMutexDestroy
304 _Jv_MutexDestroy (&monitor->mutex);
307 return JVMTI_ERROR_NONE;
310 static jvmtiError JNICALL
311 _Jv_JVMTI_RawMonitorEnter (MAYBE_UNUSED jvmtiEnv *env, jrawMonitorID monitor)
314 return JVMTI_ERROR_INVALID_MONITOR;
315 _Jv_MutexLock (&monitor->mutex);
316 return JVMTI_ERROR_NONE;
319 static jvmtiError JNICALL
320 _Jv_JVMTI_RawMonitorExit (MAYBE_UNUSED jvmtiEnv *env, jrawMonitorID monitor)
323 return JVMTI_ERROR_INVALID_MONITOR;
324 if (_Jv_MutexUnlock (&monitor->mutex))
325 return JVMTI_ERROR_NOT_MONITOR_OWNER;
326 return JVMTI_ERROR_NONE;
329 static jvmtiError JNICALL
330 _Jv_JVMTI_RawMonitorWait (MAYBE_UNUSED jvmtiEnv *env, jrawMonitorID monitor,
334 return JVMTI_ERROR_INVALID_MONITOR;
335 int r = _Jv_CondWait (&monitor->condition, &monitor->mutex, millis, 0);
336 if (r == _JV_NOT_OWNER)
337 return JVMTI_ERROR_NOT_MONITOR_OWNER;
338 if (r == _JV_INTERRUPTED)
339 return JVMTI_ERROR_INTERRUPT;
340 return JVMTI_ERROR_NONE;
343 static jvmtiError JNICALL
344 _Jv_JVMTI_RawMonitorNotify (MAYBE_UNUSED jvmtiEnv *env, jrawMonitorID monitor)
347 return JVMTI_ERROR_INVALID_MONITOR;
348 if (_Jv_CondNotify (&monitor->condition, &monitor->mutex) == _JV_NOT_OWNER)
349 return JVMTI_ERROR_NOT_MONITOR_OWNER;
350 return JVMTI_ERROR_NONE;
353 static jvmtiError JNICALL
354 _Jv_JVMTI_RawMonitorNotifyAll (MAYBE_UNUSED jvmtiEnv *env,
355 jrawMonitorID monitor)
358 return JVMTI_ERROR_INVALID_MONITOR;
359 if (_Jv_CondNotifyAll (&monitor->condition, &monitor->mutex)
361 return JVMTI_ERROR_NOT_MONITOR_OWNER;
362 return JVMTI_ERROR_NONE;
365 static jvmtiError JNICALL
366 _Jv_JVMTI_SetBreakpoint (jvmtiEnv *env, jmethodID method, jlocation location)
368 REQUIRE_PHASE (env, JVMTI_PHASE_LIVE);
370 using namespace gnu::gcj::jvmti;
372 = BreakpointManager::getBreakpoint (reinterpret_cast<jlong> (method),
377 jvmtiError err = env->GetMethodDeclaringClass (method, &klass);
378 if (err != JVMTI_ERROR_NONE)
381 if (!_Jv_IsInterpretedClass (klass))
382 return JVMTI_ERROR_INVALID_CLASS;
384 _Jv_MethodBase *base = _Jv_FindInterpreterMethod (klass, method);
386 return JVMTI_ERROR_INVALID_METHODID;
389 err = env->GetMethodModifiers (method, &flags);
390 if (err != JVMTI_ERROR_NONE)
393 if (flags & java::lang::reflect::Modifier::NATIVE)
394 return JVMTI_ERROR_NATIVE_METHOD;
396 _Jv_InterpMethod *imeth = reinterpret_cast<_Jv_InterpMethod *> (base);
397 if (imeth->get_insn (location) == NULL)
398 return JVMTI_ERROR_INVALID_LOCATION;
400 // Now the breakpoint can be safely installed
401 bp = BreakpointManager::newBreakpoint (reinterpret_cast<jlong> (method),
406 // Duplicate breakpoints are not permitted by JVMTI
407 return JVMTI_ERROR_DUPLICATE;
410 return JVMTI_ERROR_NONE;
413 static jvmtiError JNICALL
414 _Jv_JVMTI_ClearBreakpoint (MAYBE_UNUSED jvmtiEnv *env, jmethodID method,
417 REQUIRE_PHASE (env, JVMTI_PHASE_LIVE);
419 using namespace gnu::gcj::jvmti;
422 = BreakpointManager::getBreakpoint (reinterpret_cast<jlong> (method),
425 return JVMTI_ERROR_NOT_FOUND;
427 BreakpointManager::deleteBreakpoint (reinterpret_cast<jlong> (method), location);
428 return JVMTI_ERROR_NONE;
431 static jvmtiError JNICALL
432 _Jv_JVMTI_Allocate (MAYBE_UNUSED jvmtiEnv *env, jlong size,
433 unsigned char **result)
435 ILLEGAL_ARGUMENT (size < 0);
441 *result = (unsigned char *) _Jv_MallocUnchecked (size);
443 return JVMTI_ERROR_OUT_OF_MEMORY;
445 return JVMTI_ERROR_NONE;
448 static jvmtiError JNICALL
449 _Jv_JVMTI_Deallocate (MAYBE_UNUSED jvmtiEnv *env, unsigned char *mem)
453 return JVMTI_ERROR_NONE;
456 static jvmtiError JNICALL
457 _Jv_JVMTI_GetClassStatus (MAYBE_UNUSED jvmtiEnv *env, jclass klass,
460 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
461 NULL_CHECK (status_ptr);
463 return JVMTI_ERROR_INVALID_CLASS;
465 if (klass->isArray ())
466 *status_ptr = JVMTI_CLASS_STATUS_ARRAY;
467 else if (klass->isPrimitive ())
468 *status_ptr = JVMTI_CLASS_STATUS_PRIMITIVE;
471 jbyte state = _Jv_GetClassState (klass);
473 if (state >= JV_STATE_LINKED)
474 (*status_ptr) |= JVMTI_CLASS_STATUS_VERIFIED;
475 if (state >= JV_STATE_PREPARED)
476 (*status_ptr) |= JVMTI_CLASS_STATUS_PREPARED;
477 if (state == JV_STATE_ERROR || state == JV_STATE_PHANTOM)
478 (*status_ptr) |= JVMTI_CLASS_STATUS_ERROR;
479 else if (state == JV_STATE_DONE)
480 (*status_ptr) |= JVMTI_CLASS_STATUS_INITIALIZED;
483 return JVMTI_ERROR_NONE;
486 static jvmtiError JNICALL
487 _Jv_JVMTI_GetClassModifiers (MAYBE_UNUSED jvmtiEnv *env, jclass klass,
490 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
491 // Don't bother checking KLASS' type.
493 return JVMTI_ERROR_INVALID_CLASS;
495 *mods = klass->getModifiers();
496 return JVMTI_ERROR_NONE;
499 static jvmtiError JNICALL
500 _Jv_JVMTI_GetClassMethods (MAYBE_UNUSED jvmtiEnv *env, jclass klass,
501 jint *count_ptr, jmethodID **methods_ptr)
503 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
504 // FIXME: capability can_maintain_original_method_order
505 // Don't bother checking KLASS' type.
507 return JVMTI_ERROR_INVALID_CLASS;
508 NULL_CHECK (count_ptr);
509 NULL_CHECK (methods_ptr);
510 *count_ptr = JvNumMethods(klass);
513 = (jmethodID *) _Jv_MallocUnchecked (*count_ptr * sizeof (jmethodID));
514 if (*methods_ptr == NULL)
515 return JVMTI_ERROR_OUT_OF_MEMORY;
517 jmethodID start = JvGetFirstMethod (klass);
518 for (jint i = 0; i < *count_ptr; ++i)
520 (*methods_ptr)[i] = start + i;
522 return JVMTI_ERROR_NONE;
525 static jvmtiError JNICALL
526 _Jv_JVMTI_IsInterface (MAYBE_UNUSED jvmtiEnv *env, jclass klass,
529 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
531 return JVMTI_ERROR_INVALID_CLASS;
533 *result = klass->isInterface();
534 return JVMTI_ERROR_NONE;
537 static jvmtiError JNICALL
538 _Jv_JVMTI_IsArrayClass (MAYBE_UNUSED jvmtiEnv *env, jclass klass,
541 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
543 return JVMTI_ERROR_INVALID_CLASS;
545 *result = klass->isArray();
546 return JVMTI_ERROR_NONE;
549 static jvmtiError JNICALL
550 _Jv_JVMTI_GetClassLoader (MAYBE_UNUSED jvmtiEnv *env, jclass klass,
553 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
555 return JVMTI_ERROR_INVALID_CLASS;
557 *result = klass->getClassLoaderInternal();
558 return JVMTI_ERROR_NONE;
561 static jvmtiError JNICALL
562 _Jv_JVMTI_GetObjectHashCode (MAYBE_UNUSED jvmtiEnv *env, jobject obj,
565 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
567 return JVMTI_ERROR_INVALID_OBJECT;
569 *result = _Jv_HashCode (obj);
570 return JVMTI_ERROR_NONE;
573 static jvmtiError JNICALL
574 _Jv_JVMTI_GetFieldModifiers (MAYBE_UNUSED jvmtiEnv *env, jclass klass,
575 jfieldID field, jint *result)
577 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
579 return JVMTI_ERROR_INVALID_CLASS;
581 return JVMTI_ERROR_INVALID_FIELDID;
583 *result = field->getModifiers();
584 return JVMTI_ERROR_NONE;
587 static jvmtiError JNICALL
588 _Jv_JVMTI_IsFieldSynthetic (MAYBE_UNUSED jvmtiEnv *env, jclass klass,
589 jfieldID field, jboolean *result)
591 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
593 return JVMTI_ERROR_INVALID_CLASS;
595 return JVMTI_ERROR_INVALID_FIELDID;
598 // FIXME: capability can_get_synthetic_attribute
599 *result = ((field->getModifiers() & java::lang::reflect::Modifier::SYNTHETIC)
601 return JVMTI_ERROR_NONE;
604 static jvmtiError JNICALL
605 _Jv_JVMTI_GetMethodName (MAYBE_UNUSED jvmtiEnv *env, jmethodID method,
606 char **name_ptr, char **signature_ptr,
609 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
612 return JVMTI_ERROR_INVALID_METHODID;
614 if (name_ptr != NULL)
616 int len = static_cast<int> (method->name->len ());
617 *name_ptr = (char *) _Jv_MallocUnchecked (len + 1);
618 if (*name_ptr == NULL)
619 return JVMTI_ERROR_OUT_OF_MEMORY;
620 strncpy (*name_ptr, method->name->chars (), len);
621 (*name_ptr)[len] = '\0';
624 if (signature_ptr != NULL)
626 int len = static_cast<int> (method->signature->len ());
627 *signature_ptr = (char *) _Jv_MallocUnchecked (len + 1);
628 if (*signature_ptr == NULL)
630 if (name_ptr != NULL)
631 _Jv_Free (*name_ptr);
632 return JVMTI_ERROR_OUT_OF_MEMORY;
634 strncpy (*signature_ptr, method->signature->chars (), len);
635 (*signature_ptr)[len] = '\0';
638 if (generic_ptr != NULL)
643 return JVMTI_ERROR_NONE;
646 static jvmtiError JNICALL
647 _Jv_JVMTI_GetMethodModifiers (MAYBE_UNUSED jvmtiEnv *env, jmethodID method,
650 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
652 return JVMTI_ERROR_INVALID_METHODID;
655 // FIXME: mask off some internal bits...
656 *result = method->accflags;
657 return JVMTI_ERROR_NONE;
660 static jvmtiError JNICALL
661 _Jv_JVMTI_GetLineNumberTable (jvmtiEnv *env, jmethodID method,
662 jint *entry_count_ptr,
663 jvmtiLineNumberEntry **table_ptr)
665 NULL_CHECK (entry_count_ptr);
666 NULL_CHECK (table_ptr);
669 jvmtiError jerr = env->GetMethodDeclaringClass (method, &klass);
670 if (jerr != JVMTI_ERROR_NONE)
673 _Jv_MethodBase *base = _Jv_FindInterpreterMethod (klass, method);
675 return JVMTI_ERROR_INVALID_METHODID;
677 if (java::lang::reflect::Modifier::isNative (method->accflags)
678 || !_Jv_IsInterpretedClass (klass))
679 return JVMTI_ERROR_NATIVE_METHOD;
681 _Jv_InterpMethod *imeth = reinterpret_cast<_Jv_InterpMethod *> (base);
683 jintArray lines = NULL;
684 jlongArray indices = NULL;
685 imeth->get_line_table (start, end, lines, indices);
687 return JVMTI_ERROR_ABSENT_INFORMATION;
689 jvmtiLineNumberEntry *table;
690 jsize len = lines->length * sizeof (jvmtiLineNumberEntry);
691 table = (jvmtiLineNumberEntry *) _Jv_MallocUnchecked (len);
693 return JVMTI_ERROR_OUT_OF_MEMORY;
695 jint *line = elements (lines);
696 jlong *index = elements (indices);
697 for (int i = 0; i < lines->length; ++i)
699 table[i].start_location = index[i];
700 table[i].line_number = line[i];
704 *entry_count_ptr = lines->length;
705 return JVMTI_ERROR_NONE;
708 static jvmtiError JNICALL
709 _Jv_JVMTI_IsMethodNative (MAYBE_UNUSED jvmtiEnv *env, jmethodID method,
712 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
714 return JVMTI_ERROR_INVALID_METHODID;
717 *result = ((method->accflags & java::lang::reflect::Modifier::NATIVE) != 0);
718 return JVMTI_ERROR_NONE;
721 static jvmtiError JNICALL
722 _Jv_JVMTI_IsMethodSynthetic (MAYBE_UNUSED jvmtiEnv *env, jmethodID method,
725 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
727 return JVMTI_ERROR_INVALID_METHODID;
730 // FIXME capability can_get_synthetic_attribute
732 *result = ((method->accflags & java::lang::reflect::Modifier::SYNTHETIC)
734 return JVMTI_ERROR_NONE;
737 static jvmtiError JNICALL
738 _Jv_JVMTI_GetMaxLocals (MAYBE_UNUSED jvmtiEnv *env, jmethodID method,
741 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
742 NULL_CHECK (max_locals);
744 CHECK_FOR_NATIVE_METHOD (method);
747 jvmtiError jerr = env->GetMethodDeclaringClass (method, &klass);
748 if (jerr != JVMTI_ERROR_NONE)
751 _Jv_InterpMethod *imeth = reinterpret_cast<_Jv_InterpMethod *>
752 (_Jv_FindInterpreterMethod (klass, method));
755 return JVMTI_ERROR_INVALID_METHODID;
757 *max_locals = imeth->get_max_locals ();
759 return JVMTI_ERROR_NONE;
762 static jvmtiError JNICALL
763 _Jv_JVMTI_GetMethodDeclaringClass (MAYBE_UNUSED jvmtiEnv *env,
765 jclass *declaring_class_ptr)
767 REQUIRE_PHASE (env, JVMTI_PHASE_LIVE);
768 NULL_CHECK (declaring_class_ptr);
770 jclass klass = _Jv_GetMethodDeclaringClass (method);
773 *declaring_class_ptr = klass;
774 return JVMTI_ERROR_NONE;
777 return JVMTI_ERROR_INVALID_METHODID;
780 static jvmtiError JNICALL
781 _Jv_JVMTI_GetClassLoaderClasses (MAYBE_UNUSED jvmtiEnv *env,
786 using namespace java::lang;
787 using namespace java::util;
789 REQUIRE_PHASE (env, JVMTI_PHASE_LIVE);
790 NULL_CHECK (count_ptr);
791 NULL_CHECK (result_ptr);
793 ClassLoader *loader = (ClassLoader *) init_loader;
795 loader = VMClassLoader::bootLoader;
797 Collection *values = loader->loadedClasses->values();
798 jobjectArray array = values->toArray();
799 *count_ptr = array->length;
800 jobject *elts = elements (array);
802 = (jclass *) _Jv_MallocUnchecked (*count_ptr * sizeof (jclass));
804 return JVMTI_ERROR_OUT_OF_MEMORY;
806 // FIXME: JNI references...
807 memcpy (result, elts, *count_ptr * sizeof (jclass));
809 *result_ptr = result;
811 return JVMTI_ERROR_NONE;
814 static jvmtiError JNICALL
815 _Jv_JVMTI_GetStackTrace (MAYBE_UNUSED jvmtiEnv *env, jthread thread,
816 jint start_depth, jint max_frames,
817 jvmtiFrameInfo *frames, jint *frame_count)
819 REQUIRE_PHASE (env, JVMTI_PHASE_LIVE);
821 ILLEGAL_ARGUMENT (max_frames < 0);
824 NULL_CHECK (frame_count);
826 using namespace java::lang;
828 THREAD_DEFAULT_TO_CURRENT (thread);
830 Thread *thr = reinterpret_cast<Thread *> (thread);
831 THREAD_CHECK_VALID (thr);
832 THREAD_CHECK_IS_ALIVE (thr);
834 jvmtiError jerr = env->GetFrameCount (thread, frame_count);
835 if (jerr != JVMTI_ERROR_NONE)
838 // start_depth can be either a positive number, indicating the depth of the
839 // stack at which to begin the trace, or a negative number indicating the
840 // number of frames at the bottom of the stack to exclude. These checks
841 // ensure that it is a valid value in either case
843 ILLEGAL_ARGUMENT (start_depth >= (*frame_count));
844 ILLEGAL_ARGUMENT (start_depth < (-(*frame_count)));
846 _Jv_Frame *frame = reinterpret_cast<_Jv_Frame *> (thr->frame);
848 // If start_depth is negative use this to determine at what depth to start
849 // the trace by adding it to the length of the call stack. This allows the
850 // use of the same frame "discarding" mechanism as for a positive start_depth
852 start_depth = *frame_count + start_depth;
854 // If start_depth > 0 "remove" start_depth frames from the beginning
855 // of the stack before beginning the trace by moving along the frame list.
856 while (start_depth > 0)
863 // Now check to see if the array supplied by the agent is large enough to
864 // hold frame_count frames, after adjustment for start_depth.
865 if ((*frame_count) > max_frames)
866 (*frame_count) = max_frames;
868 for (int i = 0; i < (*frame_count); i++)
870 frames[i].method = frame->self->get_method ();
872 // Set the location in the frame, native frames have location = -1
873 if (frame->frame_type == frame_interpreter)
875 _Jv_InterpMethod *imeth
876 = static_cast<_Jv_InterpMethod *> (frame->self);
877 _Jv_InterpFrame *interp_frame
878 = static_cast<_Jv_InterpFrame *> (frame);
879 frames[i].location = imeth->insn_index (interp_frame->pc);
882 frames[i].location = -1;
887 return JVMTI_ERROR_NONE;
890 static jvmtiError JNICALL
891 _Jv_JVMTI_ForceGarbageCollection (MAYBE_UNUSED jvmtiEnv *env)
893 REQUIRE_PHASE (env, JVMTI_PHASE_LIVE);
895 return JVMTI_ERROR_NONE;
898 static jvmtiError JNICALL
899 _Jv_JVMTI_SetJNIFunctionTable (MAYBE_UNUSED jvmtiEnv *env,
900 const jniNativeInterface *function_table)
902 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
903 NULL_CHECK (function_table);
904 memcpy (&_Jv_JNIFunctions, function_table, sizeof (jniNativeInterface));
905 return JVMTI_ERROR_NONE;
908 static jvmtiError JNICALL
909 _Jv_JVMTI_GetJNIFunctionTable (MAYBE_UNUSED jvmtiEnv *env,
910 jniNativeInterface **function_table)
912 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
913 NULL_CHECK (function_table);
915 = (jniNativeInterface *) _Jv_MallocUnchecked (sizeof (jniNativeInterface));
916 if (*function_table == NULL)
917 return JVMTI_ERROR_OUT_OF_MEMORY;
918 memcpy (*function_table, &_Jv_JNIFunctions, sizeof (jniNativeInterface));
919 return JVMTI_ERROR_NONE;
922 static jvmtiError JNICALL
923 _Jv_JVMTI_DisposeEnvironment (jvmtiEnv *env)
927 if (_jvmtiEnvironments == NULL)
928 return JVMTI_ERROR_INVALID_ENVIRONMENT;
931 _envListLock->writeLock ()->lock ();
932 if (_jvmtiEnvironments->env == env)
934 struct jvmti_env_list *next = _jvmtiEnvironments->next;
935 _Jv_Free (_jvmtiEnvironments);
936 _jvmtiEnvironments = next;
940 struct jvmti_env_list *e = _jvmtiEnvironments;
941 while (e->next != NULL && e->next->env != env)
945 _envListLock->writeLock ()->unlock ();
946 return JVMTI_ERROR_INVALID_ENVIRONMENT;
949 struct jvmti_env_list *next = e->next->next;
953 _envListLock->writeLock ()->unlock ();
958 check_enabled_events ();
960 return JVMTI_ERROR_NONE;
963 static jvmtiError JNICALL
964 _Jv_JVMTI_GetSystemProperty (MAYBE_UNUSED jvmtiEnv *env, const char *property,
967 REQUIRE_PHASE (env, JVMTI_PHASE_ONLOAD | JVMTI_PHASE_LIVE);
968 NULL_CHECK (property);
971 jstring name = JvNewStringUTF(property);
972 jstring result_str = gnu::classpath::SystemProperties::getProperty(name);
974 if (result_str == NULL)
975 return JVMTI_ERROR_NOT_AVAILABLE;
977 int len = JvGetStringUTFLength (result_str);
978 *result = (char *) _Jv_MallocUnchecked (len + 1);
980 return JVMTI_ERROR_OUT_OF_MEMORY;
981 JvGetStringUTFRegion (result_str, 0, result_str->length(), *result);
982 (*result)[len] = '\0';
984 return JVMTI_ERROR_NONE;
987 static jvmtiError JNICALL
988 _Jv_JVMTI_SetSystemProperty (MAYBE_UNUSED jvmtiEnv *env, const char *property,
991 REQUIRE_PHASE (env, JVMTI_PHASE_ONLOAD);
993 NULL_CHECK (property);
996 // FIXME: When would a property not be writeable?
997 return JVMTI_ERROR_NONE;
1000 jstring prop_str = JvNewStringUTF(property);
1001 jstring value_str = JvNewStringUTF(value);
1002 gnu::classpath::SystemProperties::setProperty(prop_str, value_str);
1003 return JVMTI_ERROR_NONE;
1006 static jvmtiError JNICALL
1007 _Jv_JVMTI_GetTime (MAYBE_UNUSED jvmtiEnv *env, jlong *nanos_ptr)
1009 NULL_CHECK (nanos_ptr);
1010 *nanos_ptr = _Jv_platform_nanotime();
1011 return JVMTI_ERROR_NONE;
1014 static jvmtiError JNICALL
1015 _Jv_JVMTI_GetAvailableProcessors (MAYBE_UNUSED jvmtiEnv *env,
1016 jint *nprocessors_ptr)
1018 NULL_CHECK (nprocessors_ptr);
1019 #ifdef _SC_NPROCESSORS_ONLN
1020 *nprocessors_ptr = sysconf(_SC_NPROCESSORS_ONLN);
1022 *nprocessors_ptr = 1;
1024 return JVMTI_ERROR_NONE;
1027 static jvmtiError JNICALL
1028 _Jv_JVMTI_AddToBootstrapClassLoaderSearch (MAYBE_UNUSED jvmtiEnv *env,
1029 const char *segment)
1031 using namespace java::lang;
1032 using namespace java::net;
1033 using namespace gnu::gcj::runtime;
1035 REQUIRE_PHASE (env, JVMTI_PHASE_ONLOAD);
1036 NULL_CHECK (segment);
1038 jstring str_segment = JvNewStringUTF(segment);
1042 url = new URL(JvNewStringUTF("file"), NULL, str_segment);
1044 catch (jthrowable ignore)
1046 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
1049 BootClassLoader *loader = VMClassLoader::bootLoader;
1050 // Don't call this too early.
1051 // assert (loader != NULL);
1052 loader->addURL(url);
1053 return JVMTI_ERROR_NONE;
1056 static jvmtiError JNICALL
1057 _Jv_JVMTI_SetVerboseFlag (MAYBE_UNUSED jvmtiEnv *env, jvmtiVerboseFlag flag,
1062 case JVMTI_VERBOSE_OTHER:
1063 case JVMTI_VERBOSE_GC:
1064 case JVMTI_VERBOSE_JNI:
1067 case JVMTI_VERBOSE_CLASS:
1068 gcj::verbose_class_flag = value;
1071 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
1073 return JVMTI_ERROR_NONE;
1076 static jvmtiError JNICALL
1077 _Jv_JVMTI_GetObjectSize (MAYBE_UNUSED jvmtiEnv *env, jobject object,
1080 REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
1082 return JVMTI_ERROR_INVALID_OBJECT;
1083 NULL_CHECK (result);
1085 jclass klass = object->getClass();
1086 if (klass->isArray())
1088 jclass comp = klass->getComponentType();
1090 = (jint) (_Jv_uintptr_t) _Jv_GetArrayElementFromElementType(NULL,
1091 klass->getComponentType());
1092 // FIXME: correct for primitive types?
1093 jint compSize = comp->size();
1094 __JArray *array = (__JArray *) object;
1095 *result = base + array->length * compSize;
1099 // Note that if OBJECT is a String then it may (if
1100 // str->data==str) take more space. Do we care?
1101 *result = klass->size();
1103 return JVMTI_ERROR_NONE;
1106 /* An event is enabled only if it has both an event handler
1107 and it is enabled in the environment. */
1109 check_enabled_event (jvmtiEvent type)
1114 #define GET_OFFSET(Event) \
1117 enabled = &JVMTI::Event; \
1118 offset = offsetof (jvmtiEventCallbacks, Event); \
1124 case JVMTI_EVENT_VM_INIT:
1125 GET_OFFSET (VMInit);
1128 case JVMTI_EVENT_VM_DEATH:
1129 GET_OFFSET (VMDeath);
1132 case JVMTI_EVENT_THREAD_START:
1133 GET_OFFSET (ThreadStart);
1136 case JVMTI_EVENT_THREAD_END:
1137 GET_OFFSET (ThreadEnd);
1140 case JVMTI_EVENT_CLASS_FILE_LOAD_HOOK:
1141 GET_OFFSET (ClassFileLoadHook);
1144 case JVMTI_EVENT_CLASS_LOAD:
1145 GET_OFFSET (ClassLoad);
1148 case JVMTI_EVENT_CLASS_PREPARE:
1149 GET_OFFSET (ClassPrepare);
1152 case JVMTI_EVENT_VM_START:
1153 GET_OFFSET (VMStart);
1156 case JVMTI_EVENT_EXCEPTION:
1157 GET_OFFSET (Exception);
1160 case JVMTI_EVENT_EXCEPTION_CATCH:
1161 GET_OFFSET (ExceptionCatch);
1164 case JVMTI_EVENT_SINGLE_STEP:
1165 GET_OFFSET (SingleStep);
1168 case JVMTI_EVENT_FRAME_POP:
1169 GET_OFFSET (FramePop);
1172 case JVMTI_EVENT_BREAKPOINT:
1173 GET_OFFSET (Breakpoint);
1176 case JVMTI_EVENT_FIELD_ACCESS:
1177 GET_OFFSET (FieldAccess);
1180 case JVMTI_EVENT_FIELD_MODIFICATION:
1181 GET_OFFSET (FieldModification);
1184 case JVMTI_EVENT_METHOD_ENTRY:
1185 GET_OFFSET (MethodEntry);
1188 case JVMTI_EVENT_METHOD_EXIT:
1189 GET_OFFSET (MethodExit);
1192 case JVMTI_EVENT_NATIVE_METHOD_BIND:
1193 GET_OFFSET (NativeMethodBind);
1196 case JVMTI_EVENT_COMPILED_METHOD_LOAD:
1197 GET_OFFSET (CompiledMethodLoad);
1200 case JVMTI_EVENT_COMPILED_METHOD_UNLOAD:
1201 GET_OFFSET (CompiledMethodUnload);
1204 case JVMTI_EVENT_DYNAMIC_CODE_GENERATED:
1205 GET_OFFSET (DynamicCodeGenerated);
1208 case JVMTI_EVENT_DATA_DUMP_REQUEST:
1209 GET_OFFSET (DataDumpRequest);
1212 case JVMTI_EVENT_MONITOR_WAIT:
1213 GET_OFFSET (MonitorWait);
1216 case JVMTI_EVENT_MONITOR_WAITED:
1217 GET_OFFSET (MonitorWaited);
1220 case JVMTI_EVENT_MONITOR_CONTENDED_ENTER:
1221 GET_OFFSET (MonitorContendedEnter);
1224 case JVMTI_EVENT_MONITOR_CONTENDED_ENTERED:
1225 GET_OFFSET (MonitorContendedEntered);
1228 case JVMTI_EVENT_GARBAGE_COLLECTION_START:
1229 GET_OFFSET (GarbageCollectionStart);
1232 case JVMTI_EVENT_GARBAGE_COLLECTION_FINISH:
1233 GET_OFFSET (GarbageCollectionFinish);
1236 case JVMTI_EVENT_OBJECT_FREE:
1237 GET_OFFSET (ObjectFree);
1240 case JVMTI_EVENT_VM_OBJECT_ALLOC:
1241 GET_OFFSET (VMObjectAlloc);
1246 "libgcj: check_enabled_event for unknown JVMTI event (%d)\n",
1252 int index = EVENT_INDEX (type); // safe since caller checks this
1254 if (_jvmtiEnvironments != NULL)
1256 _envListLock->readLock ()->lock ();
1257 struct jvmti_env_list *e;
1258 FOREACH_ENVIRONMENT (e)
1261 = reinterpret_cast<char *> (&e->env->callbacks) + offset;
1262 void **callback = reinterpret_cast<void **> (addr);
1263 if (e->env->enabled[index] && *callback != NULL)
1266 _envListLock->readLock ()->unlock ();
1271 _envListLock->readLock ()->unlock ();
1278 check_enabled_events ()
1280 check_enabled_event (JVMTI_EVENT_VM_INIT);
1281 check_enabled_event (JVMTI_EVENT_VM_DEATH);
1282 check_enabled_event (JVMTI_EVENT_THREAD_START);
1283 check_enabled_event (JVMTI_EVENT_THREAD_END);
1284 check_enabled_event (JVMTI_EVENT_CLASS_FILE_LOAD_HOOK);
1285 check_enabled_event (JVMTI_EVENT_CLASS_LOAD);
1286 check_enabled_event (JVMTI_EVENT_CLASS_PREPARE);
1287 check_enabled_event (JVMTI_EVENT_VM_START);
1288 check_enabled_event (JVMTI_EVENT_EXCEPTION);
1289 check_enabled_event (JVMTI_EVENT_EXCEPTION_CATCH);
1290 check_enabled_event (JVMTI_EVENT_SINGLE_STEP);
1291 check_enabled_event (JVMTI_EVENT_FRAME_POP);
1292 check_enabled_event (JVMTI_EVENT_BREAKPOINT);
1293 check_enabled_event (JVMTI_EVENT_FIELD_ACCESS);
1294 check_enabled_event (JVMTI_EVENT_FIELD_MODIFICATION);
1295 check_enabled_event (JVMTI_EVENT_METHOD_ENTRY);
1296 check_enabled_event (JVMTI_EVENT_METHOD_EXIT);
1297 check_enabled_event (JVMTI_EVENT_NATIVE_METHOD_BIND);
1298 check_enabled_event (JVMTI_EVENT_COMPILED_METHOD_LOAD);
1299 check_enabled_event (JVMTI_EVENT_COMPILED_METHOD_UNLOAD);
1300 check_enabled_event (JVMTI_EVENT_DYNAMIC_CODE_GENERATED);
1301 check_enabled_event (JVMTI_EVENT_DATA_DUMP_REQUEST);
1302 check_enabled_event (JVMTI_EVENT_MONITOR_WAIT);
1303 check_enabled_event (JVMTI_EVENT_MONITOR_WAITED);
1304 check_enabled_event (JVMTI_EVENT_MONITOR_CONTENDED_ENTER);
1305 check_enabled_event (JVMTI_EVENT_MONITOR_CONTENDED_ENTERED);
1306 check_enabled_event (JVMTI_EVENT_GARBAGE_COLLECTION_START);
1307 check_enabled_event (JVMTI_EVENT_GARBAGE_COLLECTION_FINISH);
1308 check_enabled_event (JVMTI_EVENT_OBJECT_FREE);
1309 check_enabled_event (JVMTI_EVENT_VM_OBJECT_ALLOC);
1312 static jvmtiError JNICALL
1313 _Jv_JVMTI_SetEventNotificationMode (jvmtiEnv *env, jvmtiEventMode mode,
1314 jvmtiEvent type, jthread event_thread, ...)
1316 REQUIRE_PHASE (env, JVMTI_PHASE_ONLOAD | JVMTI_PHASE_LIVE);
1318 if (event_thread != NULL)
1320 THREAD_CHECK_VALID (event_thread);
1321 THREAD_CHECK_IS_ALIVE (event_thread);
1335 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
1340 case JVMTI_EVENT_VM_INIT:
1341 case JVMTI_EVENT_VM_DEATH:
1342 case JVMTI_EVENT_THREAD_START:
1343 case JVMTI_EVENT_VM_START:
1344 case JVMTI_EVENT_COMPILED_METHOD_LOAD:
1345 case JVMTI_EVENT_COMPILED_METHOD_UNLOAD:
1346 case JVMTI_EVENT_DYNAMIC_CODE_GENERATED:
1347 case JVMTI_EVENT_DATA_DUMP_REQUEST:
1348 ILLEGAL_ARGUMENT (event_thread != NULL);
1351 case JVMTI_EVENT_THREAD_END:
1352 case JVMTI_EVENT_CLASS_FILE_LOAD_HOOK:
1353 case JVMTI_EVENT_CLASS_LOAD:
1354 case JVMTI_EVENT_CLASS_PREPARE:
1355 case JVMTI_EVENT_EXCEPTION:
1356 case JVMTI_EVENT_EXCEPTION_CATCH:
1357 case JVMTI_EVENT_SINGLE_STEP:
1358 case JVMTI_EVENT_FRAME_POP:
1359 case JVMTI_EVENT_BREAKPOINT:
1360 case JVMTI_EVENT_FIELD_ACCESS:
1361 case JVMTI_EVENT_FIELD_MODIFICATION:
1362 case JVMTI_EVENT_METHOD_ENTRY:
1363 case JVMTI_EVENT_METHOD_EXIT:
1364 case JVMTI_EVENT_NATIVE_METHOD_BIND:
1365 case JVMTI_EVENT_MONITOR_WAIT:
1366 case JVMTI_EVENT_MONITOR_WAITED:
1367 case JVMTI_EVENT_MONITOR_CONTENDED_ENTER:
1368 case JVMTI_EVENT_MONITOR_CONTENDED_ENTERED:
1369 case JVMTI_EVENT_GARBAGE_COLLECTION_START:
1370 case JVMTI_EVENT_GARBAGE_COLLECTION_FINISH:
1371 case JVMTI_EVENT_OBJECT_FREE:
1372 case JVMTI_EVENT_VM_OBJECT_ALLOC:
1376 return JVMTI_ERROR_INVALID_EVENT_TYPE;
1379 env->thread[EVENT_INDEX(type)] = event_thread;
1380 env->enabled[EVENT_INDEX(type)] = enabled;
1381 check_enabled_event (type);
1382 return JVMTI_ERROR_NONE;
1385 static jvmtiError JNICALL
1386 _Jv_JVMTI_SetEventCallbacks (jvmtiEnv *env,
1387 const jvmtiEventCallbacks *callbacks,
1388 jint size_of_callbacks)
1390 REQUIRE_PHASE (env, JVMTI_PHASE_ONLOAD | JVMTI_PHASE_LIVE);
1391 ILLEGAL_ARGUMENT (size_of_callbacks < 0);
1393 // Copy the list of callbacks into the environment
1394 memcpy (&env->callbacks, callbacks, sizeof (jvmtiEventCallbacks));
1396 /* Check which events are now enabeld (JVMTI makes no requirements
1397 about the order in which SetEventCallbacks and SetEventNotifications
1398 are called. So we must check all events here. */
1399 check_enabled_events ();
1401 return JVMTI_ERROR_NONE;
1404 static jvmtiError JNICALL
1405 _Jv_JVMTI_GetErrorName (MAYBE_UNUSED jvmtiEnv *env, jvmtiError error,
1408 NULL_CHECK (name_ptr);
1413 case JVMTI_ERROR_NONE:
1417 case JVMTI_ERROR_NULL_POINTER:
1418 name = "null pointer";
1421 case JVMTI_ERROR_OUT_OF_MEMORY:
1422 name = "out of memory";
1425 case JVMTI_ERROR_ACCESS_DENIED:
1426 name = "access denied";
1429 case JVMTI_ERROR_WRONG_PHASE:
1430 name = "wrong phase";
1433 case JVMTI_ERROR_INTERNAL:
1434 name = "internal error";
1437 case JVMTI_ERROR_UNATTACHED_THREAD:
1438 name = "unattached thread";
1441 case JVMTI_ERROR_INVALID_ENVIRONMENT:
1442 name = "invalid environment";
1445 case JVMTI_ERROR_INVALID_PRIORITY:
1446 name = "invalid priority";
1449 case JVMTI_ERROR_THREAD_NOT_SUSPENDED:
1450 name = "thread not suspended";
1453 case JVMTI_ERROR_THREAD_SUSPENDED:
1454 name = "thread suspended";
1457 case JVMTI_ERROR_THREAD_NOT_ALIVE:
1458 name = "thread not alive";
1461 case JVMTI_ERROR_CLASS_NOT_PREPARED:
1462 name = "class not prepared";
1465 case JVMTI_ERROR_NO_MORE_FRAMES:
1466 name = "no more frames";
1469 case JVMTI_ERROR_OPAQUE_FRAME:
1470 name = "opaque frame";
1473 case JVMTI_ERROR_DUPLICATE:
1477 case JVMTI_ERROR_NOT_FOUND:
1481 case JVMTI_ERROR_NOT_MONITOR_OWNER:
1482 name = "not monitor owner";
1485 case JVMTI_ERROR_INTERRUPT:
1486 name = "interrupted";
1489 case JVMTI_ERROR_UNMODIFIABLE_CLASS:
1490 name = "unmodifiable class";
1493 case JVMTI_ERROR_NOT_AVAILABLE:
1494 name = "not available";
1497 case JVMTI_ERROR_ABSENT_INFORMATION:
1498 name = "absent information";
1501 case JVMTI_ERROR_INVALID_EVENT_TYPE:
1502 name = "invalid event type";
1505 case JVMTI_ERROR_NATIVE_METHOD:
1506 name = "native method";
1509 case JVMTI_ERROR_INVALID_THREAD:
1510 name = "invalid thread";
1513 case JVMTI_ERROR_INVALID_THREAD_GROUP:
1514 name = "invalid thread group";
1517 case JVMTI_ERROR_INVALID_OBJECT:
1518 name = "invalid object";
1521 case JVMTI_ERROR_INVALID_CLASS:
1522 name = "invalid class";
1525 case JVMTI_ERROR_INVALID_METHODID:
1526 name = "invalid method ID";
1529 case JVMTI_ERROR_INVALID_LOCATION:
1530 name = "invalid location";
1533 case JVMTI_ERROR_INVALID_FIELDID:
1534 name = "invalid field ID";
1537 case JVMTI_ERROR_TYPE_MISMATCH:
1538 name = "type mismatch";
1541 case JVMTI_ERROR_INVALID_SLOT:
1542 name = "invalid slot";
1545 case JVMTI_ERROR_INVALID_MONITOR:
1546 name = "invalid monitor";
1549 case JVMTI_ERROR_INVALID_CLASS_FORMAT:
1550 name = "invalid class format";
1553 case JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION:
1554 name = "circular class definition";
1557 case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED:
1558 name = "unsupported redefinition: method added";
1561 case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED:
1562 name = "unsupported redefinition: schema changed";
1565 case JVMTI_ERROR_INVALID_TYPESTATE:
1566 name = "invalid type state";
1569 case JVMTI_ERROR_FAILS_VERIFICATION:
1570 name = "fails verification";
1573 case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED:
1574 name = "unsupported redefinition: hierarchy changed";
1577 case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED:
1578 name = "unsupported redefinition: method deleted";
1581 case JVMTI_ERROR_UNSUPPORTED_VERSION:
1582 name = "unsupported version";
1585 case JVMTI_ERROR_NAMES_DONT_MATCH:
1586 name = "names do not match";
1589 case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED:
1590 name = "unsupported redefinition: class modifiers changed";
1593 case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED:
1594 name = "unsupported redefinition: method modifiers changed";
1597 case JVMTI_ERROR_MUST_POSSESS_CAPABILITY:
1598 name = "must possess capability";
1601 case JVMTI_ERROR_ILLEGAL_ARGUMENT:
1602 name = "illegal argument";
1606 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
1609 *name_ptr = (char *) _Jv_MallocUnchecked (strlen (name) + 1);
1610 if (*name_ptr == NULL)
1611 return JVMTI_ERROR_OUT_OF_MEMORY;
1613 strcpy (*name_ptr, name);
1614 return JVMTI_ERROR_NONE;
1617 #define RESERVED NULL
1618 #define UNIMPLEMENTED NULL
1620 struct _Jv_jvmtiEnv _Jv_JVMTI_Interface =
1622 RESERVED, // reserved1
1623 _Jv_JVMTI_SetEventNotificationMode, // SetEventNotificationMode
1624 RESERVED, // reserved3
1625 _Jv_JVMTI_GetAllThreads, // GetAllThreads
1626 _Jv_JVMTI_SuspendThread, // SuspendThread
1627 _Jv_JVMTI_ResumeThread, // ResumeThread
1628 UNIMPLEMENTED, // StopThread
1629 _Jv_JVMTI_InterruptThread, // InterruptThread
1630 UNIMPLEMENTED, // GetThreadInfo
1631 UNIMPLEMENTED, // GetOwnedMonitorInfo
1632 UNIMPLEMENTED, // GetCurrentContendedMonitor
1633 UNIMPLEMENTED, // RunAgentThread
1634 UNIMPLEMENTED, // GetTopThreadGroups
1635 UNIMPLEMENTED, // GetThreadGroupInfo
1636 UNIMPLEMENTED, // GetThreadGroupChildren
1637 _Jv_JVMTI_GetFrameCount, // GetFrameCount
1638 UNIMPLEMENTED, // GetThreadState
1639 RESERVED, // reserved18
1640 UNIMPLEMENTED, // GetFrameLocation
1641 UNIMPLEMENTED, // NotifyPopFrame
1642 UNIMPLEMENTED, // GetLocalObject
1643 UNIMPLEMENTED, // GetLocalInt
1644 UNIMPLEMENTED, // GetLocalLong
1645 UNIMPLEMENTED, // GetLocalFloat
1646 UNIMPLEMENTED, // GetLocalDouble
1647 UNIMPLEMENTED, // SetLocalObject
1648 UNIMPLEMENTED, // SetLocalInt
1649 UNIMPLEMENTED, // SetLocalLong
1650 UNIMPLEMENTED, // SetLocalFloat
1651 UNIMPLEMENTED, // SetLocalDouble
1652 _Jv_JVMTI_CreateRawMonitor, // CreateRawMonitor
1653 _Jv_JVMTI_DestroyRawMonitor, // DestroyRawMonitor
1654 _Jv_JVMTI_RawMonitorEnter, // RawMonitorEnter
1655 _Jv_JVMTI_RawMonitorExit, // RawMonitorExit
1656 _Jv_JVMTI_RawMonitorWait, // RawMonitorWait
1657 _Jv_JVMTI_RawMonitorNotify, // RawMonitorNotify
1658 _Jv_JVMTI_RawMonitorNotifyAll, // RawMonitorNotifyAll
1659 _Jv_JVMTI_SetBreakpoint, // SetBreakpoint
1660 _Jv_JVMTI_ClearBreakpoint, // ClearBreakpoint
1661 RESERVED, // reserved40
1662 UNIMPLEMENTED, // SetFieldAccessWatch
1663 UNIMPLEMENTED, // ClearFieldAccessWatch
1664 UNIMPLEMENTED, // SetFieldModificationWatch
1665 UNIMPLEMENTED, // ClearFieldModificationWatch
1666 RESERVED, // reserved45
1667 _Jv_JVMTI_Allocate, // Allocate
1668 _Jv_JVMTI_Deallocate, // Deallocate
1669 UNIMPLEMENTED, // GetClassSignature
1670 _Jv_JVMTI_GetClassStatus, // GetClassStatus
1671 UNIMPLEMENTED, // GetSourceFileName
1672 _Jv_JVMTI_GetClassModifiers, // GetClassModifiers
1673 _Jv_JVMTI_GetClassMethods, // GetClassMethods
1674 UNIMPLEMENTED, // GetClassFields
1675 UNIMPLEMENTED, // GetImplementedInterfaces
1676 _Jv_JVMTI_IsInterface, // IsInterface
1677 _Jv_JVMTI_IsArrayClass, // IsArrayClass
1678 _Jv_JVMTI_GetClassLoader, // GetClassLoader
1679 _Jv_JVMTI_GetObjectHashCode, // GetObjectHashCode
1680 UNIMPLEMENTED, // GetObjectMonitorUsage
1681 UNIMPLEMENTED, // GetFieldName
1682 UNIMPLEMENTED, // GetFieldDeclaringClass
1683 _Jv_JVMTI_GetFieldModifiers, // GetFieldModifiers
1684 _Jv_JVMTI_IsFieldSynthetic, // IsFieldSynthetic
1685 _Jv_JVMTI_GetMethodName, // GetMethodName
1686 _Jv_JVMTI_GetMethodDeclaringClass, // GetMethodDeclaringClass
1687 _Jv_JVMTI_GetMethodModifiers, // GetMethodModifers
1688 RESERVED, // reserved67
1689 _Jv_JVMTI_GetMaxLocals, // GetMaxLocals
1690 UNIMPLEMENTED, // GetArgumentsSize
1691 _Jv_JVMTI_GetLineNumberTable, // GetLineNumberTable
1692 UNIMPLEMENTED, // GetMethodLocation
1693 UNIMPLEMENTED, // GetLocalVariableTable
1694 RESERVED, // reserved73
1695 RESERVED, // reserved74
1696 UNIMPLEMENTED, // GetBytecodes
1697 _Jv_JVMTI_IsMethodNative, // IsMethodNative
1698 _Jv_JVMTI_IsMethodSynthetic, // IsMethodSynthetic
1699 UNIMPLEMENTED, // GetLoadedClasses
1700 _Jv_JVMTI_GetClassLoaderClasses, // GetClassLoaderClasses
1701 UNIMPLEMENTED, // PopFrame
1702 RESERVED, // reserved81
1703 RESERVED, // reserved82
1704 RESERVED, // reserved83
1705 RESERVED, // reserved84
1706 RESERVED, // reserved85
1707 RESERVED, // reserved86
1708 UNIMPLEMENTED, // RedefineClasses
1709 UNIMPLEMENTED, // GetVersionNumber
1710 UNIMPLEMENTED, // GetCapabilities
1711 UNIMPLEMENTED, // GetSourceDebugExtension
1712 UNIMPLEMENTED, // IsMethodObsolete
1713 UNIMPLEMENTED, // SuspendThreadList
1714 UNIMPLEMENTED, // ResumeThreadList
1715 RESERVED, // reserved94
1716 RESERVED, // reserved95
1717 RESERVED, // reserved96
1718 RESERVED, // reserved97
1719 RESERVED, // reserved98
1720 RESERVED, // reserved99
1721 UNIMPLEMENTED, // GetAllStackTraces
1722 UNIMPLEMENTED, // GetThreadListStackTraces
1723 UNIMPLEMENTED, // GetThreadLocalStorage
1724 UNIMPLEMENTED, // SetThreadLocalStorage
1725 _Jv_JVMTI_GetStackTrace, // GetStackTrace
1726 RESERVED, // reserved105
1727 UNIMPLEMENTED, // GetTag
1728 UNIMPLEMENTED, // SetTag
1729 _Jv_JVMTI_ForceGarbageCollection, // ForceGarbageCollection
1730 UNIMPLEMENTED, // IterateOverObjectsReachable
1731 UNIMPLEMENTED, // IterateOverReachableObjects
1732 UNIMPLEMENTED, // IterateOverHeap
1733 UNIMPLEMENTED, // IterateOverInstanceOfClass
1734 RESERVED, // reserved113
1735 UNIMPLEMENTED, // GetObjectsWithTags
1736 RESERVED, // reserved115
1737 RESERVED, // reserved116
1738 RESERVED, // reserved117
1739 RESERVED, // reserved118
1740 RESERVED, // reserved119
1741 _Jv_JVMTI_SetJNIFunctionTable, // SetJNIFunctionTable
1742 _Jv_JVMTI_GetJNIFunctionTable, // GetJNIFunctionTable
1743 _Jv_JVMTI_SetEventCallbacks, // SetEventCallbacks
1744 UNIMPLEMENTED, // GenerateEvents
1745 UNIMPLEMENTED, // GetExtensionFunctions
1746 UNIMPLEMENTED, // GetExtensionEvents
1747 UNIMPLEMENTED, // SetExtensionEventCallback
1748 _Jv_JVMTI_DisposeEnvironment, // DisposeEnvironment
1749 _Jv_JVMTI_GetErrorName, // GetErrorName
1750 UNIMPLEMENTED, // GetJLocationFormat
1751 UNIMPLEMENTED, // GetSystemProperties
1752 _Jv_JVMTI_GetSystemProperty, // GetSystemProperty
1753 _Jv_JVMTI_SetSystemProperty, // SetSystemProperty
1754 UNIMPLEMENTED, // GetPhase
1755 UNIMPLEMENTED, // GetCurrentThreadCpuTimerInfo
1756 UNIMPLEMENTED, // GetCurrentThreadCpuTime
1757 UNIMPLEMENTED, // GetThreadCpuTimerInfo
1758 UNIMPLEMENTED, // GetThreadCpuTime
1759 UNIMPLEMENTED, // GetTimerInfo
1760 _Jv_JVMTI_GetTime, // GetTime
1761 UNIMPLEMENTED, // GetPotentialCapabilities
1762 RESERVED, // reserved141
1763 UNIMPLEMENTED, // AddCapabilities
1764 UNIMPLEMENTED, // RelinquishCapabilities
1765 _Jv_JVMTI_GetAvailableProcessors, // GetAvailableProcessors
1766 RESERVED, // reserved145
1767 RESERVED, // reserved146
1768 UNIMPLEMENTED, // GetEnvironmentLocalStorage
1769 UNIMPLEMENTED, // SetEnvironmentLocalStorage
1770 _Jv_JVMTI_AddToBootstrapClassLoaderSearch, // AddToBootstrapClassLoaderSearch
1771 _Jv_JVMTI_SetVerboseFlag, // SetVerboseFlag
1772 RESERVED, // reserved151
1773 RESERVED, // reserved152
1774 RESERVED, // reserved153
1775 _Jv_JVMTI_GetObjectSize // GetObjectSize
1779 _Jv_GetJVMTIEnv (void)
1782 = (_Jv_JVMTIEnv *) _Jv_MallocUnchecked (sizeof (_Jv_JVMTIEnv));
1783 env->p = &_Jv_JVMTI_Interface;
1784 struct jvmti_env_list *element
1785 = (struct jvmti_env_list *) _Jv_MallocUnchecked (sizeof (struct jvmti_env_list));
1787 element->next = NULL;
1789 _envListLock->writeLock ()->lock ();
1790 if (_jvmtiEnvironments == NULL)
1791 _jvmtiEnvironments = element;
1794 struct jvmti_env_list *e;
1795 for (e = _jvmtiEnvironments; e->next != NULL; e = e->next)
1799 _envListLock->writeLock ()->unlock ();
1801 /* Mark JVMTI active. This is used to force the interpreter
1802 to use either debugging or non-debugging code. Once JVMTI
1803 has been enabled, the non-debug interpreter cannot be used. */
1804 JVMTI::enabled = true;
1811 _jvmtiEnvironments = NULL;
1813 = new java::util::concurrent::locks::ReentrantReadWriteLock ();
1815 // No environments, so this should set all JVMTI:: members to false
1816 check_enabled_events ();
1820 post_event (jvmtiEnv *env, jvmtiEvent type, jthread event_thread, va_list args)
1822 #define ARG(Type,Name) Type Name = (Type) va_arg (args, Type)
1824 #define GET_BOOLEAN_ARG(Name) \
1826 jboolean Name = (b == 0) ? false : true
1828 #define GET_CHAR_ARG(Name) \
1830 char Name = static_cast<char> (c)
1834 case JVMTI_EVENT_VM_INIT:
1835 if (env->callbacks.VMInit != NULL)
1837 ARG (JNIEnv *, jni_env);
1838 env->callbacks.VMInit (env, jni_env, event_thread);
1842 case JVMTI_EVENT_VM_DEATH:
1843 if (env->callbacks.VMDeath != NULL)
1845 ARG (JNIEnv *, jni_env);
1846 env->callbacks.VMDeath (env, jni_env);
1850 case JVMTI_EVENT_THREAD_START:
1851 if (env->callbacks.ThreadStart != NULL)
1853 ARG (JNIEnv *, jni_env);
1854 env->callbacks.ThreadStart (env, jni_env, event_thread);
1858 case JVMTI_EVENT_THREAD_END:
1859 if (env->callbacks.ThreadEnd != NULL)
1861 ARG (JNIEnv *, jni_env);
1862 env->callbacks.ThreadEnd (env, jni_env, event_thread);
1866 case JVMTI_EVENT_CLASS_FILE_LOAD_HOOK:
1867 if (env->callbacks.ClassFileLoadHook != NULL)
1869 ARG (JNIEnv *, jni_env);
1870 ARG (jclass, class_being_redefined);
1871 ARG (jobject, loader);
1872 ARG (const char *, name);
1873 ARG (jobject, protection_domain);
1874 ARG (jint, class_data_len);
1875 ARG (const unsigned char *, class_data);
1876 ARG (jint *, new_class_data_len);
1877 ARG (unsigned char **, new_class_data);
1878 env->callbacks.ClassFileLoadHook (env, jni_env,
1879 class_being_redefined, loader,
1880 name, protection_domain,
1881 class_data_len, class_data,
1887 case JVMTI_EVENT_CLASS_LOAD:
1888 if (env->callbacks.ClassLoad != NULL)
1890 ARG (JNIEnv *, jni_env);
1891 ARG (jclass, klass);
1892 env->callbacks.ClassLoad (env, jni_env, event_thread, klass);
1896 case JVMTI_EVENT_CLASS_PREPARE:
1897 if (env->callbacks.ClassPrepare != NULL)
1899 ARG (JNIEnv *, jni_env);
1900 ARG (jclass, klass);
1901 env->callbacks.ClassPrepare (env, jni_env, event_thread, klass);
1905 case JVMTI_EVENT_VM_START:
1906 if (env->callbacks.VMStart != NULL)
1908 ARG (JNIEnv *, jni_env);
1909 env->callbacks.VMStart (env, jni_env);
1913 case JVMTI_EVENT_EXCEPTION:
1914 if (env->callbacks.Exception != NULL)
1916 ARG (JNIEnv *, jni_env);
1917 ARG (jmethodID, method);
1918 ARG (jlocation, location);
1919 ARG (jobject, exception);
1920 ARG (jmethodID, catch_method);
1921 ARG (jlocation, catch_location);
1922 env->callbacks.Exception (env, jni_env, event_thread, method,
1923 location, exception, catch_method,
1928 case JVMTI_EVENT_EXCEPTION_CATCH:
1929 if (env->callbacks.ExceptionCatch != NULL)
1931 ARG (JNIEnv *, jni_env);
1932 ARG (jmethodID, method);
1933 ARG (jlocation, location);
1934 ARG (jobject, exception);
1935 env->callbacks.ExceptionCatch (env, jni_env, event_thread, method,
1936 location, exception);
1940 case JVMTI_EVENT_SINGLE_STEP:
1941 if (env->callbacks.SingleStep != NULL)
1943 ARG (JNIEnv *, jni_env);
1944 ARG (jmethodID, method);
1945 ARG (jlocation, location);
1946 env->callbacks.SingleStep (env, jni_env, event_thread, method,
1951 case JVMTI_EVENT_FRAME_POP:
1952 if (env->callbacks.FramePop != NULL)
1954 ARG (JNIEnv *, jni_env);
1955 ARG (jmethodID, method);
1956 GET_BOOLEAN_ARG (was_popped_by_exception);
1957 env->callbacks.FramePop (env, jni_env, event_thread, method,
1958 was_popped_by_exception);
1962 case JVMTI_EVENT_BREAKPOINT:
1963 if (env->callbacks.Breakpoint != NULL)
1965 ARG (JNIEnv *, jni_env);
1966 ARG (jmethodID, method);
1967 ARG (jlocation, location);
1968 env->callbacks.Breakpoint (env, jni_env, event_thread, method,
1973 case JVMTI_EVENT_FIELD_ACCESS:
1974 if (env->callbacks.FieldAccess != NULL)
1976 ARG (JNIEnv *, jni_env);
1977 ARG (jmethodID, method);
1978 ARG (jlocation, location);
1979 ARG (jclass, field_class);
1980 ARG (jobject, object);
1981 ARG (jfieldID, field);
1982 env->callbacks.FieldAccess (env, jni_env, event_thread, method,
1983 location, field_class, object, field);
1987 case JVMTI_EVENT_FIELD_MODIFICATION:
1988 if (env->callbacks.FieldModification != NULL)
1990 ARG (JNIEnv *, jni_env);
1991 ARG (jmethodID, method);
1992 ARG (jlocation, location);
1993 ARG (jclass, field_class);
1994 ARG (jobject, object);
1995 ARG (jfieldID, field);
1996 GET_CHAR_ARG (signature_type);
1997 ARG (jvalue, new_value);
1998 env->callbacks.FieldModification (env, jni_env, event_thread, method,
1999 location, field_class, object,
2000 field, signature_type, new_value);
2004 case JVMTI_EVENT_METHOD_ENTRY:
2005 if (env->callbacks.MethodEntry != NULL)
2007 ARG (JNIEnv *, jni_env);
2008 ARG (jmethodID, method);
2009 env->callbacks.MethodEntry (env, jni_env, event_thread, method);
2013 case JVMTI_EVENT_METHOD_EXIT:
2014 if (env->callbacks.MethodExit != NULL)
2016 ARG (JNIEnv *, jni_env);
2017 ARG (jmethodID, method);
2018 GET_BOOLEAN_ARG (was_popped_by_exception);
2019 ARG (jvalue, return_value);
2020 env->callbacks.MethodExit (env, jni_env, event_thread, method,
2021 was_popped_by_exception, return_value);
2025 case JVMTI_EVENT_NATIVE_METHOD_BIND:
2026 if (env->callbacks.NativeMethodBind != NULL)
2028 ARG (JNIEnv *, jni_env);
2029 ARG (jmethodID, method);
2030 ARG (void *, address);
2031 ARG (void **, new_address_ptr);
2032 env->callbacks.NativeMethodBind (env, jni_env, event_thread, method,
2033 address, new_address_ptr);
2037 case JVMTI_EVENT_COMPILED_METHOD_LOAD:
2038 if (env->callbacks.CompiledMethodLoad != NULL)
2040 ARG (jmethodID, method);
2041 ARG (jint, code_size);
2042 ARG (const void *, code_addr);
2043 ARG (jint, map_length);
2044 ARG (const jvmtiAddrLocationMap *, map);
2045 ARG (const void *, compile_info);
2046 env->callbacks.CompiledMethodLoad (env, method, code_size, code_addr,
2047 map_length, map, compile_info);
2051 case JVMTI_EVENT_COMPILED_METHOD_UNLOAD:
2052 if (env->callbacks.CompiledMethodUnload != NULL)
2054 ARG (jmethodID, method);
2055 ARG (const void *, code_addr);
2056 env->callbacks.CompiledMethodUnload (env, method, code_addr);
2060 case JVMTI_EVENT_DYNAMIC_CODE_GENERATED:
2061 if (env->callbacks.DynamicCodeGenerated != NULL)
2063 ARG (const char *, name);
2064 ARG (const void *, address);
2066 env->callbacks.DynamicCodeGenerated (env, name, address, length);
2070 case JVMTI_EVENT_DATA_DUMP_REQUEST:
2071 if (env->callbacks.DataDumpRequest != NULL)
2073 env->callbacks.DataDumpRequest (env);
2077 case JVMTI_EVENT_MONITOR_WAIT:
2078 if (env->callbacks.MonitorWait != NULL)
2080 ARG (JNIEnv *, jni_env);
2081 ARG (jobject, object);
2082 ARG (jlong, timeout);
2083 env->callbacks.MonitorWait (env, jni_env, event_thread, object,
2088 case JVMTI_EVENT_MONITOR_WAITED:
2089 if (env->callbacks.MonitorWaited != NULL)
2091 ARG (JNIEnv *, jni_env);
2092 ARG (jobject, object);
2093 GET_BOOLEAN_ARG (timed_out);
2094 env->callbacks.MonitorWaited (env, jni_env, event_thread, object,
2099 case JVMTI_EVENT_MONITOR_CONTENDED_ENTER:
2100 if (env->callbacks.MonitorContendedEnter != NULL)
2102 ARG (JNIEnv *, jni_env);
2103 ARG (jobject, object);
2104 env->callbacks.MonitorContendedEnter (env, jni_env, event_thread,
2109 case JVMTI_EVENT_MONITOR_CONTENDED_ENTERED:
2110 if (env->callbacks.MonitorContendedEntered != NULL)
2112 ARG (JNIEnv *, jni_env);
2113 ARG (jobject, object);
2114 env->callbacks.MonitorContendedEntered (env, jni_env, event_thread,
2119 case JVMTI_EVENT_GARBAGE_COLLECTION_START:
2120 if (env->callbacks.GarbageCollectionStart != NULL)
2122 env->callbacks.GarbageCollectionStart (env);
2126 case JVMTI_EVENT_GARBAGE_COLLECTION_FINISH:
2127 if (env->callbacks.GarbageCollectionFinish != NULL)
2129 env->callbacks.GarbageCollectionFinish (env);
2133 case JVMTI_EVENT_OBJECT_FREE:
2134 if (env->callbacks.ObjectFree != NULL)
2137 env->callbacks.ObjectFree (env, tag);
2141 case JVMTI_EVENT_VM_OBJECT_ALLOC:
2142 if (env->callbacks.VMObjectAlloc != NULL)
2144 ARG (JNIEnv *, jni_env);
2145 ARG (jobject, object);
2146 ARG (jclass, object_class);
2148 env->callbacks.VMObjectAlloc (env, jni_env, event_thread,
2149 object, object_class, size);
2154 fprintf (stderr, "libgcj: post of unknown JVMTI event (%d)\n",
2160 #undef GET_BOOLEAN_ARG
2164 /* Post an event to requesting JVMTI environments
2166 * This function should not be called without consulting the
2167 * JVMTI_REQUESTED_EVENT macro first (for speed). It does no real
2168 * harm (other than kill speed), since this function will still
2169 * only send the event if it was properly requested by an environment.
2172 _Jv_JVMTI_PostEvent (jvmtiEvent type, jthread event_thread, ...)
2175 va_start (args, event_thread);
2177 _envListLock->readLock ()->lock ();
2178 struct jvmti_env_list *e;
2179 FOREACH_ENVIRONMENT (e)
2181 /* Events are only posted if the event was explicitly enabled,
2182 it has a registered event handler, and the event thread
2183 matches (either globally or restricted to a specific thread).
2184 Here we check all but the event handler, which will be handled
2186 if (e->env->enabled[EVENT_INDEX(type)]
2187 && (e->env->thread[EVENT_INDEX(type)] == NULL
2188 || e->env->thread[EVENT_INDEX(type)] == event_thread))
2190 post_event (e->env, type, event_thread, args);
2193 _envListLock->readLock ()->unlock ();