Skip to content

Commit 2181042

Browse files
committed
8295375: debug agent class tracking should not piggy back on the cbClassPrepare() callback
Reviewed-by: amenkov, sspitsyn
1 parent f41711e commit 2181042

File tree

4 files changed

+33
-24
lines changed

4 files changed

+33
-24
lines changed

src/jdk.jdwp.agent/share/native/libjdwp/classTrack.c

+33-6
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,35 @@
4646
*/
4747
static jvmtiEnv* trackingEnv;
4848

49+
static void addPreparedClass(JNIEnv *env, jclass klass);
50+
4951
/*
5052
* Invoke the callback when classes are freed.
5153
*/
5254
void JNICALL
5355
cbTrackingObjectFree(jvmtiEnv* jvmti_env, jlong tag)
5456
{
57+
JDI_ASSERT(jvmti_env == trackingEnv);
5558
eventHandler_synthesizeUnloadEvent((char*)jlong_to_ptr(tag), getEnv());
5659
}
5760

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)
6076
{
6177
jvmtiError error;
62-
jvmtiEnv* env = trackingEnv;
6378

6479
char* signature;
6580
error = classSignature(klass, &signature, NULL);
@@ -70,7 +85,7 @@ classTrack_addPreparedClass(JNIEnv *env_unused, jclass klass)
7085
if (gdata && gdata->assertOn) {
7186
// Check if already tagged.
7287
jlong tag;
73-
error = JVMTI_FUNC_PTR(trackingEnv, GetTag)(env, klass, &tag);
88+
error = JVMTI_FUNC_PTR(trackingEnv, GetTag)(trackingEnv, klass, &tag);
7489
if (error != JVMTI_ERROR_NONE) {
7590
EXIT_ERROR(error, "Unable to GetTag with class trackingEnv");
7691
}
@@ -83,7 +98,7 @@ classTrack_addPreparedClass(JNIEnv *env_unused, jclass klass)
8398
}
8499
}
85100

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));
87102
if (error != JVMTI_ERROR_NONE) {
88103
jvmtiDeallocate(signature);
89104
EXIT_ERROR(error,"SetTag");
@@ -102,15 +117,27 @@ setupEvents()
102117
}
103118
jvmtiEventCallbacks cb;
104119
memset(&cb, 0, sizeof(cb));
120+
121+
// Setup JVMTI callbacks
105122
cb.ObjectFree = cbTrackingObjectFree;
123+
cb.ClassPrepare = cbTrackingClassPrepare;
106124
error = JVMTI_FUNC_PTR(trackingEnv, SetEventCallbacks)(trackingEnv, &cb, sizeof(cb));
107125
if (error != JVMTI_ERROR_NONE) {
108126
return JNI_FALSE;
109127
}
128+
129+
// Enable OBJECT_FREE events
110130
error = JVMTI_FUNC_PTR(trackingEnv, SetEventNotificationMode)(trackingEnv, JVMTI_ENABLE, JVMTI_EVENT_OBJECT_FREE, NULL);
111131
if (error != JVMTI_ERROR_NONE) {
112132
return JNI_FALSE;
113133
}
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+
114141
return JNI_TRUE;
115142
}
116143

@@ -143,7 +170,7 @@ classTrack_initialize(JNIEnv *env)
143170
jint wanted = JVMTI_CLASS_STATUS_PREPARED | JVMTI_CLASS_STATUS_ARRAY;
144171
status = classStatus(klass);
145172
if ((status & wanted) != 0) {
146-
classTrack_addPreparedClass(env, klass);
173+
addPreparedClass(env, klass);
147174
}
148175
}
149176
jvmtiDeallocate(classes);

src/jdk.jdwp.agent/share/native/libjdwp/classTrack.h

-6
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,6 @@
3333
struct bag *
3434
classTrack_processUnloads(JNIEnv *env);
3535

36-
/*
37-
* Add a class to the prepared class hash table.
38-
*/
39-
void
40-
classTrack_addPreparedClass(JNIEnv *env, jclass klass);
41-
4236
/*
4337
* Initialize class tracking.
4438
*/

src/jdk.jdwp.agent/share/native/libjdwp/eventFilter.c

-2
Original file line numberDiff line numberDiff line change
@@ -1265,7 +1265,6 @@ enableEvents(HandlerNode *node)
12651265
case EI_THREAD_END:
12661266
case EI_VM_INIT:
12671267
case EI_VM_DEATH:
1268-
case EI_CLASS_PREPARE:
12691268
case EI_GC_FINISH:
12701269
case EI_VIRTUAL_THREAD_START:
12711270
case EI_VIRTUAL_THREAD_END:
@@ -1326,7 +1325,6 @@ disableEvents(HandlerNode *node)
13261325
case EI_THREAD_END:
13271326
case EI_VM_INIT:
13281327
case EI_VM_DEATH:
1329-
case EI_CLASS_PREPARE:
13301328
case EI_GC_FINISH:
13311329
case EI_VIRTUAL_THREAD_START:
13321330
case EI_VIRTUAL_THREAD_END:

src/jdk.jdwp.agent/share/native/libjdwp/eventHandler.c

-10
Original file line numberDiff line numberDiff line change
@@ -546,11 +546,6 @@ filterAndHandleEvent(JNIEnv *env, EventInfo *evinfo, EventIndex ei,
546546
HandlerNode *node;
547547
char *classname;
548548

549-
/* We must keep track of all classes prepared to know what's unloaded */
550-
if (evinfo->ei == EI_CLASS_PREPARE) {
551-
classTrack_addPreparedClass(env, evinfo->clazz);
552-
}
553-
554549
node = getHandlerChain(ei)->first;
555550
classname = getClassname(evinfo->clazz);
556551

@@ -1509,11 +1504,6 @@ eventHandler_initialize(jbyte sessionID)
15091504
if (error != JVMTI_ERROR_NONE) {
15101505
EXIT_ERROR(error,"Can't enable thread end events");
15111506
}
1512-
error = threadControl_setEventMode(JVMTI_ENABLE,
1513-
EI_CLASS_PREPARE, NULL);
1514-
if (error != JVMTI_ERROR_NONE) {
1515-
EXIT_ERROR(error,"Can't enable class prepare events");
1516-
}
15171507
error = threadControl_setEventMode(JVMTI_ENABLE,
15181508
EI_GC_FINISH, NULL);
15191509
if (error != JVMTI_ERROR_NONE) {

0 commit comments

Comments
 (0)