comparison CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/shared/KillSwitch.java @ 68:5028fdace37b

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 16:23:26 -0400
parents
children
comparison
equal deleted inserted replaced
67:0e9998148a16 68:5028fdace37b
1 package shared;
2
3 import java.lang.management.ManagementFactory;
4 import java.lang.management.OperatingSystemMXBean;
5 import java.util.Arrays;
6 //import com.sun.management.OperatingSystemMXBean;
7 import java.util.concurrent.atomic.AtomicBoolean;
8 import java.util.concurrent.atomic.AtomicIntegerArray;
9
10 /**
11 * Monitors CPU utilization to determine if the program has crashed.
12 * Also performs VM forced shutdowns and safe memory allocation.
13 * @author Brian Bushnell
14 * @date Feb 25, 2015
15 *
16 */
17 public final class KillSwitch extends Thread {
18
19 public static void main(String[] args){
20 double seconds=Double.parseDouble(args[0]);
21 double load=Double.parseDouble(args[1]);
22 launch(seconds, load);
23 if(args.length>2){
24
25 }
26 }
27
28 private KillSwitch(double seconds, double load) {
29 maxSeconds=seconds;
30 minLoad=load;
31 }
32
33 public static boolean launch(){
34 return launch(600);
35 }
36
37 public static boolean launch(double seconds){
38 return launch(seconds, 0.002);
39 }
40
41 public static synchronized boolean launch(double seconds, double load){
42 if(count>0){return false;}
43 ks=new KillSwitch(seconds, load);
44 ks.start();
45 return true;
46 }
47
48 @Override
49 public void run(){
50
51 boolean success=monitor();
52 // System.err.println("success: "+success);
53 if(!success || killFlag.get()){
54 if(!suppressMessages){
55 System.err.println("Process has decided it has crashed, and will abort.\n" +
56 "If this decision was incorrect, please re-run with the flag 'monitor=f'");
57 }
58 kill0();
59 }
60 }
61
62 private boolean monitor(){
63
64 final OperatingSystemMXBean bean=ManagementFactory.getOperatingSystemMXBean();
65 if(bean.getSystemLoadAverage()<0){
66 System.err.println("This OS does not support monitor, so monitoring was disabled.");
67 return true;
68 }
69
70 final long start=System.currentTimeMillis();
71 final long buffer=(long)(1+maxSeconds*1000);
72 long stop=start+buffer;
73 // System.err.println("start="+start+", stop="+stop+", buffer="+buffer);
74 // System.err.println("shutdownFlag.get()="+shutdownFlag.get());
75 while(!shutdownFlag.get()){
76 try {
77 sleep(500);
78 } catch (InterruptedException e) {
79 // TODO Auto-generated catch block
80 e.printStackTrace();
81 }
82 final double load=bean.getSystemLoadAverage();
83 final long time=System.currentTimeMillis();
84 if(load>minLoad){stop=time+buffer;}
85 if(time>stop){return false;}
86 // System.err.println("stop-time="+(stop-time)+", load="+load);
87 }
88 // System.err.println("shutdownFlag.get()="+shutdownFlag.get());
89 return true;
90 }
91
92 /*--------------------------------------------------------------*/
93
94 public static synchronized void kill(String s){
95 ballast=null;
96 Exception e=new Exception(s);
97 e.printStackTrace();
98 kill0();
99 }
100
101 // public static void kill(Throwable e){
102 // e.printStackTrace();
103 // kill0();
104 // }
105
106 public static synchronized void kill(){
107 ballast=null;
108 Exception e=new Exception("Aborting.");
109 e.printStackTrace();
110 kill0();
111 }
112
113 public static synchronized void killSilent(){
114 ballast=null;
115 kill0();
116 }
117
118 private static void kill0(){
119 ballast=null;
120 Runtime.getRuntime().halt(1);
121 }
122
123 public static void shutdown(){
124 shutdownFlag.set(true);
125 }
126
127 public static void setKillFlag(){
128 killFlag.set(true);
129 }
130
131 /*--------------------------------------------------------------*/
132
133 public static final void throwableKill(Throwable e){
134 ballast=null;
135 synchronized(MemKillMessage){
136 e.printStackTrace();
137 kill0();
138 }
139 }
140
141 public static final void exceptionKill(Exception e){
142 ballast=null;
143 synchronized(MemKillMessage){
144 e.printStackTrace();
145 kill0();
146 }
147 }
148
149 public static final void memKill(OutOfMemoryError e){
150 ballast=null;
151 synchronized(MemKillMessage){
152 e.printStackTrace();
153 System.err.println(MemKillMessage);
154 // Shared.printMemory();
155 // killSilent();
156 kill0();
157 }
158 }
159
160 public static final void assertionKill(AssertionError e){
161 ballast=null;
162 synchronized(MemKillMessage){
163 // System.err.println(e);
164 e.printStackTrace();
165 kill0();
166 }
167 }
168
169
170 /*--------------------------------------------------------------*/
171
172 public static final AtomicIntegerArray allocAtomicInt(int len){
173 AtomicIntegerArray ret=null;
174 try {
175 ret=new AtomicIntegerArray(len);
176 } catch (OutOfMemoryError e) {
177 memKill(e);
178 }
179 return ret;
180 }
181
182 public static final long[] allocLong1D(int len){
183 long[] ret=null;
184 try {
185 ret=new long[len];
186 } catch (OutOfMemoryError e) {
187 memKill(e);
188 }
189 return ret;
190 }
191
192 public static final int[] allocInt1D(int len){
193 int[] ret=null;
194 try {
195 ret=new int[len];
196 } catch (OutOfMemoryError e) {
197 memKill(e);
198 }
199 return ret;
200 }
201
202 public static float[] allocFloat1D(int len) {
203 float[] ret=null;
204 try {
205 ret=new float[len];
206 } catch (OutOfMemoryError e) {
207 memKill(e);
208 }
209 return ret;
210 }
211
212 public static double[] allocDouble1D(int len) {
213 double[] ret=null;
214 try {
215 ret=new double[len];
216 } catch (OutOfMemoryError e) {
217 memKill(e);
218 }
219 return ret;
220 }
221
222 public static final byte[] allocByte1D(int len){
223 byte[] ret=null;
224 try {
225 ret=new byte[len];
226 } catch (OutOfMemoryError e) {
227 memKill(e);
228 }
229 return ret;
230 }
231
232 public static final char[] allocChar1D(int len){
233 char[] ret=null;
234 try {
235 ret=new char[len];
236 } catch (OutOfMemoryError e) {
237 memKill(e);
238 }
239 return ret;
240 }
241
242 /*--------------------------------------------------------------*/
243
244 public static final int[][] allocInt2D(int x){
245 int[][] ret=null;
246 try {
247 ret=new int[x][];
248 } catch (OutOfMemoryError e) {
249 memKill(e);
250 }
251 return ret;
252 }
253
254 public static final int[][] allocInt2D(int x, int y){
255 int[][] ret=null;
256 try {
257 ret=new int[x][y];
258 } catch (OutOfMemoryError e) {
259 ballast2=null;
260 System.err.print(x+","+y);
261 memKill(e);
262 }
263 return ret;
264 }
265
266 public static final float[][] allocFloat2D(int x){
267 float[][] ret=null;
268 try {
269 ret=new float[x][];
270 } catch (OutOfMemoryError e) {
271 memKill(e);
272 }
273 return ret;
274 }
275
276 public static final float[][] allocFloat2D(int x, int y){
277 float[][] ret=null;
278 try {
279 ret=new float[x][y];
280 } catch (OutOfMemoryError e) {
281 ballast2=null;
282 System.err.print(x+","+y);
283 memKill(e);
284 }
285 return ret;
286 }
287
288 public static final long[][] allocLong2D(int x){
289 long[][] ret=null;
290 try {
291 ret=new long[x][];
292 } catch (OutOfMemoryError e) {
293 memKill(e);
294 }
295 return ret;
296 }
297
298 public static final long[][] allocLong2D(int x, int y){
299 long[][] ret=null;
300 try {
301 ret=new long[x][y];
302 } catch (OutOfMemoryError e) {
303 memKill(e);
304 }
305 return ret;
306 }
307
308 /*--------------------------------------------------------------*/
309
310 public static int[][][] allocInt3D(int x) {
311 int[][][] ret=null;
312 try {
313 ret=new int[x][][];
314 } catch (OutOfMemoryError e) {
315 memKill(e);
316 }
317 return ret;
318 }
319
320 public static int[][][] allocInt3D(int x, int y) {
321 int[][][] ret=null;
322 try {
323 ret=new int[x][y][];
324 } catch (OutOfMemoryError e) {
325 memKill(e);
326 }
327 return ret;
328 }
329
330 public static int[][][] allocInt3D(int x, int y, int z) {
331 int[][][] ret=null;
332 try {
333 ret=new int[x][y][z];
334 } catch (OutOfMemoryError e) {
335 memKill(e);
336 }
337 return ret;
338 }
339
340 /*--------------------------------------------------------------*/
341
342 public static byte[] copyOf(byte[] buffer, long newLength) {
343 final int len=buffer.length;
344 final int len2=(int)Tools.min(newLength, Shared.MAX_ARRAY_LEN);
345 if(newLength>len2 && len2<=len){
346 exceptionKill(new Exception("Tried to create an array above length limit: "+len+"," +newLength));
347 }
348 byte[] copy=null;
349 try {
350 copy=Arrays.copyOf(buffer, len2);
351 } catch (OutOfMemoryError e) {
352 memKill(e);
353 }
354 return copy;
355 }
356
357 public static float[] copyOf(float[] buffer, long newLength) {
358 final int len=buffer.length;
359 final int len2=(int)Tools.min(newLength, Shared.MAX_ARRAY_LEN);
360 if(newLength>len2 && len2<=len){
361 exceptionKill(new Exception("Tried to create an array above length limit: "+len+"," +newLength));
362 }
363 float[] copy=null;
364 try {
365 copy=Arrays.copyOf(buffer, len2);
366 } catch (OutOfMemoryError e) {
367 memKill(e);
368 }
369 return copy;
370 }
371
372 public static double[] copyOf(double[] buffer, long newLength) {
373 final int len=buffer.length;
374 final int len2=(int)Tools.min(newLength, Shared.MAX_ARRAY_LEN);
375 if(newLength>len2 && len2<=len){
376 exceptionKill(new Exception("Tried to create an array above length limit: "+len+"," +newLength));
377 }
378 double[] copy=null;
379 try {
380 copy=Arrays.copyOf(buffer, len2);
381 } catch (OutOfMemoryError e) {
382 memKill(e);
383 }
384 return copy;
385 }
386
387 /**
388 * Copy the buffer into an array of size newLength.
389 * Fill extra cells with fillValue.
390 * @param buffer Old array
391 * @param newLength Length of new array
392 * @param fillValue Value to insert in extra cells
393 * @return New array
394 */
395 public static int[] copyAndFill(int[] buffer, long newLength, int fillValue) {
396 final int[] copy=copyOf(buffer, newLength);
397 Arrays.fill(copy, buffer.length, copy.length, fillValue);
398 return copy;
399 }
400
401 public static int[] copyOf(int[] buffer, long newLength) {
402 final int len=buffer.length;
403 final int len2=(int)Tools.min(newLength, Shared.MAX_ARRAY_LEN);
404 if(newLength>len2 && len2<=len){
405 exceptionKill(new Exception("Tried to create an array above length limit: "+len+"," +newLength));
406 }
407 int[] copy=null;
408 try {
409 copy=Arrays.copyOf(buffer, len2);
410 } catch (OutOfMemoryError e) {
411 memKill(e);
412 }
413 return copy;
414 }
415
416 public static int[][] copyOf(int[][] buffer, long newLength) {
417 final int len=buffer.length;
418 final int len2=(int)Tools.min(newLength, Shared.MAX_ARRAY_LEN);
419 if(newLength>len2 && len2<=len){
420 exceptionKill(new Exception("Tried to create an array above length limit: "+len+"," +newLength));
421 }
422 int[][] copy=null;
423 try {
424 copy=Arrays.copyOf(buffer, len2);
425 } catch (OutOfMemoryError e) {
426 memKill(e);
427 }
428 return copy;
429 }
430
431 public static long[] copyOf(long[] buffer, long newLength) {
432 final int len=buffer.length;
433 final int len2=(int)Tools.min(newLength, Shared.MAX_ARRAY_LEN);
434 if(newLength>len2 && len2<=len){
435 exceptionKill(new Exception("Tried to create an array above length limit: "+len+"," +newLength));
436 }
437 long[] copy=null;
438 try {
439 copy=Arrays.copyOf(buffer, len2);
440 } catch (OutOfMemoryError e) {
441 memKill(e);
442 }
443 return copy;
444 }
445
446 public static long[] copyAndFill(long[] buffer, long newLength, int fillValue) {
447 final long[] copy=copyOf(buffer, newLength);
448 Arrays.fill(copy, buffer.length, copy.length, fillValue);
449 return copy;
450 }
451
452 public static long[][] copyOf(long[][] buffer, long newLength) {
453 final int len=buffer.length;
454 final int len2=(int)Tools.min(newLength, Shared.MAX_ARRAY_LEN);
455 if(newLength>len2 && len2<=len){
456 exceptionKill(new Exception("Tried to create an array above length limit: "+len+"," +newLength));
457 }
458 long[][] copy=null;
459 try {
460 copy=Arrays.copyOf(buffer, len2);
461 } catch (OutOfMemoryError e) {
462 memKill(e);
463 }
464 return copy;
465 }
466
467 /*--------------------------------------------------------------*/
468
469 public static byte[] copyOfRange(byte[] buffer, int from, int to) {
470 byte[] copy=null;
471 try {
472 copy=Arrays.copyOfRange(buffer, from, to);
473 } catch (OutOfMemoryError e) {
474 memKill(e);
475 }
476 return copy;
477 }
478
479 public static int[] copyOfRange(int[] buffer, int start, int limit) {
480 int[] copy=null;
481 try {
482 copy=Arrays.copyOfRange(buffer, start, limit);
483 } catch (OutOfMemoryError e) {
484 memKill(e);
485 }
486 return copy;
487 }
488
489 public static long[] copyOfRange(long[] buffer, int start, int limit) {
490 long[] copy=null;
491 try {
492 copy=Arrays.copyOfRange(buffer, start, limit);
493 } catch (OutOfMemoryError e) {
494 memKill(e);
495 }
496 return copy;
497 }
498
499 /*--------------------------------------------------------------*/
500
501 private final double maxSeconds;
502 private final double minLoad;
503
504 private static AtomicBoolean shutdownFlag=new AtomicBoolean(false);
505 private static AtomicBoolean killFlag=new AtomicBoolean(false);
506 private static int count=0;
507 private static KillSwitch ks;
508 private static boolean suppressMessages=false;
509
510 /*--------------------------------------------------------------*/
511
512 private static final String MemKillMessage=new String("\nThis program ran out of memory.\n"
513 + "Try increasing the -Xmx flag and using tool-specific memory-related parameters.");
514
515 public static void addBallast() {
516 synchronized(KillSwitch.class){
517 ballast=new int[20000];
518 ballast2=new int[20000];
519 ballast[0]=1;
520 assert(ballast[0]==1);
521 }
522 }
523
524 private static int[] ballast;
525 private static int[] ballast2;
526
527 }