Annotation of 42BSD/ucb/lisp/franz/inits.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *rcsid =
                      3:    "$Header: inits.c,v 1.5 83/09/12 14:17:34 sklower Exp $";
                      4: #endif
                      5: 
                      6: /*                                     -[Sat Jan 29 12:59:39 1983 by jkf]-
                      7:  *     inits.c                         $Locker:  $
                      8:  * initialization routines
                      9:  *
                     10:  * (c) copyright 1982, Regents of the University of California
                     11:  */
                     12: 
                     13: 
                     14: #include "global.h"
                     15: #include <signal.h>
                     16: #include "frame.h"
                     17: 
                     18: /* initial
                     19:  * initializes the parts of the system that cannot be automatically
                     20:  * accomplished in the declarations.
                     21:  */
                     22:  
                     23: int reborn=0;  /*  flag to tell whether we are in fast-load version  */
                     24: extern char *stabf;
                     25: extern int fvirgin;
                     26: extern int keywait;
                     27: extern sigstruck, sigdelay;
                     28: initial()
                     29: {
                     30:        int sigalrmh(), sigfpeh(),  siginth();
                     31:        lispval Isstatus(),Istsrch();
                     32:        extern int hashtop;
                     33: 
                     34:        /* clear any memory of pending SIGINT's */
                     35:        exception = FALSE;
                     36:        sigintcnt = 0;
                     37: 
                     38:        if( signal(SIGINT,SIG_IGN) != SIG_IGN)
                     39:              signal(SIGINT,siginth);
                     40:        if( signal(SIGHUP,SIG_IGN) != SIG_IGN)
                     41:              signal(SIGHUP,siginth);
                     42:        signal(SIGFPE,siginth);
                     43:        signal(SIGALRM,siginth);
                     44:        signal(SIGPIPE,siginth);
                     45:        /* signals SIGBUS and SIGSEGV will be set up when the status list
                     46:           is set up when the lisp is virgin, and will be set up according
                     47:           to the current value on the status list if the lisp is reborn
                     48:        */
                     49: 
                     50: #ifdef SPISFP
                     51:        {extern long *exsp; xsp = exsp;}
                     52: #endif
                     53: 
                     54:        if( reborn ) {
                     55:                register FILE *p = _iob + 3;
                     56:                static FILE empty;
                     57:                for(; p < _iob + _NFILE; p++)
                     58:                        *p = empty;
                     59:                np = lbot = orgnp;
                     60:                stabf = 0;
                     61:                fvirgin = 1;
                     62:                loading->a.clb = nil;
                     63:                gcrebear();
                     64: 
                     65:                /* set up SIGBUS and SIGSEGV from current value 
                     66:                   of status flag dumpcore
                     67:                */
                     68:                Isstatus(matom("dumpcore"),
                     69:                         (Istsrch(matom("dumpcore")))->d.cdr->d.cdr->d.cdr);
                     70: 
                     71:                makenv();
                     72:                return;
                     73:        }
                     74:        for (hash=0;hash<hashtop;hash++) hasht[hash] = (struct atom *) CNIL;
                     75:        
                     76:        sbrk( LBPG-(((int)sbrk(0)) % LBPG) );   /* even up the break */
                     77:        makevals();
                     78: 
                     79:        orgnp = np;
                     80:        makenv();
                     81: 
                     82: }
                     83: 
                     84: static
                     85: makenv()
                     86: {
                     87:        register lispval env, temp;
                     88:        register char *p, *q;
                     89:        char **envp, envstr[STRBLEN];
                     90:        extern char **environ;
                     91: 
                     92:        lbot = np;
                     93:        env = nil;
                     94:        np++->val = env;
                     95:        for (envp=environ; *envp!=NULL; envp++) ;
                     96:        while (--envp >= environ) {
                     97:                for(p= *envp,q=envstr; *p!='=' ; p++)
                     98:                        if(q < envstr + STRBLEN)
                     99:                                *q++ = *p;
                    100:                *q = 0; p++;
                    101:                /* at this point lbot->val==env, so it is protected
                    102:                   from gc */
                    103:                lbot->val = temp = newdot();
                    104:                temp->d.cdr = env;
                    105:                env = temp;
                    106:                temp = newdot();
                    107:                env->d.car = temp;
                    108:                temp->d.car = matom(envstr);
                    109:                temp->d.cdr = matom(p);
                    110:        }
                    111:        matom("environment")->a.clb = env;
                    112:        np--;
                    113: }
                    114: 
                    115: siginth(signo){
                    116:        re_enable(signo,siginth);
                    117:        sigstruck |= (1 << signo);
                    118:        /* handle SIGINT differently since it is the only
                    119:           asychronous interrupt we handle              */
                    120:        if( signo == SIGINT) {
                    121:            if( ++sigintcnt == 1)
                    122:            {  /* if this is the first interrupt, we just set a flag
                    123:                  which will be checked in qfuncl and eval.  This will
                    124:                  allow us to handle these interrupts when we are
                    125:                  ready.
                    126:               */
                    127:               exception = TRUE;
                    128:               /*putchar('A');*/
                    129:               fflush(stdout);
                    130:               sigstruck &= ~(1 << signo);
                    131:               return;
                    132:            }
                    133:            else if (sigintcnt == 2)
                    134:            {  /* the setting of  exception was ignored, we better
                    135:                  make sure that all calls from compiled code
                    136:                  go through qlinker
                    137:                */
                    138:                signal(SIGINT,SIG_IGN);  /* this may take a while, dont allow ints*/
                    139:                clrtt(0);
                    140:                /*putchar('B');*/
                    141:                fflush(stdout);
                    142:                signal(SIGINT,siginth);  /* ok to interrupt again */
                    143:                sigstruck &= ~(1 << signo);
                    144:                return;
                    145:            }
                    146:            else {
                    147:                /*putchar('C');*/
                    148:                fflush(stdout);
                    149:            }
                    150:        }
                    151: 
                    152:        sigcall(signo);
                    153: }
                    154: sigcall(which)
                    155: register which;
                    156: {
                    157:        extern lispval Lfuncal();
                    158:        Savestack(1);
                    159: 
                    160:        if(which == SIGINT) { sigintcnt = 0; exception = 0; }
                    161: 
                    162:        if(sigacts[which]!=((lispval) 0)) {
                    163:                pbuf pb;
                    164:                int mustpop = 0;
                    165:                if(errp && errp->class==F_TO_FORT) {
                    166:                        np = errp->svnp;
                    167:                        mustpop = 1;
                    168:                        errp = Pushframe(F_TO_LISP,nil,nil);
                    169:                }
                    170:                lbot = np;
                    171:                np -> val = sigacts[which];
                    172:                INRNP;
                    173:                np -> val = inewint((long)which);
                    174:                INRNP;
                    175:        {lispval temp;temp = rdrsdot, rdrsdot = rdrsdot2, rdrsdot2 = temp; /*KLUDGE*/}
                    176:                Lfuncal();
                    177:                if (mustpop) errp = Popframe();
                    178:        {lispval temp;temp = rdrsdot, rdrsdot = rdrsdot2, rdrsdot2 = temp; /*KLUDGE*/}
                    179:        }
                    180:        sigstruck &= ~ (1<<which);
                    181:        Restorestack();
                    182: }
                    183: delayoff(){
                    184:        sigdelay = FALSE;
                    185:        if(sigstruck)
                    186:                dosig();
                    187: }
                    188: dosig()
                    189: {
                    190:        register int i; int which;
                    191:        if(!sigdelay) 
                    192:                for(which=0, i = 1;  i <= 65536;  which++,i<<=1) {
                    193:                        keywait = FALSE;
                    194:                        if(sigstruck & i)
                    195:                                sigcall(which);
                    196:                }
                    197: }
                    198: badmemr(number)
                    199: {
                    200:        signal(number,badmemr);
                    201:        fflush(stdout);
                    202:        error("Internal bad memory reference, you are advised to (reset).",FALSE);
                    203: }
                    204: 
                    205: #define        mask(s) (1 << ((s)-1))
                    206: static
                    207: re_enable(signo,handler)
                    208: int (*handler)();
                    209: {
                    210: #if os_4_2
                    211:        sigsetmask(sigblock(0) &~ mask(signo));
                    212: #else
                    213:        signal(signo,handler);
                    214: #endif
                    215: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.