Skip to content

Commit 74f2b16

Browse files
committed
8295303: cleanup debug agent's confusing use of EI_GC_FINISH
Reviewed-by: amenkov, sspitsyn
1 parent 0ee25de commit 74f2b16

File tree

6 files changed

+44
-29
lines changed

6 files changed

+44
-29
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ eventText(int i)
232232
CASE_RETURN_TEXT(EI_THREAD_START)
233233
CASE_RETURN_TEXT(EI_THREAD_END)
234234
CASE_RETURN_TEXT(EI_CLASS_PREPARE)
235+
CASE_RETURN_TEXT(EI_CLASS_UNLOAD)
235236
CASE_RETURN_TEXT(EI_CLASS_LOAD)
236237
CASE_RETURN_TEXT(EI_FIELD_ACCESS)
237238
CASE_RETURN_TEXT(EI_FIELD_MODIFICATION)
@@ -240,7 +241,6 @@ eventText(int i)
240241
CASE_RETURN_TEXT(EI_METHOD_EXIT)
241242
CASE_RETURN_TEXT(EI_VM_INIT)
242243
CASE_RETURN_TEXT(EI_VM_DEATH)
243-
CASE_RETURN_TEXT(EI_GC_FINISH)
244244
CASE_RETURN_TEXT(EI_VIRTUAL_THREAD_START)
245245
CASE_RETURN_TEXT(EI_VIRTUAL_THREAD_END)
246246
default: return "EVENT_unknown";

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ eventFilterRestricted_passesFilter(JNIEnv *env,
397397
* Suppress most events if they happen in debug threads
398398
*/
399399
if ((evinfo->ei != EI_CLASS_PREPARE) &&
400-
(evinfo->ei != EI_GC_FINISH) &&
400+
(evinfo->ei != EI_CLASS_UNLOAD) &&
401401
(evinfo->ei != EI_CLASS_LOAD) &&
402402
threadControl_isDebugThread(thread)) {
403403
return JNI_FALSE;
@@ -749,7 +749,7 @@ eventFilter_setThreadOnlyFilter(HandlerNode *node, jint index,
749749
if (index >= FILTER_COUNT(node)) {
750750
return AGENT_ERROR_ILLEGAL_ARGUMENT;
751751
}
752-
if (NODE_EI(node) == EI_GC_FINISH) {
752+
if (NODE_EI(node) == EI_CLASS_UNLOAD) {
753753
return AGENT_ERROR_ILLEGAL_ARGUMENT;
754754
}
755755

@@ -821,7 +821,7 @@ eventFilter_setClassOnlyFilter(HandlerNode *node, jint index,
821821
return AGENT_ERROR_ILLEGAL_ARGUMENT;
822822
}
823823
if (
824-
(NODE_EI(node) == EI_GC_FINISH) ||
824+
(NODE_EI(node) == EI_CLASS_UNLOAD) ||
825825
(NODE_EI(node) == EI_THREAD_START) ||
826826
(NODE_EI(node) == EI_THREAD_END)) {
827827

@@ -1265,7 +1265,7 @@ enableEvents(HandlerNode *node)
12651265
case EI_THREAD_END:
12661266
case EI_VM_INIT:
12671267
case EI_VM_DEATH:
1268-
case EI_GC_FINISH:
1268+
case EI_CLASS_UNLOAD:
12691269
case EI_VIRTUAL_THREAD_START:
12701270
case EI_VIRTUAL_THREAD_END:
12711271
return error;
@@ -1325,7 +1325,7 @@ disableEvents(HandlerNode *node)
13251325
case EI_THREAD_END:
13261326
case EI_VM_INIT:
13271327
case EI_VM_DEATH:
1328-
case EI_GC_FINISH:
1328+
case EI_CLASS_UNLOAD:
13291329
case EI_VIRTUAL_THREAD_START:
13301330
case EI_VIRTUAL_THREAD_END:
13311331
return error;

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

+8-3
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ eventHandler_synthesizeUnloadEvent(char *signature, JNIEnv *env)
487487

488488
debugMonitorEnter(handlerLock);
489489

490-
node = getHandlerChain(EI_GC_FINISH)->first;
490+
node = getHandlerChain(EI_CLASS_UNLOAD)->first;
491491
while (node != NULL) {
492492
/* save next so handlers can remove themselves */
493493
HandlerNode *next = NEXT(node);
@@ -1508,8 +1508,13 @@ eventHandler_initialize(jbyte sessionID)
15081508
if (error != JVMTI_ERROR_NONE) {
15091509
EXIT_ERROR(error,"Can't enable thread end events");
15101510
}
1511-
error = threadControl_setEventMode(JVMTI_ENABLE,
1512-
EI_GC_FINISH, NULL);
1511+
1512+
/*
1513+
* GARBAGE_COLLECTION_FINISH is special since it is not tied to any handlers or an EI,
1514+
* so it cannot be setup using threadControl_setEventMode(). Use JVMTI API directly.
1515+
*/
1516+
error = JVMTI_FUNC_PTR(gdata->jvmti,SetEventNotificationMode)
1517+
(gdata->jvmti, JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, NULL);
15131518
if (error != JVMTI_ERROR_NONE) {
15141519
EXIT_ERROR(error,"Can't enable garbage collection finish events");
15151520
}

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

+8-4
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,15 @@ handleClassPrepare(JNIEnv *env, EventInfo *evinfo,
7878

7979
/* HandlerFunction - Invoked from event_callback() */
8080
static void
81-
handleGarbageCollectionFinish(JNIEnv *env, EventInfo *evinfo,
81+
handleClassUnload(JNIEnv *env, EventInfo *evinfo,
8282
HandlerNode *node,
8383
struct bag *eventBag)
8484
{
85-
JDI_ASSERT_MSG(JNI_FALSE, "Should never call handleGarbageCollectionFinish");
85+
/*
86+
* CLASS_UNLOAD events are synthesized by the class tracking code, so
87+
* we should never have this handler called.
88+
*/
89+
JDI_ASSERT_MSG(JNI_FALSE, "Should never call handleClassUnload");
8690
}
8791

8892
/* HandlerFunction - Invoked from event_callback() for METHOD_ENTRY and METHOD_EXIT. */
@@ -162,8 +166,8 @@ standardHandlers_defaultHandler(EventIndex ei)
162166
case EI_CLASS_PREPARE:
163167
return &handleClassPrepare;
164168

165-
case EI_GC_FINISH:
166-
return &handleGarbageCollectionFinish;
169+
case EI_CLASS_UNLOAD:
170+
return &handleClassUnload;
167171

168172
case EI_METHOD_ENTRY:
169173
case EI_METHOD_EXIT:

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

+21-15
Original file line numberDiff line numberDiff line change
@@ -1935,7 +1935,7 @@ eventIndexInit(void)
19351935
index2jvmti[EI_THREAD_START -EI_min] = JVMTI_EVENT_THREAD_START;
19361936
index2jvmti[EI_THREAD_END -EI_min] = JVMTI_EVENT_THREAD_END;
19371937
index2jvmti[EI_CLASS_PREPARE -EI_min] = JVMTI_EVENT_CLASS_PREPARE;
1938-
index2jvmti[EI_GC_FINISH -EI_min] = JVMTI_EVENT_GARBAGE_COLLECTION_FINISH;
1938+
index2jvmti[EI_CLASS_UNLOAD -EI_min] = 0; // No mapping to JVMTI event
19391939
index2jvmti[EI_CLASS_LOAD -EI_min] = JVMTI_EVENT_CLASS_LOAD;
19401940
index2jvmti[EI_FIELD_ACCESS -EI_min] = JVMTI_EVENT_FIELD_ACCESS;
19411941
index2jvmti[EI_FIELD_MODIFICATION -EI_min] = JVMTI_EVENT_FIELD_MODIFICATION;
@@ -1958,7 +1958,7 @@ eventIndexInit(void)
19581958
index2jdwp[EI_THREAD_START -EI_min] = JDWP_EVENT(THREAD_START);
19591959
index2jdwp[EI_THREAD_END -EI_min] = JDWP_EVENT(THREAD_END);
19601960
index2jdwp[EI_CLASS_PREPARE -EI_min] = JDWP_EVENT(CLASS_PREPARE);
1961-
index2jdwp[EI_GC_FINISH -EI_min] = JDWP_EVENT(CLASS_UNLOAD);
1961+
index2jdwp[EI_CLASS_UNLOAD -EI_min] = JDWP_EVENT(CLASS_UNLOAD);
19621962
index2jdwp[EI_CLASS_LOAD -EI_min] = JDWP_EVENT(CLASS_LOAD);
19631963
index2jdwp[EI_FIELD_ACCESS -EI_min] = JDWP_EVENT(FIELD_ACCESS);
19641964
index2jdwp[EI_FIELD_MODIFICATION -EI_min] = JDWP_EVENT(FIELD_MODIFICATION);
@@ -1977,21 +1977,29 @@ eventIndexInit(void)
19771977
}
19781978

19791979
jdwpEvent
1980-
eventIndex2jdwp(EventIndex i)
1980+
eventIndex2jdwp(EventIndex ei)
19811981
{
1982-
if ( i < EI_min || i > EI_max ) {
1983-
EXIT_ERROR(AGENT_ERROR_INVALID_INDEX,"bad EventIndex");
1982+
jdwpEvent event = 0;
1983+
if (ei >= EI_min && ei <= EI_max) {
1984+
event = index2jdwp[ei - EI_min];
19841985
}
1985-
return index2jdwp[i-EI_min];
1986+
if (event == 0) {
1987+
EXIT_ERROR(AGENT_ERROR_INVALID_INDEX, "bad EventIndex");
1988+
}
1989+
return event;
19861990
}
19871991

19881992
jvmtiEvent
1989-
eventIndex2jvmti(EventIndex i)
1993+
eventIndex2jvmti(EventIndex ei)
19901994
{
1991-
if ( i < EI_min || i > EI_max ) {
1992-
EXIT_ERROR(AGENT_ERROR_INVALID_INDEX,"bad EventIndex");
1995+
jvmtiEvent event = 0;
1996+
if (ei >= EI_min && ei <= EI_max) {
1997+
event = index2jvmti[ei - EI_min];
1998+
}
1999+
if (event == 0) {
2000+
EXIT_ERROR(AGENT_ERROR_INVALID_INDEX, "bad EventIndex");
19932001
}
1994-
return index2jvmti[i-EI_min];
2002+
return event;
19952003
}
19962004

19972005
#ifdef DEBUG
@@ -2014,8 +2022,8 @@ eventIndex2EventName(EventIndex ei)
20142022
return "EI_THREAD_END";
20152023
case EI_CLASS_PREPARE:
20162024
return "EI_CLASS_PREPARE";
2017-
case EI_GC_FINISH:
2018-
return "EI_GC_FINISH";
2025+
case EI_CLASS_UNLOAD:
2026+
return "EI_CLASS_UNLOAD";
20192027
case EI_CLASS_LOAD:
20202028
return "EI_CLASS_LOAD";
20212029
case EI_FIELD_ACCESS:
@@ -2071,7 +2079,7 @@ jdwp2EventIndex(jdwpEvent eventType)
20712079
case JDWP_EVENT(CLASS_PREPARE):
20722080
return EI_CLASS_PREPARE;
20732081
case JDWP_EVENT(CLASS_UNLOAD):
2074-
return EI_GC_FINISH;
2082+
return EI_CLASS_UNLOAD;
20752083
case JDWP_EVENT(CLASS_LOAD):
20762084
return EI_CLASS_LOAD;
20772085
case JDWP_EVENT(FIELD_ACCESS):
@@ -2127,8 +2135,6 @@ jvmti2EventIndex(jvmtiEvent kind)
21272135
return EI_THREAD_END;
21282136
case JVMTI_EVENT_CLASS_PREPARE:
21292137
return EI_CLASS_PREPARE;
2130-
case JVMTI_EVENT_GARBAGE_COLLECTION_FINISH:
2131-
return EI_GC_FINISH;
21322138
case JVMTI_EVENT_CLASS_LOAD:
21332139
return EI_CLASS_LOAD;
21342140
case JVMTI_EVENT_FIELD_ACCESS:

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ typedef enum {
161161
EI_THREAD_START = 5,
162162
EI_THREAD_END = 6,
163163
EI_CLASS_PREPARE = 7,
164-
EI_GC_FINISH = 8,
164+
EI_CLASS_UNLOAD = 8,
165165
EI_CLASS_LOAD = 9,
166166
EI_FIELD_ACCESS = 10,
167167
EI_FIELD_MODIFICATION = 11,

0 commit comments

Comments
 (0)