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 651 - (view) (download) (as text)

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

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