changeset 60097:143e258f64af jdk-16+5

8248016: JFR: Remove Javadoc warnings Reviewed-by: mgronlun
author egahlin
date Wed, 08 Jul 2020 17:37:27 +0200
parents b8bbebdc23c7
children 85ca8aa01a9a
files src/jdk.jfr/share/classes/jdk/jfr/EventType.java src/jdk.jfr/share/classes/jdk/jfr/FlightRecorderPermission.java src/jdk.jfr/share/classes/jdk/jfr/SettingControl.java src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedEvent.java src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java src/jdk.jfr/share/classes/jdk/jfr/internal/Control.java src/jdk.jfr/share/classes/jdk/jfr/internal/EventControl.java src/jdk.jfr/share/classes/jdk/jfr/internal/EventInstrumentation.java src/jdk.jfr/share/classes/jdk/jfr/internal/PrivateAccess.java src/jdk.jfr/share/classes/jdk/jfr/internal/TypeLibrary.java src/jdk.jfr/share/classes/jdk/jfr/internal/Utils.java src/jdk.jfr/share/classes/jdk/jfr/internal/settings/CutoffSetting.java src/jdk.jfr/share/classes/jdk/jfr/internal/settings/EnabledSetting.java src/jdk.jfr/share/classes/jdk/jfr/internal/settings/JDKSettingControl.java src/jdk.jfr/share/classes/jdk/jfr/internal/settings/PeriodSetting.java src/jdk.jfr/share/classes/jdk/jfr/internal/settings/StackTraceSetting.java src/jdk.jfr/share/classes/jdk/jfr/internal/settings/ThresholdSetting.java
diffstat 17 files changed, 130 insertions(+), 113 deletions(-) [+]
line wrap: on
line diff
--- a/src/jdk.jfr/share/classes/jdk/jfr/EventType.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/EventType.java	Wed Jul 08 17:37:27 2020 +0200
@@ -67,6 +67,8 @@
      * Returns the field with the specified name, or {@code null} if it doesn't
      * exist.
      *
+     * @param name of the field to get, not {@code null}
+     *
      * @return a value descriptor that describes the field, or {@code null} if
      *         the field with the specified name doesn't exist
      */
--- a/src/jdk.jfr/share/classes/jdk/jfr/FlightRecorderPermission.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/FlightRecorderPermission.java	Wed Jul 08 17:37:27 2020 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2020, 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,6 +25,7 @@
 
 package jdk.jfr;
 
+import java.security.AccessControlContext;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -191,6 +192,11 @@
         public PlatformRecorder getPlatformRecorder() {
             return FlightRecorder.getFlightRecorder().getInternal();
         }
+
+        @Override
+        public AccessControlContext getContext(SettingControl settingControl) {
+            return settingControl.getContext();
+        }
     }
 
     /**
--- a/src/jdk.jfr/share/classes/jdk/jfr/SettingControl.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/SettingControl.java	Wed Jul 08 17:37:27 2020 +0200
@@ -25,10 +25,11 @@
 
 package jdk.jfr;
 
+import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.util.Set;
 
-import jdk.jfr.internal.Control;
+import jdk.jfr.internal.settings.JDKSettingControl;
 
 /**
  * Base class to extend to create setting controls.
@@ -139,14 +140,29 @@
  * @since 9
  */
 @MetadataDefinition
-public abstract class SettingControl extends Control {
+public abstract class SettingControl {
+
+    private final AccessControlContext context;
+    private final boolean initialized;
 
     /**
      * Constructor for invocation by subclass constructors.
      */
     protected SettingControl() {
-        super(AccessController.getContext());
+        context = this instanceof JDKSettingControl ? null : AccessController.getContext();
+        initialized = true;
+    }
 
+    final AccessControlContext getContext() {
+        // Ensure object state is safe
+        if (!initialized) {
+            throw new InternalError("Object must be initialized before security context can be retrieved");
+        }
+        AccessControlContext c = this.context;
+        if (c == null && !(this instanceof JDKSettingControl)) {
+            throw new InternalError("Security context can only be null for trusted setting controls");
+        }
+        return c;
     }
 
     /**
@@ -181,7 +197,6 @@
      *
      * @return the value to use, not {@code null}
      */
-    @Override
     public abstract String combine(Set<String> settingValues);
 
     /**
@@ -192,7 +207,6 @@
      *
      * @param settingValue the string value, not {@code null}
      */
-    @Override
     public abstract void setValue(String settingValue);
 
     /**
@@ -208,6 +222,5 @@
      *
      * @return the setting value, not {@code null}
      */
-    @Override
     public abstract String getValue();
 }
--- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedEvent.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedEvent.java	Wed Jul 08 17:37:27 2020 +0200
@@ -120,7 +120,7 @@
         return objectContext.fields;
     }
 
-    protected final Object objectAt(int index) {
+    final Object objectAt(int index) {
         if (index == 0) {
             return startTimeTicks;
         }
--- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java	Wed Jul 08 17:37:27 2020 +0200
@@ -254,7 +254,7 @@
         return t;
     }
 
-    protected Object objectAt(int index) {
+    Object objectAt(int index) {
         return objects[index];
     }
 
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/Control.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/Control.java	Wed Jul 08 17:37:27 2020 +0200
@@ -25,9 +25,6 @@
 
 package jdk.jfr.internal;
 
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
 import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
@@ -36,61 +33,44 @@
 import java.util.Objects;
 import java.util.Set;
 
-// User must never be able to subclass directly.
-//
-// Never put Control or Setting Control in a collections
-// so overridable versions of hashCode or equals are
-// executed in the wrong context. TODO: wrap this class
-// in SsecureControl directly when it is instantiated and
-// forward calls using AccessControlContext
-abstract public class Control {
+import jdk.jfr.SettingControl;
+import jdk.jfr.internal.settings.JDKSettingControl;
+
+public final class Control {
     private final AccessControlContext context;
     private final static int CACHE_SIZE = 5;
     private final Set<?>[] cachedUnions = new HashSet<?>[CACHE_SIZE];
     private final String[] cachedValues = new String[CACHE_SIZE];
+    private final SettingControl delegate;
     private String defaultValue;
     private String lastValue;
 
     // called by exposed subclass in external API
-    public Control(AccessControlContext acc) {
-        Objects.requireNonNull(acc);
-        this.context = acc;
-
+    public Control(SettingControl delegate, String defaultValue) {
+        this.context = PrivateAccess.getInstance().getContext(delegate);
+        this.delegate = delegate;
+        this.defaultValue = defaultValue;
+        if (this.context == null && !(delegate instanceof JDKSettingControl)) {
+            throw new InternalError("Security context can only be null for trusted setting controls");
+        }
     }
 
-    // only to be called by trusted VM code
-    public Control(String defaultValue) {
-        this.defaultValue = defaultValue;
-        this.context = null;
+    boolean isType(Class<? extends SettingControl> clazz) {
+        return delegate.getClass() == clazz;
     }
 
-    // For user code to override, must never be called from jdk.jfr.internal
-    // for user defined settings
-    public abstract String combine(Set<String> values);
-
-    // For user code to override, must never be called from jdk.jfr.internal
-    // for user defined settings
-    public abstract void setValue(String value);
-
-    // For user code to override, must never be called from jdk.jfr.internal
-    // for user defined settings
-    public abstract String getValue();
-
-      // Package private, user code should not have access to this method
     final void apply(Set<String> values) {
-        setValueSafe(findCombineSafe(values));
+        setValue(findCombine(values));
     }
 
-    // Package private, user code should not have access to this method.
-    // Only called during event registration
     final void setDefault() {
         if (defaultValue == null) {
-            defaultValue = getValueSafe();
+            defaultValue = getValue();
         }
         apply(defaultValue);
     }
 
-    final String getValueSafe() {
+    public String getValue() {
         if (context == null) {
             // VM events requires no access control context
             return getValue();
@@ -99,7 +79,7 @@
                 @Override
                 public String run() {
                     try {
-                        return getValue();
+                        return delegate.getValue();
                     } catch (Throwable t) {
                         // Prevent malicious user to propagate exception callback in the wrong context
                         Logger.log(LogTag.JFR_SETTING, LogLevel.WARN, "Exception occurred when trying to get value for " + getClass());
@@ -114,14 +94,14 @@
         if (lastValue != null && Objects.equals(value, lastValue)) {
             return;
         }
-        setValueSafe(value);
+        setValue(value);
     }
 
-    final void setValueSafe(String value) {
+    public void setValue(String value) {
         if (context == null) {
             // VM events requires no access control context
             try {
-                setValue(value);
+                delegate.setValue(value);
             } catch (Throwable t) {
                 Logger.log(LogTag.JFR_SETTING, LogLevel.WARN, "Exception occurred when setting value \"" + value + "\" for " + getClass());
             }
@@ -130,7 +110,7 @@
                 @Override
                 public Void run() {
                     try {
-                        setValue(value);
+                        delegate.setValue(value);
                     } catch (Throwable t) {
                         // Prevent malicious user to propagate exception callback in the wrong context
                         Logger.log(LogTag.JFR_SETTING, LogLevel.WARN, "Exception occurred when setting value \"" + value + "\" for " + getClass());
@@ -143,16 +123,16 @@
     }
 
 
-    private String combineSafe(Set<String> values) {
+    public String combine(Set<String> values) {
         if (context == null) {
             // VM events requires no access control context
-            return combine(values);
+            return delegate.combine(values);
         }
         return AccessController.doPrivileged(new PrivilegedAction<String>() {
             @Override
             public String run() {
                 try {
-                    combine(Collections.unmodifiableSet(values));
+                    delegate.combine(Collections.unmodifiableSet(values));
                 } catch (Throwable t) {
                     // Prevent malicious user to propagate exception callback in the wrong context
                     Logger.log(LogTag.JFR_SETTING, LogLevel.WARN, "Exception occurred when combining " + values + " for " + getClass());
@@ -162,7 +142,7 @@
         }, context);
     }
 
-    private final String findCombineSafe(Set<String> values) {
+    private final String findCombine(Set<String> values) {
         if (values.size() == 1) {
             return values.iterator().next();
         }
@@ -171,7 +151,7 @@
                 return cachedValues[i];
             }
         }
-        String result = combineSafe(values);
+        String result = combine(values);
         for (int i = 0; i < CACHE_SIZE - 1; i++) {
             cachedUnions[i + 1] = cachedUnions[i];
             cachedValues[i + 1] = cachedValues[i];
@@ -181,29 +161,11 @@
         return result;
     }
 
-
-    // package private, user code should not have access to this method
     final String getDefaultValue() {
         return defaultValue;
     }
 
-    // package private, user code should not have access to this method
     final String getLastValue() {
         return lastValue;
     }
-
-    // Precaution to prevent a malicious user from instantiating instances
-    // of a control where the context has not been set up.
-    @Override
-    public final Object clone() throws java.lang.CloneNotSupportedException {
-        throw new CloneNotSupportedException();
-    }
-
-    private final void writeObject(ObjectOutputStream out) throws IOException {
-        throw new IOException("Object cannot be serialized");
-    }
-
-    private final void readObject(ObjectInputStream in) throws IOException {
-        throw new IOException("Class cannot be deserialized");
-    }
 }
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/EventControl.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/EventControl.java	Wed Jul 08 17:37:27 2020 +0200
@@ -167,9 +167,9 @@
             int index = settingInfos.size();
             SettingInfo si = new SettingInfo(FIELD_SETTING_PREFIX + index, index);
             si.settingControl = instantiateSettingControl(settingsClass);
-            Control c = si.settingControl;
+            Control c = new Control(si.settingControl, null);
             c.setDefault();
-            String defaultValue = c.getValueSafe();
+            String defaultValue = c.getValue();
             if (defaultValue != null) {
                 Type settingType = TypeLibrary.createType(settingsClass);
                 ArrayList<AnnotationElement> aes = new ArrayList<>();
@@ -180,7 +180,7 @@
                     }
                 }
                 aes.trimToSize();
-                addControl(settingName, si.settingControl);
+                addControl(settingName, c);
                 eventType.add(PrivateAccess.getInstance().newSettingDescriptor(settingType, settingName, defaultValue, aes));
                 settingInfos.add(si);
             }
@@ -205,7 +205,7 @@
         try {
             return (SettingControl) cc.newInstance();
         } catch (IllegalArgumentException | InvocationTargetException e) {
-            throw (Error) new InternalError("Could not instantiate setting for class " + settingControlClass.getName());
+            throw new InternalError("Could not instantiate setting for class " + settingControlClass.getName());
         }
     }
 
@@ -219,7 +219,7 @@
             def = Boolean.toString(enabled.value());
         }
         type.add(PrivateAccess.getInstance().newSettingDescriptor(TYPE_ENABLED, Enabled.NAME, def, Collections.emptyList()));
-        return new EnabledSetting(type, def);
+        return new Control(new EnabledSetting(type, def), def);
     }
 
     private static Control defineThreshold(PlatformEventType type) {
@@ -229,7 +229,7 @@
             def = threshold.value();
         }
         type.add(PrivateAccess.getInstance().newSettingDescriptor(TYPE_THRESHOLD, Threshold.NAME, def, Collections.emptyList()));
-        return new ThresholdSetting(type, def);
+        return new Control(new ThresholdSetting(type), def);
     }
 
     private static Control defineStackTrace(PlatformEventType type) {
@@ -239,7 +239,7 @@
             def = Boolean.toString(stackTrace.value());
         }
         type.add(PrivateAccess.getInstance().newSettingDescriptor(TYPE_STACK_TRACE, StackTrace.NAME, def, Collections.emptyList()));
-        return new StackTraceSetting(type, def);
+        return new Control(new StackTraceSetting(type, def), def);
     }
 
     private static Control defineCutoff(PlatformEventType type) {
@@ -249,7 +249,7 @@
             def = cutoff.value();
         }
         type.add(PrivateAccess.getInstance().newSettingDescriptor(TYPE_CUTOFF, Cutoff.NAME, def, Collections.emptyList()));
-        return new CutoffSetting(type, def);
+        return new Control(new CutoffSetting(type), def);
     }
 
 
@@ -260,13 +260,13 @@
             def = period.value();
         }
         type.add(PrivateAccess.getInstance().newSettingDescriptor(TYPE_PERIOD, PeriodSetting.NAME, def, Collections.emptyList()));
-        return new PeriodSetting(type, def);
+        return new Control(new PeriodSetting(type), def);
     }
 
     void disable() {
         for (NamedControl nc : namedControls) {
-            if (nc.control instanceof EnabledSetting) {
-                nc.control.setValueSafe("false");
+            if (nc.control.isType(EnabledSetting.class)) {
+                nc.control.setValue("false");
                 return;
             }
         }
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/EventInstrumentation.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/EventInstrumentation.java	Wed Jul 08 17:37:27 2020 +0200
@@ -64,7 +64,11 @@
         private String settingDescriptor;
         final String fieldName;
         final int index;
-        // Used when instantiating Setting
+
+        // The settingControl is passed to EventHandler where it is
+        // used to check enablement before calling commit
+        // Methods on settingControl must never be invoked
+        // directly by JFR, instead use jdk.jfr.internal.Control
         SettingControl settingControl;
 
         public SettingInfo(String fieldName, int index) {
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/PrivateAccess.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/PrivateAccess.java	Wed Jul 08 17:37:27 2020 +0200
@@ -25,6 +25,7 @@
 
 package jdk.jfr.internal;
 
+import java.security.AccessControlContext;
 import java.util.List;
 import java.util.Map;
 
@@ -33,6 +34,7 @@
 import jdk.jfr.EventType;
 import jdk.jfr.FlightRecorderPermission;
 import jdk.jfr.Recording;
+import jdk.jfr.SettingControl;
 import jdk.jfr.SettingDescriptor;
 import jdk.jfr.ValueDescriptor;
 
@@ -94,4 +96,6 @@
     public abstract boolean isUnsigned(ValueDescriptor v);
 
     public abstract PlatformRecorder getPlatformRecorder();
+
+    public abstract AccessControlContext getContext(SettingControl sc);
 }
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/TypeLibrary.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/TypeLibrary.java	Wed Jul 08 17:37:27 2020 +0200
@@ -53,6 +53,7 @@
 import jdk.jfr.Label;
 import jdk.jfr.MetadataDefinition;
 import jdk.jfr.Name;
+import jdk.jfr.SettingControl;
 import jdk.jfr.SettingDescriptor;
 import jdk.jfr.Timespan;
 import jdk.jfr.Timestamp;
@@ -246,7 +247,7 @@
             superType = Type.SUPER_TYPE_EVENT;
             eventType= true;
         }
-        if (Control.class.isAssignableFrom(clazz)) {
+        if (SettingControl.class.isAssignableFrom(clazz)) {
             superType = Type.SUPER_TYPE_SETTING;
         }
 
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/Utils.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/Utils.java	Wed Jul 08 17:37:27 2020 +0200
@@ -518,13 +518,13 @@
     }
 
     public static boolean isSettingVisible(Control c, boolean hasEventHook) {
-        if (c instanceof ThresholdSetting) {
+        if (c.isType(ThresholdSetting.class)) {
             return !hasEventHook;
         }
-        if (c instanceof PeriodSetting) {
+        if (c.isType(PeriodSetting.class)) {
             return hasEventHook;
         }
-        if (c instanceof StackTraceSetting) {
+        if (c.isType(StackTraceSetting.class)) {
             return !hasEventHook;
         }
         return true;
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/CutoffSetting.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/CutoffSetting.java	Wed Jul 08 17:37:27 2020 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2020, 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
@@ -33,7 +33,6 @@
 import jdk.jfr.MetadataDefinition;
 import jdk.jfr.Name;
 import jdk.jfr.Timespan;
-import jdk.jfr.internal.Control;
 import jdk.jfr.internal.PlatformEventType;
 import jdk.jfr.internal.Type;
 import jdk.jfr.internal.Utils;
@@ -43,14 +42,13 @@
 @Description("Limit running time of event")
 @Name(Type.SETTINGS_PREFIX + "Cutoff")
 @Timespan
-public final class CutoffSetting extends Control {
+public final class CutoffSetting extends JDKSettingControl {
     private final static long typeId = Type.getTypeId(CutoffSetting.class);
 
     private String value = "0 ns";
     private final PlatformEventType eventType;
 
-    public CutoffSetting(PlatformEventType eventType, String defaultValue) {
-       super(defaultValue);
+    public CutoffSetting(PlatformEventType eventType) {
        this.eventType = Objects.requireNonNull(eventType);
     }
 
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/EnabledSetting.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/EnabledSetting.java	Wed Jul 08 17:37:27 2020 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2020, 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
@@ -35,19 +35,17 @@
 import jdk.jfr.Name;
 import jdk.jfr.internal.PlatformEventType;
 import jdk.jfr.internal.Type;
-import jdk.jfr.internal.Control;
 
 @MetadataDefinition
 @Label("Enabled")
 @Description("Record event")
 @Name(Type.SETTINGS_PREFIX + "Enabled")
 @BooleanFlag
-public final class EnabledSetting extends Control {
+public final class EnabledSetting extends JDKSettingControl {
     private final BooleanValue booleanValue;
     private final PlatformEventType eventType;
 
     public EnabledSetting(PlatformEventType eventType, String defaultValue) {
-        super(defaultValue);
         this.booleanValue = BooleanValue.valueOf(defaultValue);
         this.eventType = Objects.requireNonNull(eventType);
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/JDKSettingControl.java	Wed Jul 08 17:37:27 2020 +0200
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2020, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.jfr.internal.settings;
+
+import jdk.jfr.SettingControl;
+
+/**
+ * SettingControls that derive from this class avoids executing settings
+ * modifications in a AccessController.doPrivilege(...) block.
+ */
+public abstract class JDKSettingControl extends SettingControl {
+}
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/PeriodSetting.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/PeriodSetting.java	Wed Jul 08 17:37:27 2020 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2020, 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
@@ -33,7 +33,6 @@
 import jdk.jfr.MetadataDefinition;
 import jdk.jfr.Name;
 import jdk.jfr.internal.PlatformEventType;
-import jdk.jfr.internal.Control;
 import jdk.jfr.internal.Type;
 import jdk.jfr.internal.Utils;
 
@@ -41,7 +40,7 @@
 @Label("Period")
 @Description("Record event at interval")
 @Name(Type.SETTINGS_PREFIX + "Period")
-public final class PeriodSetting extends Control {
+public final class PeriodSetting extends JDKSettingControl {
     private static final long typeId = Type.getTypeId(PeriodSetting.class);
 
     public static final String EVERY_CHUNK = "everyChunk";
@@ -51,8 +50,7 @@
     private final PlatformEventType eventType;
     private String value = EVERY_CHUNK;
 
-    public PeriodSetting(PlatformEventType eventType, String defaultValue) {
-        super(defaultValue);
+    public PeriodSetting(PlatformEventType eventType) {
         this.eventType = Objects.requireNonNull(eventType);
     }
 
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/StackTraceSetting.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/StackTraceSetting.java	Wed Jul 08 17:37:27 2020 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2020, 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
@@ -34,7 +34,6 @@
 import jdk.jfr.MetadataDefinition;
 import jdk.jfr.Name;
 import jdk.jfr.internal.PlatformEventType;
-import jdk.jfr.internal.Control;
 import jdk.jfr.internal.Type;
 
 @MetadataDefinition
@@ -42,13 +41,12 @@
 @Name(Type.SETTINGS_PREFIX + "StackTrace")
 @Description("Record stack traces")
 @BooleanFlag
-public final class StackTraceSetting extends Control {
+public final class StackTraceSetting extends JDKSettingControl {
     private final static long typeId =  Type.getTypeId(StackTraceSetting.class);
     private final BooleanValue booleanValue;
     private final PlatformEventType eventType;
 
     public StackTraceSetting(PlatformEventType eventType, String defaultValue) {
-        super(defaultValue);
         this.booleanValue = BooleanValue.valueOf(defaultValue);
         this.eventType = Objects.requireNonNull(eventType);
     }
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/ThresholdSetting.java	Wed Jul 08 03:08:30 2020 -0700
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/ThresholdSetting.java	Wed Jul 08 17:37:27 2020 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2020, 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
@@ -34,7 +34,6 @@
 import jdk.jfr.Name;
 import jdk.jfr.Timespan;
 import jdk.jfr.internal.PlatformEventType;
-import jdk.jfr.internal.Control;
 import jdk.jfr.internal.Type;
 import jdk.jfr.internal.Utils;
 @MetadataDefinition
@@ -42,13 +41,12 @@
 @Name(Type.SETTINGS_PREFIX + "Threshold")
 @Description("Record event with duration above or equal to threshold")
 @Timespan
-public final class ThresholdSetting extends Control {
+public final class ThresholdSetting extends JDKSettingControl {
     private final static long typeId = Type.getTypeId(ThresholdSetting.class);
     private String value = "0 ns";
     private final PlatformEventType eventType;
 
-    public ThresholdSetting(PlatformEventType eventType, String defaultValue) {
-       super(defaultValue);
+    public ThresholdSetting(PlatformEventType eventType) {
        this.eventType = Objects.requireNonNull(eventType);
     }