|
|
1.1 root 1: #include "global.h"
2: #include <signal.h>
3: /************************************************************************/
4: /* */
5: /* file: inits.i */
6: /* contents: initialization routines */
7: /* */
8:
9:
10: /* initial **************************************************************/
11: /* initializes the parts of the system that cannot be automatically */
12: /* accomplished in the declarations. */
13:
14: int reborn=0; /* flag to tell whether we are in fast-load version */
15: extern char *stabf;
16: extern int fvirgin;
17: extern int keywait;
18: extern sigstruck, sigdelay;
19: initial()
20: {
21: int sigalrmh(), sigfpeh(), siginth();
22: lispval Isstatus(),Istsrch();
23:
24: if( signal(SIGINT,SIG_IGN) != SIG_IGN)
25: signal(SIGINT,siginth);
26: if( signal(SIGHUP,SIG_IGN) != SIG_IGN)
27: signal(SIGHUP,siginth);
28: signal(SIGFPE,siginth);
29: signal(SIGALRM,siginth);
30: /* signals SIGBUS and SIGSEGV will be set up when the status list
31: is set up when the lisp is virgin, and will be set up according
32: to the current value on the status list if the lisp is reborn
33: */
34:
35: if( reborn ) {
36: register FILE *p = _iob + 3;
37: static FILE empty;
38: for(; p < _iob + _NFILE; p++)
39: *p = empty;
40: np = lbot = orgnp;
41: stabf = 0;
42: fvirgin = 1;
43: loading->clb = nil;
44:
45: /* set up SIGBUS and SIGSEGV from current value
46: of status flag dumpcore
47: */
48: Isstatus(matom("dumpcore"),
49: (Istsrch(matom("dumpcore")))->cdr->cdr->cdr);
50:
51: makenv();
52: return;
53: }
54: for (hash=0;hash<HASHTOP;hash++) hasht[hash] = (struct atom *) CNIL;
55:
56: sbrk( NBPG-(((int)sbrk(0)) % NBPG) ); /* even up the break */
57: makevals();
58:
59: orgnp = np;
60: makenv();
61:
62: }
63:
64: static
65: makenv()
66: {
67: register lispval env, temp;
68: register char *p, *q;
69: register struct argent *lbot, *np;
70: char **envp, envstr[64];
71: extern char **environ;
72:
73: lbot = np;
74: env = nil;
75: np++->val = env;
76: for (envp=environ; *envp!=NULL; envp++) ;
77: while (--envp >= environ) {
78: for(p= *envp,q=envstr; (*q++ = *p++)!='=';);
79: *--q = 0;
80: /* at this point lbot->val==env, so it is protected
81: from gc */
82: lbot->val = temp = newdot();
83: temp->cdr = env;
84: env = temp;
85: temp = newdot();
86: temp->car = matom(envstr);
87: temp->cdr = matom(p);
88: env->car = temp;
89: }
90: matom("environment")->clb = env;
91: }
92:
93: siginth(signo){
94: signal(signo,siginth);
95: sigstruck |= (1 << signo);
96: /*if(signo==SIGBUS || signo==SIGBUS || keywait)*/
97: sigcall(signo);
98: }
99: sigcall(which)
100: register which;
101: {
102: extern lispval Lfuncal();
103: extern lispval sigacts[16];
104: struct argent *oldlbot, *oldnp, saved;
105:
106: if(sigacts[which]!=((lispval) 0)) {
107: oldlbot = lbot;
108: oldnp = np;
109: lbot = np;
110: np -> val = sigacts[which];
111: INRNP;
112: np -> val = inewint(which);
113: INRNP;
114: Lfuncal();
115: lbot = oldlbot;
116: np = oldnp;
117: }
118: sigstruck &= ~ (1<<which);
119: }
120: delayoff(){
121: sigdelay = FALSE;
122: if(sigstruck)
123: dosig();
124: }
125: dosig()
126: {
127: register int i; int which;
128: if(!sigdelay)
129: for(which=0, i = 1; i <= 65536; which++,i<<=1) {
130: keywait = FALSE;
131: if(sigstruck & i)
132: sigcall(which);
133: }
134: }
135: badmemr(number)
136: {
137: signal(number,badmemr);
138: fflush(stdout);
139: error("Internal bad memory reference, you are advised to (reset).",FALSE);
140: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.