46
46
*/
47
47
static jvmtiEnv * trackingEnv ;
48
48
49
+ static void addPreparedClass (JNIEnv * env , jclass klass );
50
+
49
51
/*
50
52
* Invoke the callback when classes are freed.
51
53
*/
52
54
void JNICALL
53
55
cbTrackingObjectFree (jvmtiEnv * jvmti_env , jlong tag )
54
56
{
57
+ JDI_ASSERT (jvmti_env == trackingEnv );
55
58
eventHandler_synthesizeUnloadEvent ((char * )jlong_to_ptr (tag ), getEnv ());
56
59
}
57
60
58
- void
59
- classTrack_addPreparedClass (JNIEnv * env_unused , jclass klass )
61
+ /*
62
+ * Invoke the callback when classes are prepared.
63
+ */
64
+ void JNICALL
65
+ cbTrackingClassPrepare (jvmtiEnv * jvmti_env , JNIEnv * env , jthread thread , jclass klass )
66
+ {
67
+ JDI_ASSERT (jvmti_env == trackingEnv );
68
+ addPreparedClass (env , klass );
69
+ }
70
+
71
+ /*
72
+ * Add a class to the prepared class hash table.
73
+ */
74
+ static void
75
+ addPreparedClass (JNIEnv * env , jclass klass )
60
76
{
61
77
jvmtiError error ;
62
- jvmtiEnv * env = trackingEnv ;
63
78
64
79
char * signature ;
65
80
error = classSignature (klass , & signature , NULL );
@@ -70,7 +85,7 @@ classTrack_addPreparedClass(JNIEnv *env_unused, jclass klass)
70
85
if (gdata && gdata -> assertOn ) {
71
86
// Check if already tagged.
72
87
jlong tag ;
73
- error = JVMTI_FUNC_PTR (trackingEnv , GetTag )(env , klass , & tag );
88
+ error = JVMTI_FUNC_PTR (trackingEnv , GetTag )(trackingEnv , klass , & tag );
74
89
if (error != JVMTI_ERROR_NONE ) {
75
90
EXIT_ERROR (error , "Unable to GetTag with class trackingEnv" );
76
91
}
@@ -83,7 +98,7 @@ classTrack_addPreparedClass(JNIEnv *env_unused, jclass klass)
83
98
}
84
99
}
85
100
86
- error = JVMTI_FUNC_PTR (trackingEnv , SetTag )(env , klass , ptr_to_jlong (signature ));
101
+ error = JVMTI_FUNC_PTR (trackingEnv , SetTag )(trackingEnv , klass , ptr_to_jlong (signature ));
87
102
if (error != JVMTI_ERROR_NONE ) {
88
103
jvmtiDeallocate (signature );
89
104
EXIT_ERROR (error ,"SetTag" );
@@ -102,15 +117,27 @@ setupEvents()
102
117
}
103
118
jvmtiEventCallbacks cb ;
104
119
memset (& cb , 0 , sizeof (cb ));
120
+
121
+ // Setup JVMTI callbacks
105
122
cb .ObjectFree = cbTrackingObjectFree ;
123
+ cb .ClassPrepare = cbTrackingClassPrepare ;
106
124
error = JVMTI_FUNC_PTR (trackingEnv , SetEventCallbacks )(trackingEnv , & cb , sizeof (cb ));
107
125
if (error != JVMTI_ERROR_NONE ) {
108
126
return JNI_FALSE ;
109
127
}
128
+
129
+ // Enable OBJECT_FREE events
110
130
error = JVMTI_FUNC_PTR (trackingEnv , SetEventNotificationMode )(trackingEnv , JVMTI_ENABLE , JVMTI_EVENT_OBJECT_FREE , NULL );
111
131
if (error != JVMTI_ERROR_NONE ) {
112
132
return JNI_FALSE ;
113
133
}
134
+
135
+ // Enable CLASS_PREPARE events
136
+ error = JVMTI_FUNC_PTR (trackingEnv , SetEventNotificationMode )(trackingEnv , JVMTI_ENABLE , JVMTI_EVENT_CLASS_PREPARE , NULL );
137
+ if (error != JVMTI_ERROR_NONE ) {
138
+ return JNI_FALSE ;
139
+ }
140
+
114
141
return JNI_TRUE ;
115
142
}
116
143
@@ -143,7 +170,7 @@ classTrack_initialize(JNIEnv *env)
143
170
jint wanted = JVMTI_CLASS_STATUS_PREPARED | JVMTI_CLASS_STATUS_ARRAY ;
144
171
status = classStatus (klass );
145
172
if ((status & wanted ) != 0 ) {
146
- classTrack_addPreparedClass (env , klass );
173
+ addPreparedClass (env , klass );
147
174
}
148
175
}
149
176
jvmtiDeallocate (classes );
0 commit comments