|
|
1.1 ! root 1: /* HEADER FILE FOR THE TASK SYSTEM */ ! 2: ! 3: printf(const 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: friend timer; ! 122: friend task; ! 123: friend object; ! 124: void schedule(); /* sched clock_task or front of run_chain */ ! 125: void insert(int,object*); /* sched for d time units, ?t_alert=obj */ ! 126: void remove(); /* remove from run_chain & make IDLE */ ! 127: ! 128: long s_time; /* time to sched; result after cancel() */ ! 129: int s_state; /* IDLE, RUNNING, TERMINATED */ ! 130: public: ! 131: void print(int); ! 132: ! 133: long rdtime() { return s_time; }; ! 134: int rdstate() { return s_state; }; ! 135: ! 136: void cancel(int); ! 137: int result(); ! 138: }; ! 139: ! 140: struct timer : sched { ! 141: timer(int); ! 142: ~timer(); ! 143: void reset(int); ! 144: void print(int); ! 145: }; ! 146: ! 147: extern _hwm; ! 148: class task : public sched { ! 149: friend sched; ! 150: void save(); ! 151: void restore(); /* swap in new task */ ! 152: int curr_hwm(); /* "high water mark" */ ! 153: /* (how high stack has risen) */ ! 154: int* t_framep; /* WARNING: t_framep ! 155: is manipulated as an offset ! 156: by restore() ! 157: */ ! 158: void* th; /* fudge return from swap */ ! 159: int* t_basep; ! 160: int t_size; /* holds hwm after cancel() */ ! 161: int* t_savearea; /* for saving stack */ ! 162: int t_trap; ! 163: team* t_team; /* stack and info for sharing */ ! 164: ! 165: int t_mode; /* DEDICATED/SHARED stack */ ! 166: int t_stacksize; ! 167: ! 168: object* t_alert; /* object that inserted you */ ! 169: public: ! 170: task(char* =0, int =0, int =0); ! 171: ~task(); ! 172: ! 173: task* t_next; /* insertion in "task_chain" */ ! 174: char* t_name; ! 175: ! 176: int waitvec(object**); ! 177: int waitlist(object* ...); ! 178: void wait(object* ob) { (void) waitlist(ob,0); }; ! 179: ! 180: void delay(int); ! 181: int preempt(); ! 182: void sleep(); ! 183: void resultis(int); ! 184: void cancel(int); ! 185: void swap_stack(int*,int*,int*,int*,int*); /* set fram and restore */ ! 186: ! 187: void print(int); ! 188: }; ! 189: ! 190: ! 191: /* QUEUE MANIPULATION (see queue.c) */ ! 192: /* ! 193: qhead <--> oqueue <--> qtail (qhead, qtail independent) ! 194: oqueue ->> circular queue of objects ! 195: */ ! 196: ! 197: /* qh_modes */ ! 198: #define EMODE 1 ! 199: #define WMODE 2 ! 200: #define ZMODE 3 ! 201: ! 202: class oqueue ! 203: { ! 204: friend qhead; ! 205: friend qtail; ! 206: int q_max; ! 207: int q_count; ! 208: object* q_ptr; ! 209: qhead* q_head; ! 210: qtail* q_tail; ! 211: ! 212: oqueue(int m) { q_max=m; q_count=0; q_head=0; q_tail=0; }; ! 213: ~oqueue() { (q_count)?task_error(E_QDEL,0):0; }; ! 214: void print(int); ! 215: }; ! 216: ! 217: class qhead : public object ! 218: { ! 219: friend qtail; ! 220: int qh_mode; /* EMODE,WMODE,ZMODE */ ! 221: oqueue* qh_queue; ! 222: public: ! 223: qhead(int = WMODE, int = 10000); ! 224: ~qhead(); ! 225: ! 226: object* get(); ! 227: int putback(object*); ! 228: ! 229: int rdcount() { return qh_queue->q_count; } ! 230: int rdmax() { return qh_queue->q_max; } ! 231: int rdmode() { return qh_mode; } ! 232: qtail* tail(); ! 233: ! 234: qhead* cut(); ! 235: void splice(qtail*); ! 236: ! 237: void setmode(int m) { qh_mode = m; }; ! 238: void setmax(int m) { qh_queue->q_max = m; }; ! 239: ! 240: void print(int); ! 241: }; ! 242: ! 243: class qtail : public object ! 244: { ! 245: friend qhead; ! 246: int qt_mode; ! 247: oqueue* qt_queue; ! 248: public: ! 249: qtail(int = WMODE, int = 10000); ! 250: ~qtail(); ! 251: ! 252: int put(object*); ! 253: ! 254: int rdspace() { return qt_queue->q_max - qt_queue->q_count; }; ! 255: int rdmax() { return qt_queue->q_max; }; ! 256: int rdmode() { return qt_mode; }; ! 257: ! 258: qtail* cut(); ! 259: void splice(qhead*); ! 260: ! 261: qhead* head(); ! 262: ! 263: void setmode(int m) { qt_mode = m; }; ! 264: void setmax(int m) { qt_queue->q_max = m; }; ! 265: ! 266: void print(int); ! 267: }; ! 268: ! 269: ! 270: struct histogram ! 271: /* ! 272: "nbin" bins covering the range [l:r[ uniformly ! 273: nbin*binsize == r-l ! 274: */ ! 275: { ! 276: int l, r; ! 277: int binsize; ! 278: int nbin; ! 279: int* h; ! 280: long sum; ! 281: long sqsum; ! 282: histogram(int=16, int=0, int=16); ! 283: ! 284: void add(int); ! 285: void print(); ! 286: }; ! 287: ! 288: /* the result of randint() is always >= 0 */ ! 289: ! 290: #define DRAW (randx = randx*1103515245 + 12345) ! 291: #define ABS(x) (x&0x7fffffff) ! 292: ! 293: #ifdef pdp11 ! 294: #define MASK(x) ((x>>16)&077777) ! 295: #define MAX 32768.0 ! 296: #endif ! 297: ! 298: #ifdef vax ! 299: #define MASK(x) ABS(x) ! 300: #define MAX 2147483648.0 ! 301: #endif ! 302: ! 303: class randint ! 304: /* uniform distribution in the interval [0,MAX] */ ! 305: { ! 306: long randx; ! 307: public: ! 308: randint(long s = 0) { randx=s; } ! 309: void seed(long s) { randx=s; } ! 310: int draw() { return MASK(DRAW); } ! 311: float fdraw() { return ABS(DRAW)/MAX; }; ! 312: }; ! 313: ! 314: class urand : public randint ! 315: /* uniform distribution in the interval [low,high] */ ! 316: { ! 317: public: ! 318: int low, high; ! 319: urand(int l, int h) { low=l; high=h; } ! 320: int draw() { return int(low + (high-low) * (0+randint::draw()/MAX)); } ! 321: }; ! 322: ! 323: extern double log(double); ! 324: ! 325: class erand : public randint ! 326: /* exponential distribution random number generator */ ! 327: { ! 328: public: ! 329: int mean; ! 330: erand(int m) { mean=m; }; ! 331: int draw() { return (int)(-mean * log( (double)(MAX-randint::draw()) ! 332: / MAX) + .5); }; ! 333: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.