1 /* 2 * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 package nsk.share.runner; 25 26 import nsk.share.log.Log; 27 import nsk.share.test.StressOptions; 28 import java.io.PrintStream; 29 import jdk.test.lib.Utils; 30 31 public class RunParams { 32 private StressOptions stressOptions; 33 private long sleepTime = 500; 34 private long iterations = 0; 35 private int numberOfThreads; 36 private boolean runGCThread = false; 37 private boolean runFinThread = false; 38 private boolean runMemDiagThread = false; 39 private boolean runFinDiagThread = false; 40 private boolean runAllDiagThread = false; 41 private boolean runForever = false; 42 private long threadBlockSize = 64 * 1024 * 1024; 43 private boolean interruptThreads = false; 44 RunParams()45 public RunParams() { 46 this(new StressOptions()); 47 } 48 RunParams(StressOptions stressOptions)49 public RunParams(StressOptions stressOptions) { 50 this.stressOptions = stressOptions; 51 numberOfThreads = getMediumLoadThreadsCount(); 52 } 53 RunParams(String[] args)54 public RunParams(String[] args) { 55 this(); 56 parseCommandLine(args); 57 } 58 59 /** 60 * Get an approximate memory which test should fill. 61 * 62 * This can be used to adjust the parameters of allocated objects 63 * to test run environment. Currently it is 3/5 of 64 * Runtime.getRuntime().maxMemory(). 65 */ getTestMemory()66 public long getTestMemory() { 67 return 3 * Runtime.getRuntime().maxMemory() / 5; 68 } 69 70 /** 71 * Return memory to use for allocation of threads. 72 * 73 * This is currently 3/4 of getTestMemory(); 74 */ getThreadsMemory()75 public long getThreadsMemory() { 76 return 3 * getTestMemory() / 4; 77 } 78 getSleepTime()79 public final long getSleepTime() { 80 return sleepTime; 81 } 82 setSleepTime(long sleepTime)83 public final void setSleepTime(long sleepTime) { 84 this.sleepTime = sleepTime; 85 } 86 getIterations()87 public final long getIterations() { 88 return iterations; 89 } 90 setIterations(long iterations)91 public final void setIterations(long iterations) { 92 if (this.iterations != iterations) { 93 this.iterations = iterations; 94 System.out.println("Iterations: " + iterations); 95 } 96 } 97 getBasicLoadThreadsCount()98 public int getBasicLoadThreadsCount() { 99 int cnt = (int) Math.min( 100 Integer.MAX_VALUE, 101 Math.min( 102 Runtime.getRuntime().availableProcessors(), 103 Math.round((double) Runtime.getRuntime().maxMemory() / threadBlockSize) 104 ) 105 ); 106 107 // cnt could be equal to 0 in case maxMemory is less than threadBlockSize then 108 // so, need to check this 109 return (cnt > 0 ? cnt : 1); 110 } 111 getMediumLoadThreadsCount()112 public int getMediumLoadThreadsCount() { 113 return 2 * getBasicLoadThreadsCount(); 114 } 115 getHighLoadThreadsCount()116 public int getHighLoadThreadsCount() { 117 return 100 * getBasicLoadThreadsCount(); 118 } 119 getNumberOfThreads()120 public final int getNumberOfThreads() { 121 return numberOfThreads * stressOptions.getThreadsFactor(); 122 } 123 setNumberOfThreads(int numberOfThreads)124 public final void setNumberOfThreads(int numberOfThreads) { 125 this.numberOfThreads = numberOfThreads; 126 } 127 getSeed()128 public final long getSeed() { 129 // ensure that seed got printed out 130 Utils.getRandomInstance(); 131 return Utils.SEED; 132 } 133 isRunGCThread()134 public final boolean isRunGCThread() { 135 return runGCThread; 136 } 137 setRunGCThread(boolean runGCThread)138 public final void setRunGCThread(boolean runGCThread) { 139 this.runGCThread = runGCThread; 140 } 141 isRunFinThread()142 public final boolean isRunFinThread() { 143 return runFinThread; 144 } 145 setRunFinThread(boolean runFinThread)146 public final void setRunFinThread(boolean runFinThread) { 147 this.runFinThread = runFinThread; 148 } 149 isRunMemDiagThread()150 public final boolean isRunMemDiagThread() { 151 return runMemDiagThread; 152 } 153 setRunMemDiagThread(boolean runMemDiagThread)154 public final void setRunMemDiagThread(boolean runMemDiagThread) { 155 this.runMemDiagThread = runMemDiagThread; 156 } 157 isRunFinDiagThread()158 public final boolean isRunFinDiagThread() { 159 return runFinDiagThread; 160 } 161 setRunFinDiagThread(boolean runFinDiagThread)162 public final void setRunFinDiagThread(boolean runFinDiagThread) { 163 this.runFinDiagThread = runFinDiagThread; 164 } 165 isRunAllDiagThread()166 public final boolean isRunAllDiagThread() { 167 return runAllDiagThread; 168 } 169 setRunAllDiagThread(boolean runAllDiagThread)170 public final void setRunAllDiagThread(boolean runAllDiagThread) { 171 this.runAllDiagThread = runAllDiagThread; 172 } 173 isRunForever()174 public final boolean isRunForever() { 175 return runForever; 176 } 177 setRunForever(boolean runForever)178 public final void setRunForever(boolean runForever) { 179 this.runForever = runForever; 180 } 181 isInterruptThreads()182 public final boolean isInterruptThreads() { 183 return interruptThreads; 184 } 185 setInterruptThreads(boolean interruptThreads)186 public final void setInterruptThreads(boolean interruptThreads) { 187 this.interruptThreads = interruptThreads; 188 } 189 getStressOptions()190 public final StressOptions getStressOptions() { 191 return stressOptions; 192 } 193 parseCommandLine(String[] args)194 public void parseCommandLine(String[] args) { 195 if (args == null) 196 return; 197 stressOptions.parseCommandLine(args); 198 for (int i = 0; i < args.length; ++i) { 199 if (args[i].equals("-f")) 200 runForever = true; 201 else if (args[i].equals("-tg")) 202 runGCThread = true; 203 else if (args[i].equals("-tf")) 204 runFinThread = true; 205 else if (args[i].equals("-Dm")) 206 runMemDiagThread = true; 207 else if (args[i].equals("-Dm-")) 208 runMemDiagThread = false; 209 else if (args[i].equals("-Df1")) 210 runFinDiagThread = true; 211 else if (args[i].equals("-Df")) 212 runFinDiagThread = true; 213 else if (args[i].equals("-t")) 214 numberOfThreads = Integer.parseInt(args[++i]); 215 else if (args[i].equals("-it")) 216 interruptThreads = true; 217 else if (args[i].equals("-iterations")) 218 iterations = Integer.parseInt(args[++i]); 219 } 220 printConfig(System.out); 221 } 222 prinUsage()223 public void prinUsage() { 224 } 225 printConfig(PrintStream out)226 public void printConfig(PrintStream out) { 227 stressOptions.printInfo(out); 228 out.println("Max memory: " + Runtime.getRuntime().maxMemory()); 229 out.println("Sleep time: " + sleepTime); 230 out.println("Iterations: " + iterations); 231 out.println("Number of threads: " + numberOfThreads); 232 out.println("Run GC thread: " + runGCThread); 233 out.println("Run mem diag thread: " + runMemDiagThread); 234 out.println("Run forever: " + runForever); 235 } 236 logConfig(Log log)237 public void logConfig(Log log) { 238 log.debug("Max memory: " + Runtime.getRuntime().maxMemory()); 239 log.debug("Sleep time: " + sleepTime); 240 log.debug("Iterations: " + iterations); 241 log.debug("Number of threads: " + numberOfThreads); 242 log.debug("Run GC thread: " + runGCThread); 243 log.debug("Run mem diag thread: " + runMemDiagThread); 244 log.debug("Run forever: " + runForever); 245 } 246 247 private static RunParams instance; 248 getInstance()249 public static RunParams getInstance() { 250 synchronized (RunParams.class) { 251 if (instance == null) 252 instance = new RunParams(); 253 return instance; 254 } 255 } 256 setInstance(RunParams runParams)257 public static void setInstance(RunParams runParams) { 258 synchronized (RunParams.class) { 259 instance = runParams; 260 } 261 } 262 } 263