Annotation of researchv9/jtools/src/demo/pacman/sched.c, revision 1.1

1.1     ! root        1: /*----------------------------------------------------------------------*/
        !             2: /*                                                                     */
        !             3: /*     PACMAN for BBN BitGraphs                                        */
        !             4: /*                                                                     */
        !             5: /*               File: sched.c68                                       */
        !             6: /*           Contents: passive real-time-clock-based scheduler         */
        !             7: /*             Author: Bob Brown (rlb)                                 */
        !             8: /*                     Purdue CS                                       */
        !             9: /*               Date: May, 1982                                       */
        !            10: /*        Description: An event list manager for the scheduling        */
        !            11: /*                     of C procedures after given time delays         */
        !            12: /*                                                                     */
        !            13: /*----------------------------------------------------------------------*/
        !            14: 
        !            15: #include "style.h"
        !            16: #include "pacman.h"
        !            17: #define Event PEvent
        !            18: 
        !            19: /*
        !            20: ** Beacuse the scheduler calls routines that re-enqueue themselves,
        !            21: ** The following constant is needed to prevent elpoll() from starving
        !            22: ** the keyboard polling routine when the monsters are running flat-out.
        !            23: */
        !            24: 
        !            25: #define MAXLOOPS 5
        !            26: 
        !            27: /*
        !            28: ** elinit() - initialize the event list to empty.
        !            29: ** eladd() - add an event to the event list.
        !            30: ** elpoll() - called at in polling loop to run scheduled events.
        !            31: */
        !            32: 
        !            33: /*
        !            34: **  MAXEVENTS ...
        !            35: **
        !            36: **     1 for pacman
        !            37: **     4 for monsters
        !            38: **     4 for power pill effects
        !            39: **     1 for bonus fruits
        !            40: **     3 for tone generators
        !            41: */
        !            42: 
        !            43: #define MAXEVENTS      13
        !            44: #define ENULL          ((event *) 0)
        !            45: 
        !            46: typedef struct ev {
        !            47:        struct ev *next;
        !            48:        int time;
        !            49:        int (*routine)();       /* procedure to call */
        !            50:        char *arg0;             /* optional first argument */
        !            51:        int arg1;               /* optional second argument */
        !            52: } event;
        !            53: 
        !            54: event *Eventfree;
        !            55: event *Eventhead;
        !            56: event Event[MAXEVENTS];
        !            57: 
        !            58: extern int clock;
        !            59: 
        !            60: elinit()
        !            61: {
        !            62:        register event *ep;
        !            63:        Eventfree = ENULL;
        !            64:        for ( ep=Event ; ep<&Event[MAXEVENTS] ; ep++ ) {
        !            65:                ep->next = Eventfree;
        !            66:                Eventfree = ep;
        !            67:        }
        !            68:        Eventhead = ENULL;
        !            69:        clock = 0;
        !            70: }
        !            71: /*
        !            72: ** eladd - add an event to the event list
        !            73: */
        !            74: /* VARARGS 2 */
        !            75: eladd(delta,routine,arg0,arg1)
        !            76: int delta;
        !            77: int (*routine)();
        !            78: char *arg0;
        !            79: int arg1;
        !            80: {
        !            81:        int time;
        !            82:        register event *ep, *pp, *cp;
        !            83: 
        !            84: #ifdef BLIT
        !            85:        delta = (delta+8)/16;
        !            86: #endif
        !            87: #ifdef V1_25
        !            88:        delta = (delta+5)/10;
        !            89: #endif
        !            90: 
        !            91:        if ( Eventfree == ENULL ) {
        !            92: #ifndef BLIT
        !            93:                error("Event list overflow");
        !            94: #endif
        !            95:                return;
        !            96:        }
        !            97:        cp = Eventfree;
        !            98:        Eventfree = Eventfree->next;
        !            99: 
        !           100:        time = delta+clock;
        !           101:        cp->time = time;
        !           102:        cp->routine = routine;
        !           103:        cp->arg0 = arg0;
        !           104:        cp->arg1 = arg1;
        !           105: 
        !           106:        ep = Eventhead;
        !           107:        pp = ENULL;
        !           108:        while ( ep!=ENULL && time>ep->time ) {
        !           109:                pp = ep;
        !           110:                ep = ep->next;
        !           111:        }
        !           112:        cp->next = ep;
        !           113:        if ( pp == ENULL )
        !           114:                Eventhead = cp;
        !           115:        else
        !           116:                pp->next = cp;
        !           117: }
        !           118: /*
        !           119: ** elpoll - check if anything to schedule
        !           120: */
        !           121: elpoll()
        !           122: {
        !           123:        register int maxloops;
        !           124:        register event *ep;
        !           125:        maxloops = MAXLOOPS;
        !           126:        while ( (ep=Eventhead)!=ENULL && ep->time < clock && --maxloops > 0) {
        !           127:                Eventhead = ep->next;
        !           128:                (*ep->routine)(ep->arg0,ep->arg1);
        !           129:                ep->next = Eventfree;
        !           130:                Eventfree = ep;
        !           131:        }
        !           132: }
        !           133: /*
        !           134: ** eladjust - adjust the scheduler based on processor delay
        !           135: */
        !           136: eladjust(ms)
        !           137: register int ms;
        !           138: {
        !           139: #ifdef BLIT
        !           140:        ms = (ms+8)/16;
        !           141: #endif
        !           142: #ifdef V1_25
        !           143:        ms = (ms+5)/10;
        !           144: #endif
        !           145:        clock -= ms;
        !           146: }

unix.superglobalmegacorp.com

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