Skip to content

Commit 5a8629d

Browse files
committed
[GR-67858] Clear field breakpoints on detach.
PullRequest: graal/21811
2 parents b155529 + 42acd82 commit 5a8629d

File tree

5 files changed

+33
-6
lines changed

5 files changed

+33
-6
lines changed

espresso/src/com.oracle.truffle.espresso.jdwp/src/com/oracle/truffle/espresso/jdwp/api/VMEventListener.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.oracle.truffle.espresso.jdwp.impl.BreakpointInfo;
2626
import com.oracle.truffle.espresso.jdwp.impl.ClassPrepareRequest;
2727
import com.oracle.truffle.espresso.jdwp.impl.FieldBreakpointEvent;
28+
import com.oracle.truffle.espresso.jdwp.impl.FieldBreakpointInfo;
2829
import com.oracle.truffle.espresso.jdwp.impl.MethodBreakpointEvent;
2930
import com.oracle.truffle.espresso.jdwp.impl.RequestFilter;
3031
import com.oracle.truffle.espresso.jdwp.impl.SocketConnection;
@@ -57,6 +58,10 @@ public interface VMEventListener extends VMListener {
5758

5859
void removeBreakpointRequest(int requestId);
5960

61+
void addFieldRequest(FieldBreakpointInfo info);
62+
63+
void removeFieldRequest(int requestId, FieldRef field);
64+
6065
void stepCompleted(SteppingInfo info, CallFrame currentFrame);
6166

6267
void exceptionThrown(BreakpointInfo info, Object currentThread, Object exception, CallFrame[] callFrames);

espresso/src/com.oracle.truffle.espresso.jdwp/src/com/oracle/truffle/espresso/jdwp/api/VMEventListenerImpl.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public final class VMEventListenerImpl implements VMEventListener {
6464
private final HashMap<Integer, RequestFilter> monitorContendedEnteredRequests = new HashMap<>();
6565
private final HashMap<Integer, RequestFilter> monitorWaitRequests = new HashMap<>();
6666
private final HashMap<Integer, RequestFilter> monitorWaitedRequests = new HashMap<>();
67+
private final HashMap<Integer, FieldRef> fieldRequests = new HashMap<>();
6768

6869
// The connection field is null only until the connection is established. Thus, we need
6970
// to guard any attempted usage prior to that, e.g. vm dies event.
@@ -108,6 +109,7 @@ public void onDetach() {
108109
monitorContendedEnteredRequests.clear();
109110
monitorWaitedRequests.clear();
110111
monitorWaitRequests.clear();
112+
removeFieldRequests();
111113

112114
/*
113115
* We don't null the connection field here, since there's a race condition between preparing
@@ -160,6 +162,26 @@ public void clearAllBreakpointRequests() {
160162
breakpointRequests.clear();
161163
}
162164

165+
@Override
166+
public void addFieldRequest(FieldBreakpointInfo info) {
167+
FieldRef field = info.getField();
168+
field.addFieldBreakpointInfo(info);
169+
fieldRequests.put(info.getRequestId(), field);
170+
}
171+
172+
@Override
173+
public void removeFieldRequest(int requestId, FieldRef field) {
174+
field.removeFieldBreakpointInfo(requestId);
175+
fieldRequests.remove(requestId, field);
176+
}
177+
178+
private void removeFieldRequests() {
179+
for (Map.Entry<Integer, FieldRef> entry : fieldRequests.entrySet()) {
180+
entry.getValue().removeFieldBreakpointInfo(entry.getKey());
181+
}
182+
fieldRequests.clear();
183+
}
184+
163185
@Override
164186
@TruffleBoundary
165187
public boolean onFieldModification(FieldRef field, Node node, Object receiver, Object value) {

espresso/src/com.oracle.truffle.espresso.jdwp/src/com/oracle/truffle/espresso/jdwp/impl/DebuggerConnection.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ private void processPacket(Packet packet) {
630630
result = requestedJDWPEvents.clearRequest(packet);
631631
break;
632632
case JDWP.EventRequest.CLEAR_ALL_BREAKPOINTS.ID:
633-
result = requestedJDWPEvents.clearAllRequests(packet);
633+
result = requestedJDWPEvents.clearAllBreakpointRequests(packet);
634634
break;
635635
default:
636636
result = unknownCommand(packet, controller);

espresso/src/com.oracle.truffle.espresso.jdwp/src/com/oracle/truffle/espresso/jdwp/impl/FieldBreakpointInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,6 @@ public boolean isAccessBreakpoint() {
6666

6767
@Override
6868
public void dispose() {
69-
field.disposeFieldBreakpoint();
69+
field.removeFieldBreakpointInfo(getRequestId());
7070
}
7171
}

espresso/src/com.oracle.truffle.espresso.jdwp/src/com/oracle/truffle/espresso/jdwp/impl/RequestedJDWPEvents.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,15 +144,15 @@ public CommandResult registerEvent(Packet packet, Commands callback) {
144144
FieldBreakpointInfo fieldBreakpointInfo = (FieldBreakpointInfo) filter.getBreakpointInfo();
145145
fieldBreakpointInfo.addSuspendPolicy(suspendPolicy);
146146
fieldBreakpointInfo.setAccessBreakpoint();
147-
fieldBreakpointInfo.getField().addFieldBreakpointInfo(fieldBreakpointInfo);
147+
eventListener.addFieldRequest(fieldBreakpointInfo);
148148
String location = fieldBreakpointInfo.getKlass().getNameAsString() + "." + fieldBreakpointInfo.getField().getNameAsString();
149149
controller.fine(() -> "Submitting field access breakpoint: " + location);
150150
break;
151151
case FIELD_MODIFICATION:
152152
fieldBreakpointInfo = (FieldBreakpointInfo) filter.getBreakpointInfo();
153153
fieldBreakpointInfo.addSuspendPolicy(suspendPolicy);
154154
fieldBreakpointInfo.setModificationBreakpoint();
155-
fieldBreakpointInfo.getField().addFieldBreakpointInfo(fieldBreakpointInfo);
155+
eventListener.addFieldRequest(fieldBreakpointInfo);
156156
location = fieldBreakpointInfo.getKlass().getNameAsString() + "." + fieldBreakpointInfo.getField().getNameAsString();
157157
controller.fine(() -> "Submitting field modification breakpoint: " + location);
158158
break;
@@ -338,7 +338,7 @@ public CommandResult clearRequest(Packet packet) {
338338
case FIELD_ACCESS:
339339
case FIELD_MODIFICATION:
340340
FieldBreakpointInfo info = (FieldBreakpointInfo) requestFilter.getBreakpointInfo();
341-
info.getField().removeFieldBreakpointInfo(requestFilter.getRequestId());
341+
eventListener.removeFieldRequest(info.getRequestId(), info.getField());
342342
break;
343343
case CLASS_PREPARE:
344344
eventListener.removeClassPrepareRequest(requestFilter.getRequestId());
@@ -378,7 +378,7 @@ public CommandResult clearRequest(Packet packet) {
378378
return new CommandResult(reply);
379379
}
380380

381-
public CommandResult clearAllRequests(Packet packet) {
381+
public CommandResult clearAllBreakpointRequests(Packet packet) {
382382
PacketStream reply = new PacketStream().id(packet.id).replyPacket();
383383

384384
eventListener.clearAllBreakpointRequests();

0 commit comments

Comments
 (0)