001: /*
002: * @(#)LVMLauncher.java 1.6 06/10/10
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: *
026: */
027:
028: package lvmtest;
029:
030: import sun.misc.LogicalVM;
031:
032: public class LVMLauncher {
033:
034: private static final String[] usageMessage = {
035: "",
036: "usage: <cvm> LVMLauncher [[num-lvm [intrl-msec [timeout-msec]]] "
037: + "MainClass [args...]",
038: "",
039: " ex: <cvm> LVMLauncher 5 1000 HelloWorld",
040: "",
041: " Launches specified MainClass in multiple Logical VMs specified",
042: " by the num-lvm argument. Each LVM starts off with intrl-msec",
043: " milli-seconds interval. One of the LVM gets forcibly terminated",
044: " after time-out seconds.[this part is not implemented yet]",
045: "", };
046:
047: private static final int DefaultLVMNum = 3;
048: private static final int DefaultIntvlMSec = -1;
049: private static final int DefaultTimeOut = -1;
050:
051: public static void main(String[] args) {
052:
053: int lvmNum = DefaultLVMNum;
054: int intvlMSec = DefaultIntvlMSec;
055: int timeOut = DefaultTimeOut;
056: int argp = 0;
057:
058: try {
059: lvmNum = Integer.valueOf(args[argp]).intValue();
060: argp++;
061: intvlMSec = Integer.valueOf(args[argp]).intValue();
062: argp++;
063: timeOut = Integer.valueOf(args[argp]).intValue();
064: argp++;
065: } catch (NumberFormatException e) {
066: /* Non-number argument encountered. Keep going */
067: } catch (ArrayIndexOutOfBoundsException e) {
068: /* There should be at least one non-number argument */
069: printUsage();
070: System.exit(-1);
071: }
072:
073: if (lvmNum <= 0 || args.length <= argp) {
074: printUsage();
075: System.exit(-1);
076: }
077:
078: String className = args[argp++];
079:
080: String[] as = new String[args.length - argp];
081: for (int i = 0; i < args.length - argp; i++) {
082: as[i] = args[argp + i];
083: }
084:
085: LogicalVM lvmToKill = null;
086:
087: for (int i = 0; i < lvmNum; i++) {
088: String lvmName = "#" + (i + 1);
089: System.out.println("*** Starting LogicalVM " + lvmName
090: + ": " + className);
091:
092: LogicalVM lvm = new LogicalVM(className, as, lvmName);
093: lvm.start();
094:
095: /* Pick one victim for the termination test later */
096: if (i == (lvmNum - 1) / 2) {
097: lvmToKill = lvm;
098: }
099:
100: if (intvlMSec >= 0) {
101: try {
102: Thread.sleep(intvlMSec);
103: } catch (InterruptedException e) {
104: System.err.println("Exception caught in sleep(): "
105: + e);
106: }
107: }
108: }
109:
110: if (timeOut >= 0) {
111: int timeOutSec = timeOut / 1000;
112: timeOut -= timeOutSec * 1000;
113: try {
114: for (int i = 0; i < timeOutSec * 2; i++) {
115: if (i != 0) {
116: Thread.sleep(500);
117: }
118: System.out.print(".");
119: }
120: System.out.println();
121: Thread.sleep(timeOut);
122: } catch (Exception e) {
123: }
124:
125: System.out.println("*** Terminating Logical VM: "
126: + lvmToKill.getName());
127: lvmToKill.exit(0);
128: try {
129: lvmToKill.join();
130: } catch (Exception e) {
131: }
132: System.out.println("*** Terminated Logical VM: "
133: + lvmToKill.getName());
134:
135: }
136: }
137:
138: private static void printUsage() {
139: for (int i = 0; i < usageMessage.length; i++) {
140: System.err.println(usageMessage[i]);
141: }
142: }
143: }
|