From c8a95a763c169b94c5ba07d2c6fbdf99ba3b9e3b Mon Sep 17 00:00:00 2001 From: Chris Plummer Date: Mon, 15 Jul 2024 20:26:52 +0000 Subject: [PATCH] 8072701: resume001 failed due to ERROR: timeout for waiting for a BreakpintEvent Reviewed-by: amenkov, kevinw, sspitsyn --- .../jdi/ThreadReference/resume/resume001.java | 30 ++++++++++++++----- .../ThreadReference/resume/resume001a.java | 10 +++++-- .../vmTestbase/nsk/share/jdi/Debugee.java | 6 ++-- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/resume/resume001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/resume/resume001.java index c98248eeb51..c7dd827a569 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/resume/resume001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/resume/resume001.java @@ -117,6 +117,7 @@ public class resume001 { static int waitTime; static VirtualMachine vm = null; + static Debugee debuggee = null; static EventRequestManager eventRManager = null; static EventQueue eventQueue = null; static EventSet eventSet = null; @@ -137,8 +138,6 @@ public class resume001 { private int runThis (String argv[], PrintStream out) { - Debugee debuggee; - argsHandler = new ArgumentHandler(argv); logHandler = new Log(out, argsHandler); Binder binder = new Binder(argsHandler, logHandler); @@ -336,13 +335,23 @@ public class resume001 { break label1; log2(" thread2 is at breakpoint"); - log2("......checking up that thread2.resume() resumes thread2 suspended with VirtualMachine.suspend()"); log2(" enabling breakpRequest3"); breakpRequest3.enable(); + + // don't do vm.suspend() until mainThread is waiting + line = pipe.readln(); + if (line.equals("waiting")) { + log2(" : returned string is 'waiting'"); + } else { + log3("ERROR: returned string is not 'waiting': " + line); + expresult = returnCode4; + break label1; + } log2(" suspending the thread2 with vm.suspend()"); vm.suspend(); + log2(" first resuming the thread2 with eventSet.resume()"); eventSet.resume(); log2(" checking up thread's state"); @@ -361,13 +370,17 @@ public class resume001 { break label1; log2(" thread2 is at breakpoint"); - - log2(" resuming the thread2"); + log2(" resuming the thread2"); thread2.resume(); + log2(" undo the vm.suspend() with vm.resume()"); + vm.resume(); + } + // These are only needed if we break out of the loop due to an error + if (expresult != returnCode0) { + vm.resume(); + vm.resume(); // for case error when both VirtualMachine and the thread2 were suspended } - vm.resume(); - vm.resume(); // for case error when both VirtualMachine and the thread2 were suspended //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ log2(" the end of testing"); @@ -487,7 +500,8 @@ public class resume001 { try { eventSet = eventQueue.remove(waitTime*60000); if (eventSet == null) { - log3("ERROR: timeout for waiting for a BreakpintEvent"); + log3("ERROR: timeout for waiting for a BreakpointEvent"); + debuggee.printThreadsInfo(vm); returnCode = returnCode3; break labelBP; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/resume/resume001a.java b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/resume/resume001a.java index 7d52f788e2a..7efc2dd7c01 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/resume/resume001a.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/ThreadReference/resume/resume001a.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2024, 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 @@ -81,7 +81,13 @@ public class resume001a { String instruction; - log1("waiting for an instruction from the debugger ..."); + log1("waiting for an instruction from the debugger: iteration " + i); + if (i == 1) { + // Let the debugger know we finished the first iteration and are now + // waiting for next command. This is needed so we don't suspend the + // main thread while it is doing a log(), which can hold a needed lock. + pipe.println("waiting"); + } instruction = pipe.readln(); if (instruction.equals("quit")) { log1("'quit' recieved"); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java index 6b4f65bc625..732a7a6696b 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java @@ -595,9 +595,9 @@ public class Debugee extends DebugeeProcess { /* * Print information about all threads in debuggee VM */ - protected void printThreadsInfo(VirtualMachine vm) { + public void printThreadsInfo(VirtualMachine vm) { try { - log.display("------------ Try to print debuggee threads before killing process ------------"); + log.display("------------ Print debuggee threads ------------"); if (vm == null) { log.display("Can't print threads info because 'vm' is null"); return; @@ -631,7 +631,7 @@ public class Debugee extends DebugeeProcess { } } } - log.display("----------------------------------------------------------------------"); + log.display("------------------------------------------------"); } catch (Throwable t) { log.complain(""); t.printStackTrace(log.getOutStream());