Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/runtime/kernel/main.c
ViewVC logotype

Annotation of /sml/trunk/src/runtime/kernel/main.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2 - (view) (download) (as text)

1 : monnier 2 /* main.c
2 :     *
3 :     * COPYRIGHT (c) 1993 by AT&T Bell Laboratories.
4 :     *
5 :     * This is the main routine for the interactive version of SML/NJ.
6 :     */
7 :    
8 :     #include <stdio.h>
9 :     #include <ctype.h>
10 :     #include "ml-base.h"
11 :     #include "ml-options.h"
12 :     #include "ml-limits.h"
13 :    
14 :     #ifdef COLLECT_STATS
15 :     #include <sys/types.h>
16 :     #include <sys/stat.h>
17 :     #include <fcntl.h>
18 :     #include "stats-data.h"
19 :     #endif
20 :    
21 :     FILE *DebugF = NULL;
22 :    
23 :     #ifdef TARGET_BYTECODE
24 :     FILE *BC_stdout = NULL;
25 :     #endif
26 :    
27 :     /* Runtime globals */
28 :     bool_t SilentLoad = TRUE;
29 :     bool_t DumpObjectStrings = FALSE;
30 :     char **RawArgs;
31 :     char **CmdLineArgs; /* does not include the command name (argv[0]) */
32 :     char *MLCmdName; /* the command name used to invoke the runtime */
33 :     #ifdef HACKED_STANDALONE
34 :     bool_t StandAlone = TRUE;
35 :     #endif
36 :    
37 :     /* local variables */
38 :     PVT bool_t isBoot = FALSE; /* true if we should bootstrap a system */
39 :     PVT char *LoadImage /* the path name of the image file to load */
40 :     = DFLT_IMAGE;
41 :     PVT char *BootFrom /* the boot source (bin file directory). */
42 :     = NULL;
43 :     PVT int NumProcs = 1; /* not used */
44 :    
45 :     PVT void ParseOptions (int argc, char **argv, heap_params_t **heapParams);
46 :    
47 :    
48 :     main (int argc, char **argv)
49 :     {
50 :     heap_params_t *heapParams;
51 :    
52 :     DebugF = stderr;
53 :    
54 :     /* process the command-line options */
55 :     ParseOptions (argc, argv, &heapParams);
56 :    
57 :     #ifdef TARGET_BYTECODE
58 :     if (BC_stdout == NULL)
59 :     BC_stdout = fdopen(dup(1), "w");
60 :     #endif
61 :    
62 :     InitTimers ();
63 :     RecordGlobals ();
64 :     InitCFunList ();
65 :    
66 :     #ifdef MP_SUPPORT
67 :     MP_Init();
68 :     #endif
69 :    
70 :     /* start ML */
71 :     if (isBoot) {
72 :     BootML (BootFrom, heapParams);
73 :     }
74 :     else { /* load an image */
75 :     LoadML (LoadImage, heapParams);
76 :     }
77 :    
78 :     Exit (0);
79 :    
80 :     } /* end of main. */
81 :    
82 :    
83 :     /* ParseOptions:
84 :     *
85 :     * Parse the command-line options.
86 :     */
87 :     PVT void ParseOptions (int argc, char **argv, heap_params_t **heapParams)
88 :     {
89 :     char option[MAX_OPT_LEN], *optionArg, **nextArg;
90 :     bool_t errFlg = FALSE;
91 :    
92 :     /* first scan for any heap/GC parameters */
93 :     if ((*heapParams = ParseHeapParams(argv)) == NIL(heap_params_t *))
94 :     errFlg = TRUE;
95 :    
96 :     RawArgs = argv;
97 :     CmdLineArgs = NEW_VEC(char *, argc);
98 :     MLCmdName = *argv++;
99 :     #ifdef HACKED_STANDALONE
100 :     LoadImage = MLCmdName;
101 :     #endif
102 :     nextArg = CmdLineArgs;
103 :     while (--argc > 0) {
104 :     char *arg = *argv++;
105 :    
106 :     #define MATCH(opt) (strcmp(opt, option) == 0)
107 :     #define CHECK(opt) { \
108 :     if (optionArg[0] == '\0') { \
109 :     errFlg = TRUE; \
110 :     Error("missing argument for \"%s\" option\n", opt); \
111 :     continue; \
112 :     } \
113 :     } /* CHECK */
114 :    
115 :     if (isRuntimeOption(arg, option, &optionArg)) {
116 :     if (MATCH("boot")) {
117 :     CHECK("boot");
118 :     isBoot = TRUE;
119 :     BootFrom = optionArg;
120 :     }
121 :     else if (MATCH("load")) {
122 :     CHECK("load");
123 :     LoadImage = optionArg;
124 :     #ifdef HACKED_STANDALONE
125 :     LoadImage = MLCmdName;
126 :     #endif
127 :     }
128 :     else if (MATCH("cmdname")) {
129 :     CHECK("cmdname");
130 :     MLCmdName = optionArg;
131 :     #ifdef HACKED_STANDALONE
132 :     StandAlone = FALSE;
133 :     #endif
134 :     }
135 :     #ifdef MP_SUPPORT
136 :     else if (MATCH("nprocs")) {
137 :     CHECK("nprocs");
138 :     NumProcs = atoi(optionArg);
139 :     if (NumProcs < 0)
140 :     NumProcs = 0;
141 :     else if (NumProcs > MAX_NUM_PROCS)
142 :     NumProcs = MAX_NUM_PROCS;
143 :     }
144 :     #endif
145 :     else if (MATCH("quiet")) {
146 :     SilentLoad = TRUE;
147 :     }
148 :     else if (MATCH("verbose")) {
149 :     SilentLoad = FALSE;
150 :     }
151 :     else if (MATCH("objects")) {
152 :     DumpObjectStrings = TRUE;
153 :     }
154 :     else if (MATCH("debug")) {
155 :     CHECK("debug");
156 :     if ((DebugF = fopen(optionArg, "w")) == NULL) {
157 :     errFlg = TRUE;
158 :     Error("unable to open debug output file \"%s\"\n", *(argv[-1]));
159 :     continue;
160 :     }
161 :     }
162 :     #ifdef COLLECT_STATS
163 :     else if (MATCH("stats")) {
164 :     CHECK("stats");
165 :     StatsFD = open (optionArg, O_WRONLY|O_TRUNC|O_CREAT, 0666);
166 :     if (StatsFD == -1) {
167 :     errFlg = TRUE;
168 :     Error("unable to open statistics file \"%s\"\n", *(argv[-1]));
169 :     continue;
170 :     }
171 :     }
172 :     #endif
173 :     #ifdef TARGET_BYTECODE
174 :     else if (MATCH("dump")) {
175 :     CHECK("dump");
176 :     BC_stdout = fopen (optionArg, "w");
177 :     }
178 :     #ifdef INSTR_TRACE
179 :     else if (MATCH("trace")) {
180 :     extern bool_t traceOn;
181 :     traceOn = TRUE;
182 :     }
183 :     #endif
184 :     #endif
185 :     }
186 :     else {
187 :     *nextArg++ = arg;
188 :     }
189 :     } /* end while */
190 :    
191 :     *nextArg = NIL(char *);
192 :    
193 :     if (errFlg)
194 :     Exit (1);
195 :    
196 :     } /* end of ParseOptions */
197 :    
198 :    
199 :     /* Exit:
200 :     * Exit from the ML system.
201 :     */
202 :     void Exit (int code)
203 :     {
204 :     #if COUNT_REG_MASKS
205 :     DumpMasks();
206 :     #endif
207 :     #ifdef COLLECT_STATS
208 :     if (StatsFD >= 0) {
209 :     STATS_FLUSH_BUF();
210 :     close (StatsFD);
211 :     }
212 :     #endif
213 :     #if (defined(TARGET_BYTECODE) && defined(INSTR_COUNT))
214 :     {
215 :     extern void PrintInstrCount (FILE *f);
216 :     PrintInstrCount (DebugF);
217 :     }
218 :     #endif
219 :    
220 :     exit (code);
221 :    
222 :     } /* end of Exit */
223 :    

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0