--- /dev/null 2017-11-09 09:38:01.297999907 +0100 +++ new/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdConfigure.java 2018-04-09 16:11:53.627898324 +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(); + } +}