29 #include "classfile/modules.hpp"
30 #include "classfile/systemDictionary.hpp"
31 #include "classfile/vmSymbols.hpp"
32 #include "interpreter/bytecodeStream.hpp"
33 #include "interpreter/interpreter.hpp"
34 #include "jvmtifiles/jvmtiEnv.hpp"
35 #include "logging/log.hpp"
36 #include "logging/logConfiguration.hpp"
37 #include "memory/resourceArea.hpp"
38 #include "memory/universe.inline.hpp"
39 #include "oops/instanceKlass.hpp"
40 #include "oops/objArrayOop.inline.hpp"
41 #include "oops/oop.inline.hpp"
42 #include "prims/jniCheck.hpp"
43 #include "prims/jvm_misc.hpp"
44 #include "prims/jvmtiAgentThread.hpp"
45 #include "prims/jvmtiClassFileReconstituter.hpp"
46 #include "prims/jvmtiCodeBlobEvents.hpp"
47 #include "prims/jvmtiExtensions.hpp"
48 #include "prims/jvmtiGetLoadedClasses.hpp"
49 #include "prims/jvmtiImpl.hpp"
50 #include "prims/jvmtiManageCapabilities.hpp"
51 #include "prims/jvmtiRawMonitor.hpp"
52 #include "prims/jvmtiRedefineClasses.hpp"
53 #include "prims/jvmtiTagMap.hpp"
54 #include "prims/jvmtiThreadState.inline.hpp"
55 #include "prims/jvmtiUtil.hpp"
56 #include "runtime/arguments.hpp"
57 #include "runtime/deoptimization.hpp"
58 #include "runtime/interfaceSupport.hpp"
59 #include "runtime/javaCalls.hpp"
60 #include "runtime/jfieldIDWorkaround.hpp"
61 #include "runtime/osThread.hpp"
62 #include "runtime/reflectionUtils.hpp"
63 #include "runtime/signature.hpp"
64 #include "runtime/thread.inline.hpp"
65 #include "runtime/timerTrace.hpp"
66 #include "runtime/vframe.hpp"
67 #include "runtime/vmThread.hpp"
68 #include "services/threadService.hpp"
69 #include "utilities/exceptions.hpp"
70 #include "utilities/preserveException.hpp"
71
72
73 #define FIXLATER 0 // REMOVE this when completed.
74
75 // FIXLATER: hook into JvmtiTrace
76 #define TraceJVMTICalls false
77
1930
1931
1932 // k_mirror - may be primitive, this must be checked
1933 // heap_object_callback - pre-checked for NULL
1934 // user_data - NULL is a valid value, must be checked
1935 jvmtiError
1936 JvmtiEnv::IterateOverInstancesOfClass(oop k_mirror, jvmtiHeapObjectFilter object_filter, jvmtiHeapObjectCallback heap_object_callback, const void* user_data) {
1937 if (java_lang_Class::is_primitive(k_mirror)) {
1938 // DO PRIMITIVE CLASS PROCESSING
1939 return JVMTI_ERROR_NONE;
1940 }
1941 Klass* klass = java_lang_Class::as_Klass(k_mirror);
1942 if (klass == NULL) {
1943 return JVMTI_ERROR_INVALID_CLASS;
1944 }
1945 TraceTime t("IterateOverInstancesOfClass", TRACETIME_LOG(Debug, jvmti, objecttagging));
1946 JvmtiTagMap::tag_map_for(this)->iterate_over_heap(object_filter, klass, heap_object_callback, user_data);
1947 return JVMTI_ERROR_NONE;
1948 } /* end IterateOverInstancesOfClass */
1949
1950
1951 //
1952 // Local Variable functions
1953 //
1954
1955 // Threads_lock NOT held, java_thread not protected by lock
1956 // java_thread - pre-checked
1957 // java_thread - unchecked
1958 // depth - pre-checked as non-negative
1959 // value_ptr - pre-checked for NULL
1960 jvmtiError
1961 JvmtiEnv::GetLocalObject(JavaThread* java_thread, jint depth, jint slot, jobject* value_ptr) {
1962 JavaThread* current_thread = JavaThread::current();
1963 // rm object is created to clean up the javaVFrame created in
1964 // doit_prologue(), but after doit() is finished with it.
1965 ResourceMark rm(current_thread);
1966
1967 VM_GetOrSetLocal op(java_thread, current_thread, depth, slot);
1968 VMThread::execute(&op);
1969 jvmtiError err = op.result();
|
29 #include "classfile/modules.hpp"
30 #include "classfile/systemDictionary.hpp"
31 #include "classfile/vmSymbols.hpp"
32 #include "interpreter/bytecodeStream.hpp"
33 #include "interpreter/interpreter.hpp"
34 #include "jvmtifiles/jvmtiEnv.hpp"
35 #include "logging/log.hpp"
36 #include "logging/logConfiguration.hpp"
37 #include "memory/resourceArea.hpp"
38 #include "memory/universe.inline.hpp"
39 #include "oops/instanceKlass.hpp"
40 #include "oops/objArrayOop.inline.hpp"
41 #include "oops/oop.inline.hpp"
42 #include "prims/jniCheck.hpp"
43 #include "prims/jvm_misc.hpp"
44 #include "prims/jvmtiAgentThread.hpp"
45 #include "prims/jvmtiClassFileReconstituter.hpp"
46 #include "prims/jvmtiCodeBlobEvents.hpp"
47 #include "prims/jvmtiExtensions.hpp"
48 #include "prims/jvmtiGetLoadedClasses.hpp"
49 #include "prims/jvmtiHeapTransition.hpp"
50 #include "prims/jvmtiImpl.hpp"
51 #include "prims/jvmtiManageCapabilities.hpp"
52 #include "prims/jvmtiRawMonitor.hpp"
53 #include "prims/jvmtiRedefineClasses.hpp"
54 #include "prims/jvmtiTagMap.hpp"
55 #include "prims/jvmtiThreadState.inline.hpp"
56 #include "prims/jvmtiUtil.hpp"
57 #include "runtime/arguments.hpp"
58 #include "runtime/deoptimization.hpp"
59 #include "runtime/heapMonitoring.hpp"
60 #include "runtime/interfaceSupport.hpp"
61 #include "runtime/javaCalls.hpp"
62 #include "runtime/jfieldIDWorkaround.hpp"
63 #include "runtime/osThread.hpp"
64 #include "runtime/reflectionUtils.hpp"
65 #include "runtime/signature.hpp"
66 #include "runtime/thread.inline.hpp"
67 #include "runtime/timerTrace.hpp"
68 #include "runtime/vframe.hpp"
69 #include "runtime/vmThread.hpp"
70 #include "services/threadService.hpp"
71 #include "utilities/exceptions.hpp"
72 #include "utilities/preserveException.hpp"
73
74
75 #define FIXLATER 0 // REMOVE this when completed.
76
77 // FIXLATER: hook into JvmtiTrace
78 #define TraceJVMTICalls false
79
1932
1933
1934 // k_mirror - may be primitive, this must be checked
1935 // heap_object_callback - pre-checked for NULL
1936 // user_data - NULL is a valid value, must be checked
1937 jvmtiError
1938 JvmtiEnv::IterateOverInstancesOfClass(oop k_mirror, jvmtiHeapObjectFilter object_filter, jvmtiHeapObjectCallback heap_object_callback, const void* user_data) {
1939 if (java_lang_Class::is_primitive(k_mirror)) {
1940 // DO PRIMITIVE CLASS PROCESSING
1941 return JVMTI_ERROR_NONE;
1942 }
1943 Klass* klass = java_lang_Class::as_Klass(k_mirror);
1944 if (klass == NULL) {
1945 return JVMTI_ERROR_INVALID_CLASS;
1946 }
1947 TraceTime t("IterateOverInstancesOfClass", TRACETIME_LOG(Debug, jvmti, objecttagging));
1948 JvmtiTagMap::tag_map_for(this)->iterate_over_heap(object_filter, klass, heap_object_callback, user_data);
1949 return JVMTI_ERROR_NONE;
1950 } /* end IterateOverInstancesOfClass */
1951
1952 // Start the sampler.
1953 jvmtiError
1954 JvmtiEnv::StartHeapSampling(jint monitoring_rate, jint max_gc_storage) {
1955 if (monitoring_rate < 0) {
1956 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
1957 }
1958
1959 HeapThreadTransition htt(Thread::current());
1960 HeapMonitoring::initialize_profiling(monitoring_rate, max_gc_storage);
1961 return JVMTI_ERROR_NONE;
1962 } /* end StartHeapSampling */
1963
1964 // Stop the sampler.
1965 jvmtiError
1966 JvmtiEnv::StopHeapSampling() {
1967 HeapThreadTransition htt(Thread::current());
1968 HeapMonitoring::stop_profiling();
1969 return JVMTI_ERROR_NONE;
1970 } /* end StopHeapSampling */
1971
1972 // Get the currently live sampled allocations.
1973 jvmtiError
1974 JvmtiEnv::GetLiveTraces(jvmtiStackTraces* stack_traces) {
1975 HeapThreadTransition htt(Thread::current());
1976 if (stack_traces == NULL) {
1977 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
1978 }
1979
1980 HeapMonitoring::get_live_traces(stack_traces);
1981 return JVMTI_ERROR_NONE;
1982 } /* end GetLiveTraces */
1983
1984 // Get the currently live sampled allocations.
1985 jvmtiError
1986 JvmtiEnv::GetGarbageTraces(jvmtiStackTraces* stack_traces) {
1987 HeapThreadTransition htt(Thread::current());
1988 if (stack_traces == NULL) {
1989 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
1990 }
1991
1992 HeapMonitoring::get_garbage_traces(stack_traces);
1993 return JVMTI_ERROR_NONE;
1994 } /* end GetGarbageTraces */
1995
1996 // Get the currently live sampled allocations.
1997 jvmtiError
1998 JvmtiEnv::GetFrequentGarbageTraces(jvmtiStackTraces* stack_traces) {
1999 HeapThreadTransition htt(Thread::current());
2000 if (stack_traces == NULL) {
2001 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
2002 }
2003
2004 HeapMonitoring::get_frequent_garbage_traces(stack_traces);
2005 return JVMTI_ERROR_NONE;
2006 } /* end GetFrequentGarbageTraces */
2007
2008 // Release sampled traces.
2009 jvmtiError
2010 JvmtiEnv::ReleaseTraces(jvmtiStackTraces* stack_traces) {
2011 if (stack_traces == NULL) {
2012 return JVMTI_ERROR_NONE;
2013 }
2014 HeapMonitoring::release_traces(stack_traces);
2015 return JVMTI_ERROR_NONE;
2016 } /* end ReleaseTraces */
2017
2018 // Get the heap sampling statistics.
2019 jvmtiError
2020 JvmtiEnv::GetHeapSamplingStats(jvmtiHeapSamplingStats* stats) {
2021 if (stats == NULL) {
2022 return JVMTI_ERROR_ILLEGAL_ARGUMENT;
2023 }
2024 HeapMonitoring::get_sampling_statistics(stats);
2025 return JVMTI_ERROR_NONE;
2026 } /* end GetHeapSamplingStats */
2027
2028 //
2029 // Local Variable functions
2030 //
2031
2032 // Threads_lock NOT held, java_thread not protected by lock
2033 // java_thread - pre-checked
2034 // java_thread - unchecked
2035 // depth - pre-checked as non-negative
2036 // value_ptr - pre-checked for NULL
2037 jvmtiError
2038 JvmtiEnv::GetLocalObject(JavaThread* java_thread, jint depth, jint slot, jobject* value_ptr) {
2039 JavaThread* current_thread = JavaThread::current();
2040 // rm object is created to clean up the javaVFrame created in
2041 // doit_prologue(), but after doit() is finished with it.
2042 ResourceMark rm(current_thread);
2043
2044 VM_GetOrSetLocal op(java_thread, current_thread, depth, slot);
2045 VMThread::execute(&op);
2046 jvmtiError err = op.result();
|