src/jdk.jfr/share/classes/jdk/jfr/internal/Options.java
changeset 50113 caf115bb98ad
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/Options.java	Tue May 15 20:24:34 2018 +0200
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2016, 2018, 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;
+
+import jdk.jfr.internal.SecuritySupport.SafePath;
+import jdk.internal.misc.Unsafe;
+
+/**
+ * Options that control Flight Recorder.
+ *
+ * Can be set using JFR.configure
+ *
+ */
+public final class Options {
+
+    private final static JVM jvm = JVM.getJVM();
+    private final static long WAIT_INTERVAL = 1000; // ms;
+
+    private final static long MIN_MAX_CHUNKSIZE = 1024 * 1024;
+
+    private static final long DEFAULT_GLOBAL_BUFFER_COUNT = 20;
+    private static final long DEFAULT_GLOBAL_BUFFER_SIZE = 524288;
+    private static final long DEFAULT_MEMORY_SIZE = DEFAULT_GLOBAL_BUFFER_COUNT * DEFAULT_GLOBAL_BUFFER_SIZE;
+    private static long DEFAULT_THREAD_BUFFER_SIZE;
+    private static final int DEFAULT_STACK_DEPTH = 64;
+    private static final boolean DEFAULT_SAMPLE_THREADS = true;
+    private static final long DEFAULT_MAX_CHUNK_SIZE = 12 * 1024 * 1024;
+    private static final SafePath DEFAULT_DUMP_PATH = SecuritySupport.USER_HOME;
+
+    private static long memorySize;
+    private static long globalBufferSize;
+    private static long globalBufferCount;
+    private static long threadBufferSize;
+    private static int stackDepth;
+    private static boolean sampleThreads;
+    private static long maxChunkSize;
+    private static SafePath dumpPath;
+
+    static {
+        final long pageSize = Unsafe.getUnsafe().pageSize();
+        DEFAULT_THREAD_BUFFER_SIZE = pageSize > 8 * 1024 ? pageSize : 8 * 1024;
+        reset();
+    }
+
+    public static synchronized void setMaxChunkSize(long max) {
+        if (max < MIN_MAX_CHUNKSIZE) {
+            throw new IllegalArgumentException("Max chunk size must be at least " + MIN_MAX_CHUNKSIZE);
+        }
+        jvm.setFileNotification(max);
+        maxChunkSize = max;
+    }
+
+    public static synchronized long getMaxChunkSize() {
+        return maxChunkSize;
+    }
+
+    public static synchronized void setMemorySize(long memSize) {
+        jvm.setMemorySize(memSize);
+        memorySize = memSize;
+    }
+
+    public static synchronized long getMemorySize() {
+        return memorySize;
+    }
+
+    public static synchronized void setThreadBufferSize(long threadBufSize) {
+        jvm.setThreadBufferSize(threadBufSize);
+        threadBufferSize = threadBufSize;
+    }
+
+    public static synchronized long getThreadBufferSize() {
+        return threadBufferSize;
+    }
+
+    public static synchronized long getGlobalBufferSize() {
+        return globalBufferSize;
+    }
+
+    public static synchronized void setGlobalBufferCount(long globalBufCount) {
+        jvm.setGlobalBufferCount(globalBufCount);
+        globalBufferCount = globalBufCount;
+    }
+
+    public static synchronized long getGlobalBufferCount() {
+        return globalBufferCount;
+    }
+
+    public static synchronized void setGlobalBufferSize(long globalBufsize) {
+        jvm.setGlobalBufferSize(globalBufsize);
+        globalBufferSize = globalBufsize;
+    }
+
+    public static synchronized void setDumpPath(SafePath path) {
+        dumpPath = path;
+    }
+
+    public static synchronized SafePath getDumpPath() {
+        return dumpPath;
+    }
+
+    public static synchronized void setStackDepth(Integer stackTraceDepth) {
+        jvm.setStackDepth(stackTraceDepth);
+        stackDepth = stackTraceDepth;
+    }
+
+    public static synchronized int getStackDepth() {
+        return stackDepth;
+    }
+
+    public static synchronized void setSampleThreads(Boolean sample) {
+        jvm.setSampleThreads(sample);
+        sampleThreads = sample;
+    }
+
+    public static synchronized boolean getSampleThreads() {
+        return sampleThreads;
+    }
+
+    private static synchronized void reset() {
+        setMaxChunkSize(DEFAULT_MAX_CHUNK_SIZE);
+        setMemorySize(DEFAULT_MEMORY_SIZE);
+        setGlobalBufferSize(DEFAULT_GLOBAL_BUFFER_SIZE);
+        setGlobalBufferCount(DEFAULT_GLOBAL_BUFFER_COUNT);
+        setDumpPath(DEFAULT_DUMP_PATH);
+        setSampleThreads(DEFAULT_SAMPLE_THREADS);
+        setStackDepth(DEFAULT_STACK_DEPTH);
+        setThreadBufferSize(DEFAULT_THREAD_BUFFER_SIZE);
+    }
+
+    static synchronized long getWaitInterval() {
+        return WAIT_INTERVAL;
+    }
+
+    static void ensureInitialized() {
+        // trigger clinit which will setup JVM defaults.
+    }
+
+
+}