-
Notifications
You must be signed in to change notification settings - Fork 62
/
OTPMain.java
132 lines (108 loc) · 4.04 KB
/
OTPMain.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/**
* This file is part of Erjang - A JVM-based Erlang VM
*
* Copyright (c) 2009 by Trifork
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
package erjang;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Logger;
import erjang.driver.EDriver;
import erjang.driver.efile.ClassPathResource;
import erjang.driver.efile.EFile;
/**
* This will eventually be the main entrypoint for an OTP node.
* Loads preloaded erlang modules, and invokes otp_ring0:start/2
*
*/
public class OTPMain {
public static String[] MODULES = new String[] { "erl_prim_loader",
"erlang", "init", "otp_ring0", "prim_file", "prim_inet",
"prim_zip", "zlib" };
public static EDriver[] DRIVERS = new EDriver[] {
new erjang.driver.efile.Driver(),
new erjang.driver.ram_file.Driver(),
new erjang.driver.tcp_inet.Driver(),
new erjang.driver.inet_gethost.Driver(),
new erjang.driver.zlib.Driver(),
new erjang.driver.js.EJSDriver()
};
public static void load_modules_and_drivers() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
if (Main.erl_bootstrap_ebindir.startsWith(EFile.RESOURCE_PREFIX)) {
for (String m : MODULES) {
String beam_path = Main.erl_bootstrap_ebindir + "/" + m + ".beam";
EBinary bin = ClassPathResource.read_file(beam_path);
if (bin == null) {
throw new FileNotFoundException(beam_path);
}
EModuleLoader.load_module(m, bin);
}
} else {
for (String m : MODULES) {
ERT.load_module(EAtom.intern(m));
}
}
for (EDriver d : DRIVERS) {
erjang.driver.Drivers.register(d);
}
for (EDriver d : extra_drivers) {
erjang.driver.Drivers.register(d);
}
}
public static void start_otp_ring0(ESeq argv) {
EAtom am_otp_ring0 = EAtom.intern("otp_ring0");
EAtom am_start = EAtom.intern("start");
ESeq env = ERT.NIL;
// launch first (initial) process, which starts OTP
EProc proc = new EProc(null, am_otp_ring0, am_start, ERT.NIL.cons(argv).cons(env));
ERT.run(proc);
// wait for this process to terminate
proc.joinb();
// shutdown schedulers, after the first (initial) process has stopped
ERT.shutdownSchedulers();
// shutdown timer task
ETimerTask.shutdown();
}
protected static ESeq process_args(String[] args) {
ESeq argv = ERT.NIL;
for (int i = args.length-1; i >= 0; i--) {
argv = argv.cons(EBinary.fromString(args[i]));
//special handling for -noshell / -noinput:
//in this case we suppress the Progress wheel since it might break the output
if (args[i].equals("-noinput") || args[i].equals("noshell")) {
System.setProperty("erjang.progress.suppress", "true");
}
}
return argv;
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
ESeq argv = process_args(args);
Handler fh = new FileHandler("erjang.log");
Logger.getLogger("").addHandler(fh);
// Logger.getLogger("erjang").setLevel(Level.FINE);
// Logger.getLogger("kilim.Task").setLevel(Level.FINEST);
load_modules_and_drivers();
start_otp_ring0(argv);
System.out.println("done.");
}
static List<EDriver> extra_drivers = new ArrayList<EDriver>();
public static void add_driver(EDriver driver) {
extra_drivers.add(driver);
}
}