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>
19 #include <gcj/method.h>
21 #include <gnu/classpath/SystemProperties.h>
22 #include <gnu/gcj/runtime/BootClassLoader.h>
23 #include <java/lang/Class.h>
24 #include <java/lang/ClassLoader.h>
25 #include <java/lang/Object.h>
26 #include <java/lang/Thread.h>
27 #include <java/lang/Throwable.h>
28 #include <java/lang/VMClassLoader.h>
29 #include <java/lang/reflect/Field.h>
30 #include <java/lang/reflect/Modifier.h>
31 #include <java/util/Collection.h>
32 #include <java/util/HashMap.h>
33 #include <java/net/URL.h>
35 extern struct JNINativeInterface _Jv_JNIFunctions
;
37 struct _Jv_rawMonitorID
40 _Jv_ConditionVariable_t condition
;
43 /* A simple linked list of all JVMTI environments. Since
44 events must be delivered to environments in the order
45 in which the environments were created, new environments
46 are added to the end of the list. */
50 struct jvmti_env_list
*next
;
52 static struct jvmti_env_list
*_jvmtiEnvironments
= NULL
;
53 static java::lang::Object
*_envListLock
= NULL
;
54 #define FOREACH_ENVIRONMENT(Ele) \
55 for (Ele = _jvmtiEnvironments; Ele != NULL; Ele = Ele->next)
57 // Some commonly-used checks
59 #define THREAD_DEFAULT_TO_CURRENT(jthread) \
62 if (jthread == NULL) \
63 jthread = java::lang::Thread::currentThread (); \
67 #define THREAD_CHECK_VALID(jthread) \
70 if (!java::lang::Thread::class$.isAssignableFrom (&(jthread->class$))) \
71 return JVMTI_ERROR_INVALID_THREAD; \
75 #define THREAD_CHECK_IS_ALIVE(thread) \
78 if (!thread->isAlive ()) \
79 return JVMTI_ERROR_THREAD_NOT_ALIVE; \
83 // FIXME: if current phase is not set in Phases,
84 // return JVMTI_ERROR_WRONG_PHASE
85 #define REQUIRE_PHASE(Env, Phases)
87 #define NULL_CHECK(Ptr) \
91 return JVMTI_ERROR_NULL_POINTER; \
95 #define ILLEGAL_ARGUMENT(Cond) \
99 return JVMTI_ERROR_ILLEGAL_ARGUMENT; \
103 static jvmtiError JNICALL
104 _Jv_JVMTI_SuspendThread (MAYBE_UNUSED jvmtiEnv
*env
, jthread thread
)
106 using namespace java::lang
;
108 THREAD_DEFAULT_TO_CURRENT (thread
);
109 THREAD_CHECK_VALID (thread
);
111 Thread
*t
= reinterpret_cast<Thread
*> (thread
);
112 THREAD_CHECK_IS_ALIVE (t
);
114 _Jv_Thread_t
*data
= _Jv_ThreadGetData (t
);
115 _Jv_SuspendThread (data
);
116 return JVMTI_ERROR_NONE
;
119 static jvmtiError JNICALL
120 _Jv_JVMTI_ResumeThread (MAYBE_UNUSED jvmtiEnv
*env
, jthread thread
)
122 using namespace java::lang
;
124 THREAD_DEFAULT_TO_CURRENT (thread
);
125 THREAD_CHECK_VALID (thread
);
127 Thread
*t
= reinterpret_cast<Thread
*> (thread
);
128 THREAD_CHECK_IS_ALIVE (t
);
130 _Jv_Thread_t
*data
= _Jv_ThreadGetData (t
);
131 _Jv_ResumeThread (data
);
132 return JVMTI_ERROR_NONE
;
135 static jvmtiError JNICALL
136 _Jv_JVMTI_InterruptThread (MAYBE_UNUSED jvmtiEnv
*env
, jthread thread
)
138 using namespace java::lang
;
140 REQUIRE_PHASE (env
, JVMTI_PHASE_LIVE
);
141 // FIXME: capability handling? 'can_signal_thread'
143 return JVMTI_ERROR_INVALID_THREAD
;
144 THREAD_CHECK_VALID (thread
);
145 Thread
*real_thread
= reinterpret_cast<Thread
*> (thread
);
146 THREAD_CHECK_IS_ALIVE (real_thread
);
147 real_thread
->interrupt();
148 return JVMTI_ERROR_NONE
;
151 static jvmtiError JNICALL
152 _Jv_JVMTI_CreateRawMonitor (MAYBE_UNUSED jvmtiEnv
*env
, const char *name
,
153 jrawMonitorID
*result
)
155 REQUIRE_PHASE (env
, JVMTI_PHASE_ONLOAD
| JVMTI_PHASE_LIVE
);
158 *result
= (jrawMonitorID
) _Jv_Malloc (sizeof (_Jv_rawMonitorID
));
159 _Jv_MutexInit (&(*result
)->mutex
);
160 _Jv_CondInit (&(*result
)->condition
);
161 return JVMTI_ERROR_NONE
;
164 static jvmtiError JNICALL
165 _Jv_JVMTI_DestroyRawMonitor (MAYBE_UNUSED jvmtiEnv
*env
, jrawMonitorID monitor
)
167 REQUIRE_PHASE (env
, JVMTI_PHASE_ONLOAD
| JVMTI_PHASE_LIVE
);
168 // Note we have no better way of knowing whether this object is
169 // really a raw monitor.
171 return JVMTI_ERROR_INVALID_MONITOR
;
172 // FIXME: perform checks on monitor, release it if this thread owns
174 #ifdef _Jv_HaveMutexDestroy
175 _Jv_MutexDestroy (&monitor
->mutex
);
178 return JVMTI_ERROR_NONE
;
181 static jvmtiError JNICALL
182 _Jv_JVMTI_RawMonitorEnter (MAYBE_UNUSED jvmtiEnv
*env
, jrawMonitorID monitor
)
185 return JVMTI_ERROR_INVALID_MONITOR
;
186 _Jv_MutexLock (&monitor
->mutex
);
187 return JVMTI_ERROR_NONE
;
190 static jvmtiError JNICALL
191 _Jv_JVMTI_RawMonitorExit (MAYBE_UNUSED jvmtiEnv
*env
, jrawMonitorID monitor
)
194 return JVMTI_ERROR_INVALID_MONITOR
;
195 if (_Jv_MutexUnlock (&monitor
->mutex
))
196 return JVMTI_ERROR_NOT_MONITOR_OWNER
;
197 return JVMTI_ERROR_NONE
;
200 static jvmtiError JNICALL
201 _Jv_JVMTI_RawMonitorWait (MAYBE_UNUSED jvmtiEnv
*env
, jrawMonitorID monitor
,
205 return JVMTI_ERROR_INVALID_MONITOR
;
206 int r
= _Jv_CondWait (&monitor
->condition
, &monitor
->mutex
, millis
, 0);
207 if (r
== _JV_NOT_OWNER
)
208 return JVMTI_ERROR_NOT_MONITOR_OWNER
;
209 if (r
== _JV_INTERRUPTED
)
210 return JVMTI_ERROR_INTERRUPT
;
211 return JVMTI_ERROR_NONE
;
214 static jvmtiError JNICALL
215 _Jv_JVMTI_RawMonitorNotify (MAYBE_UNUSED jvmtiEnv
*env
, jrawMonitorID monitor
)
218 return JVMTI_ERROR_INVALID_MONITOR
;
219 if (_Jv_CondNotify (&monitor
->condition
, &monitor
->mutex
) == _JV_NOT_OWNER
)
220 return JVMTI_ERROR_NOT_MONITOR_OWNER
;
221 return JVMTI_ERROR_NONE
;
224 static jvmtiError JNICALL
225 _Jv_JVMTI_RawMonitorNotifyAll (MAYBE_UNUSED jvmtiEnv
*env
,
226 jrawMonitorID monitor
)
229 return JVMTI_ERROR_INVALID_MONITOR
;
230 if (_Jv_CondNotifyAll (&monitor
->condition
, &monitor
->mutex
)
232 return JVMTI_ERROR_NOT_MONITOR_OWNER
;
233 return JVMTI_ERROR_NONE
;
236 static jvmtiError JNICALL
237 _Jv_JVMTI_Allocate (MAYBE_UNUSED jvmtiEnv
*env
, jlong size
,
238 unsigned char **result
)
240 ILLEGAL_ARGUMENT (size
< 0);
246 *result
= (unsigned char *) _Jv_MallocUnchecked (size
);
248 return JVMTI_ERROR_OUT_OF_MEMORY
;
250 return JVMTI_ERROR_NONE
;
253 static jvmtiError JNICALL
254 _Jv_JVMTI_Deallocate (MAYBE_UNUSED jvmtiEnv
*env
, unsigned char *mem
)
258 return JVMTI_ERROR_NONE
;
261 static jvmtiError JNICALL
262 _Jv_JVMTI_GetClassModifiers (MAYBE_UNUSED jvmtiEnv
*env
, jclass klass
,
265 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
266 // Don't bother checking KLASS' type.
268 return JVMTI_ERROR_INVALID_CLASS
;
270 *mods
= klass
->getModifiers();
271 return JVMTI_ERROR_NONE
;
274 static jvmtiError JNICALL
275 _Jv_JVMTI_GetClassMethods (MAYBE_UNUSED jvmtiEnv
*env
, jclass klass
,
276 jint
*count_ptr
, jmethodID
**methods_ptr
)
278 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
279 // FIXME: capability can_maintain_original_method_order
280 // Don't bother checking KLASS' type.
282 return JVMTI_ERROR_INVALID_CLASS
;
283 NULL_CHECK (count_ptr
);
284 NULL_CHECK (methods_ptr
);
285 *count_ptr
= JvNumMethods(klass
);
287 *methods_ptr
= (jmethodID
*) _Jv_Malloc (*count_ptr
* sizeof (jmethodID
));
288 jmethodID start
= JvGetFirstMethod (klass
);
289 for (jint i
= 0; i
< *count_ptr
; ++i
)
291 (*methods_ptr
)[i
] = start
+ i
;
293 return JVMTI_ERROR_NONE
;
296 static jvmtiError JNICALL
297 _Jv_JVMTI_IsInterface (MAYBE_UNUSED jvmtiEnv
*env
, jclass klass
,
300 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
302 return JVMTI_ERROR_INVALID_CLASS
;
304 *result
= klass
->isInterface();
305 return JVMTI_ERROR_NONE
;
308 static jvmtiError JNICALL
309 _Jv_JVMTI_IsArrayClass (MAYBE_UNUSED jvmtiEnv
*env
, jclass klass
,
312 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
314 return JVMTI_ERROR_INVALID_CLASS
;
316 *result
= klass
->isArray();
317 return JVMTI_ERROR_NONE
;
320 static jvmtiError JNICALL
321 _Jv_JVMTI_GetClassLoader (MAYBE_UNUSED jvmtiEnv
*env
, jclass klass
,
324 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
326 return JVMTI_ERROR_INVALID_CLASS
;
328 *result
= klass
->getClassLoaderInternal();
329 return JVMTI_ERROR_NONE
;
332 static jvmtiError JNICALL
333 _Jv_JVMTI_GetObjectHashCode (MAYBE_UNUSED jvmtiEnv
*env
, jobject obj
,
336 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
338 return JVMTI_ERROR_INVALID_OBJECT
;
340 *result
= _Jv_HashCode (obj
);
341 return JVMTI_ERROR_NONE
;
344 static jvmtiError JNICALL
345 _Jv_JVMTI_GetFieldModifiers (MAYBE_UNUSED jvmtiEnv
*env
, jclass klass
,
346 jfieldID field
, jint
*result
)
348 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
350 return JVMTI_ERROR_INVALID_CLASS
;
352 return JVMTI_ERROR_INVALID_FIELDID
;
354 *result
= field
->getModifiers();
355 return JVMTI_ERROR_NONE
;
358 static jvmtiError JNICALL
359 _Jv_JVMTI_IsFieldSynthetic (MAYBE_UNUSED jvmtiEnv
*env
, jclass klass
,
360 jfieldID field
, jboolean
*result
)
362 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
364 return JVMTI_ERROR_INVALID_CLASS
;
366 return JVMTI_ERROR_INVALID_FIELDID
;
369 // FIXME: capability can_get_synthetic_attribute
370 *result
= ((field
->getModifiers() & java::lang::reflect::Modifier::SYNTHETIC
)
372 return JVMTI_ERROR_NONE
;
375 static jvmtiError JNICALL
376 _Jv_JVMTI_GetMethodModifiers (MAYBE_UNUSED jvmtiEnv
*env
, jmethodID method
,
379 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
381 return JVMTI_ERROR_INVALID_METHODID
;
384 // FIXME: mask off some internal bits...
385 *result
= method
->accflags
;
386 return JVMTI_ERROR_NONE
;
389 static jvmtiError JNICALL
390 _Jv_JVMTI_IsMethodNative (MAYBE_UNUSED jvmtiEnv
*env
, jmethodID method
,
393 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
395 return JVMTI_ERROR_INVALID_METHODID
;
398 *result
= ((method
->accflags
& java::lang::reflect::Modifier::NATIVE
) != 0);
399 return JVMTI_ERROR_NONE
;
402 static jvmtiError JNICALL
403 _Jv_JVMTI_IsMethodSynthetic (MAYBE_UNUSED jvmtiEnv
*env
, jmethodID method
,
406 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
408 return JVMTI_ERROR_INVALID_METHODID
;
411 // FIXME capability can_get_synthetic_attribute
413 *result
= ((method
->accflags
& java::lang::reflect::Modifier::SYNTHETIC
)
415 return JVMTI_ERROR_NONE
;
418 static jvmtiError JNICALL
419 _Jv_JVMTI_GetClassLoaderClasses (MAYBE_UNUSED jvmtiEnv
*env
,
424 using namespace java::lang
;
425 using namespace java::util
;
427 REQUIRE_PHASE (env
, JVMTI_PHASE_LIVE
);
428 NULL_CHECK (count_ptr
);
429 NULL_CHECK (result_ptr
);
431 ClassLoader
*loader
= (ClassLoader
*) init_loader
;
433 loader
= VMClassLoader::bootLoader
;
435 Collection
*values
= loader
->loadedClasses
->values();
436 jobjectArray array
= values
->toArray();
437 *count_ptr
= array
->length
;
438 jobject
*elts
= elements (array
);
439 jclass
*result
= (jclass
*) _Jv_Malloc (*count_ptr
* sizeof (jclass
));
440 // FIXME: JNI references...
441 memcpy (result
, elts
, *count_ptr
* sizeof (jclass
));
443 *result_ptr
= result
;
445 return JVMTI_ERROR_NONE
;
448 static jvmtiError JNICALL
449 _Jv_JVMTI_ForceGarbageCollection (MAYBE_UNUSED jvmtiEnv
*env
)
451 REQUIRE_PHASE (env
, JVMTI_PHASE_LIVE
);
453 return JVMTI_ERROR_NONE
;
456 static jvmtiError JNICALL
457 _Jv_JVMTI_SetJNIFunctionTable (MAYBE_UNUSED jvmtiEnv
*env
,
458 const jniNativeInterface
*function_table
)
460 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
461 NULL_CHECK (function_table
);
462 memcpy (&_Jv_JNIFunctions
, function_table
, sizeof (jniNativeInterface
));
463 return JVMTI_ERROR_NONE
;
466 static jvmtiError JNICALL
467 _Jv_JVMTI_GetJNIFunctionTable (MAYBE_UNUSED jvmtiEnv
*env
,
468 jniNativeInterface
**function_table
)
470 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
471 NULL_CHECK (function_table
);
473 = (jniNativeInterface
*) _Jv_Malloc (sizeof (jniNativeInterface
));
474 memcpy (*function_table
, &_Jv_JNIFunctions
, sizeof (jniNativeInterface
));
475 return JVMTI_ERROR_NONE
;
478 static jvmtiError JNICALL
479 _Jv_JVMTI_DisposeEnvironment (jvmtiEnv
*env
)
483 if (_jvmtiEnvironments
== NULL
)
484 return JVMTI_ERROR_INVALID_ENVIRONMENT
;
487 JvSynchronize
dummy (_envListLock
);
488 if (_jvmtiEnvironments
->env
== env
)
490 _Jv_Free (_jvmtiEnvironments
);
491 _jvmtiEnvironments
= _jvmtiEnvironments
->next
;
495 struct jvmti_env_list
*e
= _jvmtiEnvironments
;
496 while (e
->next
!= NULL
&& e
->next
->env
!= env
)
499 return JVMTI_ERROR_INVALID_ENVIRONMENT
;
501 struct jvmti_env_list
*next
= e
->next
->next
;
508 return JVMTI_ERROR_NONE
;
511 static jvmtiError JNICALL
512 _Jv_JVMTI_GetSystemProperty (MAYBE_UNUSED jvmtiEnv
*env
, const char *property
,
515 REQUIRE_PHASE (env
, JVMTI_PHASE_ONLOAD
| JVMTI_PHASE_LIVE
);
516 NULL_CHECK (property
);
519 jstring name
= JvNewStringUTF(property
);
520 jstring result_str
= gnu::classpath::SystemProperties::getProperty(name
);
522 if (result_str
== NULL
)
523 return JVMTI_ERROR_NOT_AVAILABLE
;
525 int len
= JvGetStringUTFLength (result_str
);
526 *result
= (char *) _Jv_Malloc (len
+ 1);
527 JvGetStringUTFRegion (result_str
, 0, result_str
->length(), *result
);
528 (*result
)[len
] = '\0';
530 return JVMTI_ERROR_NONE
;
533 static jvmtiError JNICALL
534 _Jv_JVMTI_SetSystemProperty (MAYBE_UNUSED jvmtiEnv
*env
, const char *property
,
537 REQUIRE_PHASE (env
, JVMTI_PHASE_ONLOAD
);
539 NULL_CHECK (property
);
542 // FIXME: When would a property not be writeable?
543 return JVMTI_ERROR_NONE
;
546 jstring prop_str
= JvNewStringUTF(property
);
547 jstring value_str
= JvNewStringUTF(value
);
548 gnu::classpath::SystemProperties::setProperty(prop_str
, value_str
);
549 return JVMTI_ERROR_NONE
;
552 static jvmtiError JNICALL
553 _Jv_JVMTI_GetTime (MAYBE_UNUSED jvmtiEnv
*env
, jlong
*nanos_ptr
)
555 NULL_CHECK (nanos_ptr
);
556 *nanos_ptr
= _Jv_platform_nanotime();
557 return JVMTI_ERROR_NONE
;
560 static jvmtiError JNICALL
561 _Jv_JVMTI_GetAvailableProcessors (MAYBE_UNUSED jvmtiEnv
*env
,
562 jint
*nprocessors_ptr
)
564 NULL_CHECK (nprocessors_ptr
);
565 #ifdef _SC_NPROCESSORS_ONLN
566 *nprocessors_ptr
= sysconf(_SC_NPROCESSORS_ONLN
);
568 *nprocessors_ptr
= 1;
570 return JVMTI_ERROR_NONE
;
573 static jvmtiError JNICALL
574 _Jv_JVMTI_AddToBootstrapClassLoaderSearch (MAYBE_UNUSED jvmtiEnv
*env
,
577 using namespace java::lang
;
578 using namespace java::net
;
579 using namespace gnu::gcj::runtime
;
581 REQUIRE_PHASE (env
, JVMTI_PHASE_ONLOAD
);
582 NULL_CHECK (segment
);
584 jstring str_segment
= JvNewStringUTF(segment
);
588 url
= new URL(JvNewStringUTF("file"), NULL
, str_segment
);
590 catch (jthrowable ignore
)
592 return JVMTI_ERROR_ILLEGAL_ARGUMENT
;
595 BootClassLoader
*loader
= VMClassLoader::bootLoader
;
596 // Don't call this too early.
597 // assert (loader != NULL);
599 return JVMTI_ERROR_NONE
;
602 static jvmtiError JNICALL
603 _Jv_JVMTI_SetVerboseFlag (MAYBE_UNUSED jvmtiEnv
*env
, jvmtiVerboseFlag flag
,
608 case JVMTI_VERBOSE_OTHER
:
609 case JVMTI_VERBOSE_GC
:
610 case JVMTI_VERBOSE_JNI
:
613 case JVMTI_VERBOSE_CLASS
:
614 gcj::verbose_class_flag
= value
;
617 return JVMTI_ERROR_ILLEGAL_ARGUMENT
;
619 return JVMTI_ERROR_NONE
;
622 static jvmtiError JNICALL
623 _Jv_JVMTI_GetObjectSize (MAYBE_UNUSED jvmtiEnv
*env
, jobject object
,
626 REQUIRE_PHASE (env
, JVMTI_PHASE_START
| JVMTI_PHASE_LIVE
);
628 return JVMTI_ERROR_INVALID_OBJECT
;
631 jclass klass
= object
->getClass();
632 if (klass
->isArray())
634 jclass comp
= klass
->getComponentType();
636 = (jint
) (_Jv_uintptr_t
) _Jv_GetArrayElementFromElementType(NULL
,
637 klass
->getComponentType());
638 // FIXME: correct for primitive types?
639 jint compSize
= comp
->size();
640 __JArray
*array
= (__JArray
*) object
;
641 *result
= base
+ array
->length
* compSize
;
645 // Note that if OBJECT is a String then it may (if
646 // str->data==str) take more space. Do we care?
647 *result
= klass
->size();
649 return JVMTI_ERROR_NONE
;
652 #define RESERVED NULL
653 #define UNIMPLEMENTED NULL
655 struct _Jv_jvmtiEnv _Jv_JVMTI_Interface
=
657 RESERVED
, // reserved1
658 UNIMPLEMENTED
, // SetEventNotification
659 RESERVED
, // reserved3
660 UNIMPLEMENTED
, // GetAllThreads
661 _Jv_JVMTI_SuspendThread
, // SuspendThread
662 _Jv_JVMTI_ResumeThread
, // ResumeThread
663 UNIMPLEMENTED
, // StopThread
664 _Jv_JVMTI_InterruptThread
, // InterruptThread
665 UNIMPLEMENTED
, // GetThreadInfo
666 UNIMPLEMENTED
, // GetOwnedMonitorInfo
667 UNIMPLEMENTED
, // GetCurrentContendedMonitor
668 UNIMPLEMENTED
, // RunAgentThread
669 UNIMPLEMENTED
, // GetTopThreadGroups
670 UNIMPLEMENTED
, // GetThreadGroupInfo
671 UNIMPLEMENTED
, // GetThreadGroupChildren
672 UNIMPLEMENTED
, // GetFrameCount
673 UNIMPLEMENTED
, // GetThreadState
674 RESERVED
, // reserved18
675 UNIMPLEMENTED
, // GetFrameLocation
676 UNIMPLEMENTED
, // NotifyPopFrame
677 UNIMPLEMENTED
, // GetLocalObject
678 UNIMPLEMENTED
, // GetLocalInt
679 UNIMPLEMENTED
, // GetLocalLong
680 UNIMPLEMENTED
, // GetLocalFloat
681 UNIMPLEMENTED
, // GetLocalDouble
682 UNIMPLEMENTED
, // SetLocalObject
683 UNIMPLEMENTED
, // SetLocalInt
684 UNIMPLEMENTED
, // SetLocalLong
685 UNIMPLEMENTED
, // SetLocalFloat
686 UNIMPLEMENTED
, // SetLocalDouble
687 _Jv_JVMTI_CreateRawMonitor
, // CreateRawMonitor
688 _Jv_JVMTI_DestroyRawMonitor
, // DestroyRawMonitor
689 _Jv_JVMTI_RawMonitorEnter
, // RawMonitorEnter
690 _Jv_JVMTI_RawMonitorExit
, // RawMonitorExit
691 _Jv_JVMTI_RawMonitorWait
, // RawMonitorWait
692 _Jv_JVMTI_RawMonitorNotify
, // RawMonitorNotify
693 _Jv_JVMTI_RawMonitorNotifyAll
, // RawMonitorNotifyAll
694 UNIMPLEMENTED
, // SetBreakpoint
695 UNIMPLEMENTED
, // ClearBreakpoint
696 RESERVED
, // reserved40
697 UNIMPLEMENTED
, // SetFieldAccessWatch
698 UNIMPLEMENTED
, // ClearFieldAccessWatch
699 UNIMPLEMENTED
, // SetFieldModificationWatch
700 UNIMPLEMENTED
, // ClearFieldModificationWatch
701 RESERVED
, // reserved45
702 _Jv_JVMTI_Allocate
, // Allocate
703 _Jv_JVMTI_Deallocate
, // Deallocate
704 UNIMPLEMENTED
, // GetClassSignature
705 UNIMPLEMENTED
, // GetClassStatus
706 UNIMPLEMENTED
, // GetSourceFileName
707 _Jv_JVMTI_GetClassModifiers
, // GetClassModifiers
708 _Jv_JVMTI_GetClassMethods
, // GetClassMethods
709 UNIMPLEMENTED
, // GetClassFields
710 UNIMPLEMENTED
, // GetImplementedInterfaces
711 _Jv_JVMTI_IsInterface
, // IsInterface
712 _Jv_JVMTI_IsArrayClass
, // IsArrayClass
713 _Jv_JVMTI_GetClassLoader
, // GetClassLoader
714 _Jv_JVMTI_GetObjectHashCode
, // GetObjectHashCode
715 UNIMPLEMENTED
, // GetObjectMonitorUsage
716 UNIMPLEMENTED
, // GetFieldName
717 UNIMPLEMENTED
, // GetFieldDeclaringClass
718 _Jv_JVMTI_GetFieldModifiers
, // GetFieldModifiers
719 _Jv_JVMTI_IsFieldSynthetic
, // IsFieldSynthetic
720 UNIMPLEMENTED
, // GetMethodName
721 UNIMPLEMENTED
, // GetMethodDeclaringClass
722 _Jv_JVMTI_GetMethodModifiers
, // GetMethodModifers
723 RESERVED
, // reserved67
724 UNIMPLEMENTED
, // GetMaxLocals
725 UNIMPLEMENTED
, // GetArgumentsSize
726 UNIMPLEMENTED
, // GetLineNumberTable
727 UNIMPLEMENTED
, // GetMethodLocation
728 UNIMPLEMENTED
, // GetLocalVariableTable
729 RESERVED
, // reserved73
730 RESERVED
, // reserved74
731 UNIMPLEMENTED
, // GetBytecodes
732 _Jv_JVMTI_IsMethodNative
, // IsMethodNative
733 _Jv_JVMTI_IsMethodSynthetic
, // IsMethodSynthetic
734 UNIMPLEMENTED
, // GetLoadedClasses
735 _Jv_JVMTI_GetClassLoaderClasses
, // GetClassLoaderClasses
736 UNIMPLEMENTED
, // PopFrame
737 RESERVED
, // reserved81
738 RESERVED
, // reserved82
739 RESERVED
, // reserved83
740 RESERVED
, // reserved84
741 RESERVED
, // reserved85
742 RESERVED
, // reserved86
743 UNIMPLEMENTED
, // RedefineClasses
744 UNIMPLEMENTED
, // GetVersionNumber
745 UNIMPLEMENTED
, // GetCapabilities
746 UNIMPLEMENTED
, // GetSourceDebugExtension
747 UNIMPLEMENTED
, // IsMethodObsolete
748 UNIMPLEMENTED
, // SuspendThreadList
749 UNIMPLEMENTED
, // ResumeThreadList
750 RESERVED
, // reserved94
751 RESERVED
, // reserved95
752 RESERVED
, // reserved96
753 RESERVED
, // reserved97
754 RESERVED
, // reserved98
755 RESERVED
, // reserved99
756 UNIMPLEMENTED
, // GetAllStackTraces
757 UNIMPLEMENTED
, // GetThreadListStackTraces
758 UNIMPLEMENTED
, // GetThreadLocalStorage
759 UNIMPLEMENTED
, // SetThreadLocalStorage
760 UNIMPLEMENTED
, // GetStackTrace
761 RESERVED
, // reserved105
762 UNIMPLEMENTED
, // GetTag
763 UNIMPLEMENTED
, // SetTag
764 _Jv_JVMTI_ForceGarbageCollection
, // ForceGarbageCollection
765 UNIMPLEMENTED
, // IterateOverObjectsReachable
766 UNIMPLEMENTED
, // IterateOverReachableObjects
767 UNIMPLEMENTED
, // IterateOverHeap
768 UNIMPLEMENTED
, // IterateOverInstanceOfClass
769 RESERVED
, // reserved113
770 UNIMPLEMENTED
, // GetObjectsWithTags
771 RESERVED
, // reserved115
772 RESERVED
, // reserved116
773 RESERVED
, // reserved117
774 RESERVED
, // reserved118
775 RESERVED
, // reserved119
776 _Jv_JVMTI_SetJNIFunctionTable
, // SetJNIFunctionTable
777 _Jv_JVMTI_GetJNIFunctionTable
, // GetJNIFunctionTable
778 UNIMPLEMENTED
, // SetEventCallbacks
779 UNIMPLEMENTED
, // GenerateEvents
780 UNIMPLEMENTED
, // GetExtensionFunctions
781 UNIMPLEMENTED
, // GetExtensionEvents
782 UNIMPLEMENTED
, // SetExtensionEventCallback
783 _Jv_JVMTI_DisposeEnvironment
, // DisposeEnvironment
784 UNIMPLEMENTED
, // GetErrorName
785 UNIMPLEMENTED
, // GetJLocationFormat
786 UNIMPLEMENTED
, // GetSystemProperties
787 _Jv_JVMTI_GetSystemProperty
, // GetSystemProperty
788 _Jv_JVMTI_SetSystemProperty
, // SetSystemProperty
789 UNIMPLEMENTED
, // GetPhase
790 UNIMPLEMENTED
, // GetCurrentThreadCpuTimerInfo
791 UNIMPLEMENTED
, // GetCurrentThreadCpuTime
792 UNIMPLEMENTED
, // GetThreadCpuTimerInfo
793 UNIMPLEMENTED
, // GetThreadCpuTime
794 UNIMPLEMENTED
, // GetTimerInfo
795 _Jv_JVMTI_GetTime
, // GetTime
796 UNIMPLEMENTED
, // GetPotentialCapabilities
797 RESERVED
, // reserved141
798 UNIMPLEMENTED
, // AddCapabilities
799 UNIMPLEMENTED
, // RelinquishCapabilities
800 _Jv_JVMTI_GetAvailableProcessors
, // GetAvailableProcessors
801 RESERVED
, // reserved145
802 RESERVED
, // reserved146
803 UNIMPLEMENTED
, // GetEnvironmentLocalStorage
804 UNIMPLEMENTED
, // SetEnvironmentLocalStorage
805 _Jv_JVMTI_AddToBootstrapClassLoaderSearch
, // AddToBootstrapClassLoaderSearch
806 _Jv_JVMTI_SetVerboseFlag
, // SetVerboseFlag
807 RESERVED
, // reserved151
808 RESERVED
, // reserved152
809 RESERVED
, // reserved153
810 _Jv_JVMTI_GetObjectSize
// GetObjectSize
814 _Jv_GetJVMTIEnv (void)
817 = (_Jv_JVMTIEnv
*) _Jv_MallocUnchecked (sizeof (_Jv_JVMTIEnv
));
818 env
->p
= &_Jv_JVMTI_Interface
;
821 JvSynchronize
dummy (_envListLock
);
822 struct jvmti_env_list
*element
823 = (struct jvmti_env_list
*) _Jv_MallocUnchecked (sizeof (struct jvmti_env_list
));
825 element
->next
= NULL
;
827 if (_jvmtiEnvironments
== NULL
)
828 _jvmtiEnvironments
= element
;
831 struct jvmti_env_list
*e
;
832 for (e
= _jvmtiEnvironments
; e
->next
!= NULL
; e
= e
->next
)
844 _jvmtiEnvironments
= NULL
;
845 _envListLock
= new java::lang::Object ();