diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/EventHandler.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/EventHandler.java index e9735a13767..2e1d665fe18 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/EventHandler.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/EventHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -117,6 +117,10 @@ public class EventHandler implements Runnable { log.display("EventHandler> " + str); } + private void complain(String str) { + log.complain("EventHandler> " + str); + } + // is EventHandler was interrupted private volatile boolean wasInterrupted; @@ -197,7 +201,7 @@ public class EventHandler implements Runnable { break; } - log.complain("Exception occured in eventHandler thread: " + e.getMessage()); + complain("Exception occured in eventHandler thread: " + e.getMessage()); e.printStackTrace(log.getOutStream()); synchronized(EventHandler.this) { // This will make the waiters such as waitForVMDisconnect @@ -258,7 +262,7 @@ public class EventHandler implements Runnable { addListener( new EventListener() { public boolean eventReceived(Event event) { - log.complain("EventHandler> Unexpected event: " + event.getClass().getName()); + complain("Unexpected event: " + event); unexpectedEventCaught = true; return true; } @@ -304,7 +308,7 @@ public class EventHandler implements Runnable { addListener( new EventListener() { public boolean eventReceived(Event event) { - if (event instanceof VMDisconnectEvent ) { + if (event instanceof VMDisconnectEvent) { display("receieved VMDisconnect"); synchronized(EventHandler.this) { vmDisconnected = true; @@ -320,22 +324,17 @@ public class EventHandler implements Runnable { ); /** - * This listener catches uncaught exceptions and print a message. + * This listener catches uncaught exceptions and prints a message. */ - addListener( new EventListener() { + addListener(new EventListener() { public boolean eventReceived(Event event) { boolean handled = false; - if (event instanceof ExceptionEvent && - defaultExceptionRequest != null && - defaultExceptionRequest.equals(event.request())) { - - if (EventFilters.filtered(event) == false) { - log.complain("EventHandler> Unexpected Debuggee Exception: " + - (ExceptionEvent)event); - defaultExceptionCaught = true; - } - + if (event instanceof ExceptionEvent + && defaultExceptionRequest != null + && defaultExceptionRequest.equals(event.request())) { + complain("Unexpected Debuggee Exception: " + event); + defaultExceptionCaught = true; handled = true; vm.resume(); } @@ -368,28 +367,41 @@ public class EventHandler implements Runnable { } } + private class EventNotification { + volatile Event event; + volatile EventSet set; + } /** - * Returns an event which is received for any of given requests. + * Returns an event which was received for one of the specified requests. */ - public Event waitForRequestedEvent( final EventRequest[] requests, - long timeout, - boolean shouldRemoveListeners) { - class EventNotification { - volatile Event event = null; - } + private EventNotification waitForRequestedEventCommon(final EventRequest[] requests, + long timeout, + boolean shouldRemoveListeners) { final EventNotification en = new EventNotification(); + /* + * This listener searches for an Event that matches one of the EventRequests. + */ EventListener listener = new EventListener() { + public void eventSetReceived(EventSet set) { + en.set = set; // Save for retrieval when eventReceived() is called. + } + public boolean eventReceived(Event event) { + EventSet set = en.set; + en.set = null; // We'll reset it below if the event matches a request. for (int i = 0; i < requests.length; i++) { EventRequest request = requests[i]; - if (!request.isEnabled()) + if (!request.isEnabled()) { continue; + } if (request.equals(event.request())) { - display("waitForRequestedEvent: Received event(" + event + ") for request(" + request + ")"); + display("waitForRequestedEventCommon: Received event(" + event + + ") for request(" + request + ")"); synchronized (EventHandler.this) { en.event = event; + en.set = set; EventHandler.this.notifyAll(); } return true; @@ -399,7 +411,7 @@ public class EventHandler implements Runnable { } }; if (shouldRemoveListeners) { - display("waitForRequestedEvent: enabling remove of listener " + listener); + display("waitForRequestedEventCommon: enabling remove of listener " + listener); listener.enableRemovingThisListener(); } for (int i = 0; i < requests.length; i++) { @@ -407,88 +419,24 @@ public class EventHandler implements Runnable { } addListener(listener); - try { - long timeToFinish = System.currentTimeMillis() + timeout; - long timeLeft = timeout; - synchronized (EventHandler.this) { - display("waitForRequestedEvent: vm.resume called"); - vm.resume(); - - while (!isDisconnected() && en.event == null && timeLeft > 0) { - EventHandler.this.wait(timeLeft); - timeLeft = timeToFinish - System.currentTimeMillis(); - } - } - } catch (InterruptedException e) { - return null; - } - if (shouldRemoveListeners && !isDisconnected()) { - for (int i = 0; i < requests.length; i++) { - requests[i].disable(); - } - } - if (en.event == null) { - throw new Failure("waitForRequestedEvent: no requested events have been received."); - } - return en.event; - } - - /** - * Returns an event set which is received for any of given requests. - */ - public EventSet waitForRequestedEventSet( final EventRequest[] requests, - long timeout, - boolean shouldRemoveListeners) { - class EventNotification { - volatile EventSet set = null; - } - final EventNotification en = new EventNotification(); - - EventListener listener = new EventListener() { + /* + * This listener logs each EventSet received. + */ + EventListener eventLogListener = new EventListener() { public void eventSetReceived(EventSet set) { - - EventIterator eventIterator = set.eventIterator(); - - while (eventIterator.hasNext()) { - - Event event = eventIterator.nextEvent(); - - for (int i = 0; i < requests.length; i++) { - EventRequest request = requests[i]; - if (!request.isEnabled()) - continue; - - if (request.equals(event.request())) { - display("waitForRequestedEventSet: Received event set for request: " + request); - synchronized (EventHandler.this) { - en.set = set; - EventHandler.this.notifyAll(); - } - return; - } - } - } - } - - public boolean eventReceived(Event event) { - return (en.set != null); + display("waitForRequestedEventCommon: Received event set: " + set); } }; + addListener(eventLogListener); - if (shouldRemoveListeners) { - display("waitForRequestedEventSet: enabling remove of listener " + listener); - listener.enableRemovingThisListener(); - } - for (int i = 0; i < requests.length; i++) { - requests[i].enable(); - } - addListener(listener); - + /* + * Wait until expected event is recieved. + */ try { long timeToFinish = System.currentTimeMillis() + timeout; long timeLeft = timeout; synchronized (EventHandler.this) { - display("waitForRequestedEventSet: vm.resume called"); + display("waitForRequestedEventCommon: vm.resume called"); vm.resume(); while (!isDisconnected() && en.set == null && timeLeft > 0) { @@ -504,6 +452,34 @@ public class EventHandler implements Runnable { requests[i].disable(); } } + removeListener(eventLogListener); + return en; + } + + /** + * Returns an event which was received for one of the specified requests. + */ + public Event waitForRequestedEvent(final EventRequest[] requests, + long timeout, + boolean shouldRemoveListeners) + { + EventNotification en = + waitForRequestedEventCommon(requests, timeout, shouldRemoveListeners); + if (en.event == null) { + throw new Failure("waitForRequestedEvent: no requested events have been received."); + } + return en.event; + } + + /** + * Returns an event set which was received for one of the specified requests. + */ + public EventSet waitForRequestedEventSet(final EventRequest[] requests, + long timeout, + boolean shouldRemoveListeners) + { + EventNotification en = + waitForRequestedEventCommon(requests, timeout, shouldRemoveListeners); if (en.set == null) { throw new Failure("waitForRequestedEventSet: no requested events have been received."); }