From b0cff6b528af7a2de453dd05d1c9ecbe7e00dc20 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 11 Sep 2024 20:02:49 +0000 Subject: [PATCH] 8299419: Thread.sleep(millis) may throw OOME Reviewed-by: alanb --- src/java.base/share/classes/java/lang/Thread.java | 15 ++++++++------- .../jdk/internal/event/ThreadSleepEvent.java | 9 --------- .../nsk/monitoring/share/ThreadController.java | 1 - .../monitoring/share/thread/SleepingThread.java | 1 - .../nsk/monitoring/stress/thread/strace001.java | 1 - 5 files changed, 8 insertions(+), 19 deletions(-) diff --git a/src/java.base/share/classes/java/lang/Thread.java b/src/java.base/share/classes/java/lang/Thread.java index 4dac486bee4..07b3c7c9bd2 100644 --- a/src/java.base/share/classes/java/lang/Thread.java +++ b/src/java.base/share/classes/java/lang/Thread.java @@ -457,19 +457,20 @@ public class Thread implements Runnable { * Called before sleeping to create a jdk.ThreadSleep event. */ private static ThreadSleepEvent beforeSleep(long nanos) { - ThreadSleepEvent event = null; - if (ThreadSleepEvent.isTurnedOn()) { - try { - event = new ThreadSleepEvent(); + try { + ThreadSleepEvent event = new ThreadSleepEvent(); + if (event.isEnabled()) { event.time = nanos; event.begin(); - } catch (OutOfMemoryError e) { - event = null; + return event; } + } catch (OutOfMemoryError e) { + // ignore } - return event; + return null; } + /** * Called after sleeping to commit the jdk.ThreadSleep event. */ diff --git a/src/java.base/share/classes/jdk/internal/event/ThreadSleepEvent.java b/src/java.base/share/classes/jdk/internal/event/ThreadSleepEvent.java index ab9b377c0f3..283ba425977 100644 --- a/src/java.base/share/classes/jdk/internal/event/ThreadSleepEvent.java +++ b/src/java.base/share/classes/jdk/internal/event/ThreadSleepEvent.java @@ -30,14 +30,5 @@ package jdk.internal.event; */ public final class ThreadSleepEvent extends Event { - private static final ThreadSleepEvent EVENT = new ThreadSleepEvent(); - - /** - * Returns {@code true} if event is enabled, {@code false} otherwise. - */ - public static boolean isTurnedOn() { - return EVENT.isEnabled(); - } - public long time; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/monitoring/share/ThreadController.java b/test/hotspot/jtreg/vmTestbase/nsk/monitoring/share/ThreadController.java index 871b6d26aff..ea15f3d0d35 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/monitoring/share/ThreadController.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/monitoring/share/ThreadController.java @@ -665,7 +665,6 @@ class SleepingThread extends BaseThread { // jdk.internal.event.ThreadSleepEvent not accessible expectedMethods.add("jdk.internal.event.ThreadSleepEvent."); expectedMethods.add("jdk.internal.event.ThreadSleepEvent.isEnabled"); - expectedMethods.add("jdk.internal.event.ThreadSleepEvent.isTurnedOn"); expectedMethods.add(SleepingThread.class.getName() + ".run"); switch (controller.invocationType) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/monitoring/share/thread/SleepingThread.java b/test/hotspot/jtreg/vmTestbase/nsk/monitoring/share/thread/SleepingThread.java index f23c16cd047..ed2a1a60c50 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/monitoring/share/thread/SleepingThread.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/monitoring/share/thread/SleepingThread.java @@ -42,7 +42,6 @@ public class SleepingThread extends RecursiveMonitoringThread { "java.lang.Thread.afterSleep", "java.util.concurrent.TimeUnit.toNanos", "jdk.internal.event.ThreadSleepEvent.", - "jdk.internal.event.ThreadSleepEvent.isTurnedOn", "jdk.internal.event.ThreadSleepEvent.isEnabled", "nsk.monitoring.share.thread.SleepingThread.runInside" }; diff --git a/test/hotspot/jtreg/vmTestbase/nsk/monitoring/stress/thread/strace001.java b/test/hotspot/jtreg/vmTestbase/nsk/monitoring/stress/thread/strace001.java index 632cebae8f8..03d2066cf32 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/monitoring/stress/thread/strace001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/monitoring/stress/thread/strace001.java @@ -151,7 +151,6 @@ public class strace001 { "java.util.concurrent.TimeUnit.toNanos", "jdk.internal.event.ThreadSleepEvent.", "jdk.internal.event.ThreadSleepEvent.", - "jdk.internal.event.ThreadSleepEvent.isTurnedOn", "jdk.internal.event.ThreadSleepEvent.isEnabled" };