diff --git a/src/jdk.jfr/share/classes/jdk/jfr/Recording.java b/src/jdk.jfr/share/classes/jdk/jfr/Recording.java index 466654180eb..f4b20aeec03 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/Recording.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/Recording.java @@ -222,7 +222,7 @@ public final class Recording implements Closeable { * @return recording settings, not {@code null} */ public Map getSettings() { - return new HashMap<>(internal.getSettings()); + return internal.getSettingsCopy(); } /** diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java index 21079fab3a9..d3765af8e6c 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2026, 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 @@ -25,7 +25,6 @@ package jdk.jfr.internal; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -92,7 +91,7 @@ public final class OldObjectSample { } public static Map createSettingsForSnapshot(PlatformRecording recording, Boolean pathToGcRoots) { - Map settings = new HashMap<>(recording.getSettings()); + Map settings = recording.getSettingsCopy(); updateSettingPathToGcRoots(settings, pathToGcRoots); return settings; } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java index a82eff239e6..4779b8e0125 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java @@ -585,7 +585,7 @@ public final class PlatformRecorder { boolean register = !isDestroyed() && r.getState() != RecordingState.CLOSED; Recording newRec = access.newRecording(register); PlatformRecording copy = access.getPlatformRecording(newRec); - copy.setSettings(r.getSettings()); + copy.setSettings(r.getSettingsCopy()); copy.setMaxAge(r.getMaxAge()); copy.setMaxSize(r.getMaxSize()); copy.setDumpOnExit(r.getDumpOnExit()); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecording.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecording.java index 92d60f5bdec..407e353b051 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecording.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecording.java @@ -253,9 +253,14 @@ public final class PlatformRecording implements AutoCloseable { } } - public Map getSettings() { + Map getSettings() { + assert Thread.holdsLock(recorder) : "Must have recorder lock when accessing recorder.settings"; + return settings; + } + + public Map getSettingsCopy() { synchronized (recorder) { - return settings; + return new LinkedHashMap<>(settings); } } @@ -371,7 +376,7 @@ public final class PlatformRecording implements AutoCloseable { clone.setStartTime(getStartTime()); } if (pathToGcRoots == null) { - clone.setSettings(getSettings()); // needed for old object sample + clone.setSettings(getSettingsCopy()); // needed for old object sample clone.stop(reason); // dumps to destination path here } else { // Risk of violating lock order here, since