src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdConfigure.java
changeset 50113 caf115bb98ad
child 50745 a390cbb82d47
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdConfigure.java	Tue May 15 20:24:34 2018 +0200
@@ -0,0 +1,204 @@
+/*
+ * 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.dcmd;
+
+
+
+import jdk.jfr.internal.LogLevel;
+import jdk.jfr.internal.LogTag;
+import jdk.jfr.internal.Logger;
+import jdk.jfr.internal.Options;
+import jdk.jfr.internal.Repository;
+import jdk.jfr.internal.SecuritySupport.SafePath;
+
+/**
+ * JFR.configure - invoked from native
+ *
+ */
+//Instantiated by native
+final class DCmdConfigure extends AbstractDCmd {
+    /**
+     * Execute JFR.configure.
+     *
+     * @param repositoryPath the path
+     * @param dumpPath path to dump to on fatal error (oom)
+     * @param stackDepth depth of stack traces
+     * @param globalBufferCount number of global buffers
+     * @param globalBufferSize size of global buffers
+     * @param threadBufferSize size of thread buffer for events
+     * @param maxChunkSize threshold at which a new chunk is created in the disk repository
+     * @param sampleThreads if thread sampling should be enabled
+     *
+     * @return result
+
+     * @throws DCmdException
+     *             if the dump could not be completed
+     */
+    public String execute
+    (
+            String repositoryPath,
+            String dumpPath,
+            Integer stackDepth,
+            Long globalBufferCount,
+            Long globalBufferSize,
+            Long threadBufferSize,
+            Long memorySize,
+            Long maxChunkSize,
+            Boolean sampleThreads
+
+    ) throws DCmdException {
+        boolean updated = false;
+        if (repositoryPath != null) {
+            try {
+                SafePath s = new SafePath(repositoryPath);
+                Repository.getRepository().setBasePath(s);
+                Logger.log(LogTag.JFR, LogLevel.INFO, "Base repository path set to " + repositoryPath);
+            } catch (Exception e) {
+                throw new DCmdException("Could not use " + repositoryPath + " as repository. " + e.getMessage(), e);
+            }
+            printRepositoryPath();
+            updated = true;
+        }
+
+        if (dumpPath != null)  {
+            Options.setDumpPath(new SafePath(dumpPath));
+            Logger.log(LogTag.JFR, LogLevel.INFO, "Emergency dump path set to " + dumpPath);
+            printDumpPath();
+            updated = true;
+        }
+
+        if (stackDepth != null)  {
+            Options.setStackDepth(stackDepth);
+            Logger.log(LogTag.JFR, LogLevel.INFO, "Stack depth set to " + stackDepth);
+            printStackDepth();
+            updated = true;
+        }
+
+        if (globalBufferCount != null)  {
+            Options.setGlobalBufferCount(globalBufferCount);
+            Logger.log(LogTag.JFR, LogLevel.INFO, "Global buffer count set to " + globalBufferCount);
+            printGlobalBufferCount();
+            updated = true;
+        }
+
+        if (globalBufferSize != null)  {
+            Options.setGlobalBufferSize(globalBufferSize);
+            Logger.log(LogTag.JFR, LogLevel.INFO, "Global buffer size set to " + globalBufferSize);
+            printGlobalBufferSize();
+            updated = true;
+        }
+
+        if (threadBufferSize != null)  {
+            Options.setThreadBufferSize(threadBufferSize);
+            Logger.log(LogTag.JFR, LogLevel.INFO, "Thread buffer size set to " + threadBufferSize);
+            printThreadBufferSize();
+            updated = true;
+        }
+
+        if (memorySize != null) {
+            Options.setMemorySize(memorySize);
+            Logger.log(LogTag.JFR, LogLevel.INFO, "Memory size set to " + memorySize);
+            printMemorySize();
+            updated = true;
+        }
+
+        if (maxChunkSize != null)  {
+            Options.setMaxChunkSize(maxChunkSize);
+            Logger.log(LogTag.JFR, LogLevel.INFO, "Max chunk size set to " + maxChunkSize);
+            printMaxChunkSize();
+            updated = true;
+        }
+
+        if (sampleThreads != null)  {
+            Options.setSampleThreads(sampleThreads);
+            Logger.log(LogTag.JFR, LogLevel.INFO, "Sample threads set to " + sampleThreads);
+            printSampleThreads();
+            updated = true;
+        }
+
+        if (!updated) {
+            println("Current configuration:");
+            println();
+            printRepositoryPath();
+            printStackDepth();
+            printGlobalBufferCount();
+            printGlobalBufferSize();
+            printThreadBufferSize();
+            printMemorySize();
+            printMaxChunkSize();
+            printSampleThreads();
+        }
+        return getResult();
+    }
+
+    private void printRepositoryPath() {
+        print("Repository path: ");
+        printPath(Repository.getRepository().getRepositoryPath());
+        println();
+    }
+
+    private void printDumpPath() {
+        print("Dump path: ");
+        printPath(Options.getDumpPath());
+        println();
+    }
+
+    private void printSampleThreads() {
+        println("Sample threads: " + Options.getSampleThreads());
+    }
+
+    private void printStackDepth() {
+        println("Stack depth: " +  Options.getStackDepth());
+    }
+
+    private void printGlobalBufferCount() {
+        println("Global buffer count: " +  Options.getGlobalBufferCount());
+    }
+
+    private void printGlobalBufferSize() {
+        print("Global buffer size: ");
+        printBytes(Options.getGlobalBufferSize(), " ");
+        println();
+    }
+
+    private void printThreadBufferSize() {
+        print("Thread buffer size: ");
+        printBytes(Options.getThreadBufferSize(), " ");
+        println();
+    }
+
+    private void printMemorySize() {
+        print("Memory size: ");
+        printBytes(Options.getMemorySize(), " ");
+        println();
+    }
+
+    private void printMaxChunkSize() {
+        print("Max chunk size: ");
+        printBytes(Options.getMaxChunkSize(), " ");
+        println();
+    }
+}