Annotation of researchv8dc/cmd/cfront/libC/task/task.h, revision 1.1.1.1

1.1       root        1: /*     HEADER FILE FOR THE TASK SYSTEM         */
                      2: 
                      3: printf(char* ...);
                      4: void exit(int);
                      5: 
                      6: #define SIZE           750
                      7: #define MODE           DEDICATED
                      8: 
                      9: class object;
                     10: class sched;   /* : public object */
                     11: class task;    /* : public sched  */
                     12: class qhead;   /* : public object */
                     13: class qtail;   /* : public object */
                     14: class team;
                     15: 
                     16: extern sched* run_chain;   /* list of ready-to-run scheds (ordered by s_time) */
                     17: extern task* task_chain;   /* list of tasks */
                     18: 
                     19: extern int task_error(int, object*);
                     20: extern void print_error(int);
                     21: 
                     22: /* object.o_type */
                     23: #define TIMER          1
                     24: #define TASK           2
                     25: #define QHEAD          4
                     26: #define QTAIL          5
                     27: 
                     28: /* sched.s_state */
                     29: #define IDLE           1
                     30: #define RUNNING                2
                     31: #define TERMINATED     4
                     32: 
                     33: /* type of stack */
                     34: #define DEDICATED      1
                     35: #define SHARED         2
                     36: /* loc on stack */
                     37: #define UNTOUCHED      052525
                     38: 
                     39: extern task* clock_task;
                     40: extern task* thistask;
                     41: extern long clock;
                     42: void setclock(long);
                     43: 
                     44: /* error codes */
                     45: #define E_OLINK                1
                     46: #define E_ONEXT                2
                     47: #define E_GETEMPTY     3
                     48: #define E_PUTOBJ       4
                     49: #define E_PUTFULL      5
                     50: #define E_BACKOBJ      6
                     51: #define E_BACKFULL     7
                     52: #define E_SETCLOCK     8
                     53: #define E_CLOCKIDLE    9
                     54: #define E_RESTERM      10
                     55: #define E_RESRUN       11
                     56: #define E_NEGTIME      12
                     57: #define E_RESOBJ       13
                     58: #define E_HISTO                14
                     59: #define E_STACK        15
                     60: #define E_STORE                16
                     61: #define E_TASKMODE     17
                     62: #define E_TASKDEL      18
                     63: #define E_TASKPRE      19
                     64: #define E_TIMERDEL     20
                     65: #define E_SCHTIME      21
                     66: #define E_SCHOBJ       22
                     67: #define E_QDEL         23
                     68: #define E_RESULT       24
                     69: #define E_WAIT         25
                     70: #define MAXERR E_WAIT
                     71: 
                     72: typedef int (*PFIO)(int,object*);
                     73: typedef void (*PFV)();
                     74: 
                     75: extern PFIO error_fct;
                     76: extern PFV exit_fct;
                     77: 
                     78: /* print flags */
                     79: #define CHAIN          1
                     80: #define VERBOSE                2
                     81: #define STACK          4
                     82: 
                     83: 
                     84: /* DATA STRUCTURES */
                     85: /*
                     86:        object --> olink --> olink ...
                     87:           |         |         |
                     88:          ...        V         V
                     89:           |        task      task
                     90:           V
                     91:        object --> ...
                     92: */
                     93: 
                     94: class olink
                     95: /*     the building block for chains of task pointers */
                     96: {
                     97: friend object;
                     98:        olink*  l_next;
                     99:        task*   l_task;
                    100:                olink(task* t, olink* l) { l_task=t; l_next=l; };
                    101: };
                    102: 
                    103: class object
                    104: {
                    105:        olink*  o_link;
                    106: public:
                    107:        object* o_next;
                    108:        int     o_type;         /* TASK,TIMER,QHEAD/QTAIL */
                    109: 
                    110:                object(int t = 0)       { o_type=t; o_link=0; o_next=0; }
                    111:                ~object();
                    112: 
                    113:        void    remember(task* t)       { o_link = new olink(t,o_link); }
                    114:        void    forget(task*);  /* remove all occurrences of task from chain */
                    115:        void    alert();        /* prepare IDLE tasks for scheduling */
                    116: 
                    117:        void    print(int);
                    118: };
                    119: 
                    120: class sched : public object
                    121: {
                    122: friend timer;
                    123: friend task;
                    124: friend object;
                    125:        void    schedule();     /* sched clock_task or front of run_chain */
                    126:        void    insert(int,object*); /* sched for d time units, ?t_alert=obj */
                    127:        void    remove();       /* remove from run_chain & make IDLE */
                    128: 
                    129:        long    s_time;         /* time to sched; result after cancel() */
                    130:        int     s_state;        /* IDLE, RUNNING, TERMINATED */
                    131: public:
                    132:        void    print(int);
                    133: 
                    134:        long    rdtime()        { return s_time; };
                    135:        int     rdstate()       { return s_state; };
                    136: 
                    137:        void    cancel(int);
                    138:        int     result();
                    139: };
                    140: 
                    141: struct timer : public sched
                    142: {
                    143:                timer(int);
                    144:                ~timer();
                    145:        void    reset(int);
                    146:        void    print(int);
                    147: };
                    148: 
                    149: extern _hwm;
                    150: class task : public sched
                    151: {
                    152: friend sched;
                    153:                task(char* =0, int =0, int =0);
                    154:                ~task();
                    155: 
                    156:        void    save();
                    157:        void    restore();      /* swap in new task */
                    158:        int     curr_hwm();     /* "high water mark" */
                    159:                                /*     (how high stack has risen) */
                    160:        int*    t_framep;       /* WARNING: t_framep
                    161:                                   is manipulated as an offset
                    162:                                   by restore()
                    163:                                */
                    164:        void*   th; /* fudge return from swap */
                    165:        int*    t_basep;
                    166:        int     t_size;         /* holds hwm after cancel() */
                    167:        int*    t_savearea;     /* for saving stack */
                    168:        int     t_trap;
                    169:        team*   t_team;         /* stack and info for sharing */
                    170: 
                    171:        int     t_mode;         /* DEDICATED/SHARED stack */
                    172:        int     t_stacksize;
                    173: 
                    174:        object* t_alert;        /* object that inserted you */
                    175: public:
                    176:        task*   t_next;         /* insertion in "task_chain" */
                    177:        char*   t_name;
                    178: 
                    179:        int     waitvec(object**);
                    180:        int     waitlist(object* ...);
                    181:        void    wait(object* ob)        { (void) waitlist(ob,0); };
                    182: 
                    183:        void    delay(int);
                    184:        int     preempt();
                    185:        void    sleep();
                    186:        void    resultis(int);
                    187:        void    cancel(int);
                    188:        void    swap_stack(int*,int*,int*,int*,int*); /* set fram and restore */
                    189: 
                    190:        void    print(int);
                    191: };
                    192: 
                    193: 
                    194: /* QUEUE MANIPULATION (see queue.c) */
                    195: /*
                    196:        qhead <--> oqueue <--> qtail   (qhead, qtail independent)
                    197:        oqueue ->> circular queue of objects
                    198: */
                    199: 
                    200: /* qh_modes */
                    201: #define EMODE          1
                    202: #define WMODE          2
                    203: #define ZMODE          3
                    204: 
                    205: class oqueue
                    206: {
                    207: friend qhead;
                    208: friend qtail;
                    209:        int     q_max;
                    210:        int     q_count;
                    211:        object* q_ptr;
                    212:        qhead*  q_head;
                    213:        qtail*  q_tail;
                    214: 
                    215:                oqueue(int m)   { q_max=m; q_count=0; q_head=0; q_tail=0; };
                    216:                ~oqueue()       { (q_count)?task_error(E_QDEL,0):0; };
                    217:        void    print(int);
                    218: };
                    219: 
                    220: class qhead : public object
                    221: {
                    222: friend qtail;
                    223:                qhead(int = WMODE, int = 10000);
                    224:                ~qhead();
                    225: 
                    226:        int     qh_mode;        /* EMODE,WMODE,ZMODE */
                    227:        oqueue* qh_queue;
                    228: public:
                    229:        object* get();
                    230:        int     putback(object*);
                    231: 
                    232:        int     rdcount()       { return qh_queue->q_count; }
                    233:        int     rdmax()         { return qh_queue->q_max; }
                    234:        int     rdmode()        { return qh_mode; }
                    235:        qtail*  tail();
                    236: 
                    237:        qhead*  cut();
                    238:        void    splice(qtail*);
                    239: 
                    240:        void    setmode(int m)  { qh_mode = m; };
                    241:        void    setmax(int m)   { qh_queue->q_max = m; };
                    242: 
                    243:        void    print(int);
                    244: };
                    245: 
                    246: class qtail : public object
                    247: {
                    248: friend qhead;
                    249:                qtail(int = WMODE, int = 10000);
                    250:                ~qtail();
                    251: 
                    252:        int     qt_mode;
                    253:        oqueue* qt_queue;
                    254: public:
                    255:        int     put(object*);
                    256: 
                    257:        int     rdspace()       { return qt_queue->q_max - qt_queue->q_count; };
                    258:        int     rdmax()         { return qt_queue->q_max; };
                    259:        int     rdmode()        { return qt_mode; };
                    260: 
                    261:        qtail*  cut();
                    262:        void    splice(qhead*);
                    263: 
                    264:        qhead*  head();
                    265: 
                    266:        void    setmode(int m)  { qt_mode = m; };
                    267:        void    setmax(int m)   { qt_queue->q_max = m; };
                    268: 
                    269:        void    print(int);
                    270: };
                    271: 
                    272: 
                    273: struct histogram
                    274: /*
                    275:        "nbin" bins covering the range [l:r[ uniformly
                    276:        nbin*binsize == r-l
                    277: */
                    278: {
                    279:        int     l, r;
                    280:        int     binsize;
                    281:        int     nbin;
                    282:        int*    h;
                    283:        long    sum;
                    284:        long    sqsum;
                    285:                histogram(int=16, int=0, int=16);
                    286: 
                    287:        void    add(int);
                    288:        void    print();
                    289: };
                    290: 
                    291: /*     the result of randint() is always >= 0  */
                    292: 
                    293: #define DRAW (randx = randx*1103515245 + 12345)
                    294: #define ABS(x) (x&0x7fffffff)
                    295: 
                    296: #ifdef pdp11
                    297: #define MASK(x)        ((x>>16)&077777)
                    298: #define MAX 32768.0
                    299: #endif
                    300: 
                    301: #ifdef vax
                    302: #define MASK(x) ABS(x)
                    303: #define MAX 2147483648.0
                    304: #endif
                    305: 
                    306: class randint
                    307: /*     uniform distribution in the interval [0,MAX] */
                    308: {
                    309:        long    randx;
                    310: public:
                    311:                randint(long s = 0)     { randx=s; }
                    312:        void    seed(long s)    { randx=s; }
                    313:        int     draw()          { return MASK(DRAW); }
                    314:        float   fdraw()         { return ABS(DRAW)/MAX; };
                    315: };
                    316: 
                    317: class urand : public randint
                    318: /*     uniform distribution in the interval [low,high] */
                    319: {
                    320: public:
                    321:        int     low, high;
                    322:                urand(int l, int h)     { low=l; high=h; }
                    323:        int     draw() { return int(low + (high-low) * (0+randint::draw()/MAX)); }
                    324: };
                    325: 
                    326: extern double log(double);
                    327: 
                    328: class erand : public randint
                    329: /*     exponential distribution random number generator */
                    330: {
                    331: public:
                    332:        int     mean;
                    333:                erand(int m) { mean=m; };
                    334:        int     draw() { return (int)(-mean * log( (double)(MAX-randint::draw())
                    335:                                                / MAX) + .5); };
                    336: };

unix.superglobalmegacorp.com

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