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 249 - (view) (download) (as text)
Original Path: sml/branches/SMLNJ/src/runtime/kernel/main.c

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

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